พิมพ์อาร์เรย์ VBA ลงในเซลล์ Excel

ฉันกำลังพยายามพิมพ์อาร์เรย์ที่สร้าง VBA ลงในเซลล์ของสเปรดชีต Excel ค่าการซึมผ่านและน้ำไหลบ่าได้รับข้อผิดพลาด "ตัวห้อยอยู่นอกช่วง" อย่างต่อเนื่อง ฉันกำลังสร้างอาร์เรย์ท่ออย่างถูกต้องหรือไม่ ฉันได้รวมฟังก์ชันย่อยการคำนวณและการพิมพ์เข้าด้วยกันแล้ว

 NumMonth = 12
 Dim col As Long
 Dim rw As Long
 rw = 4
 col = 13

 Range(Cells(rw, col), Cells(rw + NumMonth - 1, col)).Value = _
    Application.Transpose(WC)

Range(Cells(rw, col + 1), Cells(rw + NumMonth - 1, col + 1)).Value = _
    Application.Transpose(Runoff)

   Range(Cells(rw, col + 2), Cells(rw + NumMonth - 1, col + 2)).Value = _
     Application.Transpose(Percolation)
   End Sub

person user1977802    schedule 22.02.2013    source แหล่งที่มา
comment
คุณช่วยกรุณาให้ข้อมูลตัวอย่างบางส่วนได้ไหม?   -  person glh    schedule 23.02.2013
comment
เดือน:1-12, อ้างอิง Et:0.4, ปริมาณน้ำฝน: 0.07, fc:0.3, pwp=0.1, WC(i)=0.15 ฉันไม่รู้วิธีที่ดีกว่าในการให้ข้อมูล??   -  person user1977802    schedule 23.02.2013


คำตอบ (2)


Precip และ RefET ของคุณมีค่าเท่ากันเสมอ เครื่องหมายนี้จะเท่ากันหรือไม่

Precip(i) = Cells(4 + i, 2).Value
RefET(i)  = Cells(4 + i, 2).Value

นอกจากนี้ เมื่อคุณตั้งค่าอาร์เรย์ Runoff และ Percolation อาร์เรย์เหล่านั้นจะไม่ถูกตั้งค่าเป็นค่าใดๆ หากไม่ตรงตามคำสั่ง if ของคุณ (ด้านล่าง) และฉันสามารถตอบสนองได้ด้วยข้อมูลที่ให้ไว้:

If (fc - WC(j - 1) + RefET(i) * dz < Precip(i) * dz) then

ฉันจะเพิ่มบางสิ่งเพื่อให้แน่ใจว่ามีค่าอยู่ในนั้นเสมอ:

If (fc - WC(j - 1) + RefET(i) * dz < Precip(i) * dz) Then
    Runoff(i) = (Precip(i) - (fc - WC(j - 1) + RefET(i)) * dz) * 0.5
    Percolation(i) = (Precip(i) - (fc - WC(i - 1) + RefET(i)) * dz) * 0.5
    WC(j) = fc
Else
    Runoff(i) = 0
    Percolation(i) = 0
    WC(j) = WC(j - 1) + Precip(i) - RefET(i) / dz
End If

เมื่อทำสิ่งนี้ ฉันพบว่าคุณไม่มีตัวแปร ReDim และ Percolation คุณจะต้องเพิ่มสิ่งต่อไปนี้ใน WaterBalanceRead ย่อยของคุณ

ReDim Runoff(1 To NumMonth + 1)
ReDim Percolation(1 To NumMonth + 1)
person glh    schedule 23.02.2013
comment
ขอขอบคุณที่ตรวจพบข้อผิดพลาดในการอ่านข้อมูล! ถ้าฉันใช้ข้อมูลที่ให้มา อาร์เรย์ของฉันจะยังไม่ถูกตั้งค่าใช่ไหม - person user1977802; 23.02.2013
comment
@ user1977802 - บรรทัดสุดท้ายแก้ไขของฉัน! - person glh; 23.02.2013

application.transpose ของมันแทน worksheetfunction

  Range(Cells(rw, col), Cells(rw + NumMonth - 1, col)).Value = _
      application.Transpose(WC)

นี่คือการทดสอบย่อย

Sub test()
Dim myarray As Variant

'this is a 1 row 5 column Array
myarray = Array(1, 2, 3, 4, 5)

'This will fail because the source and destination are different shapes
Range("A1:A5").Value = myarray


'If you want to enter that array into a 1 column 5 row range like A1:A5

Range("A1:A5").Value = Application.Transpose(myarray)
End Sub

คุณจะได้รับข้อผิดพลาดหากคุณเรียกอาร์เรย์ที่คุณสร้างไว้ในส่วนย่อยอื่น สาเหตุนี้สามารถดูได้ในหน้าต่าง Locals เมื่อคุณอ่านโค้ดของคุณ เมื่อคุณเรียกใช้ส่วนย่อยที่สร้างอาร์เรย์ของคุณ มันจะแสดงในภาษาท้องถิ่น เมื่อส่วนย่อยสิ้นสุดมันจะหายไป ซึ่งหมายความว่ามันจะไม่ถูกเก็บไว้ในหน่วยความจำอีกต่อไป หากต้องการอ้างถึงตัวแปรหรืออาร์เรย์จากส่วนย่อยอื่น คุณต้องส่งผ่านมัน

การส่งผ่านอาร์เรย์หรือตัวแปรสามารถทำได้หลายวิธี ต่อไปนี้เป็นลิงก์บางส่วน ที่นี่ และที่นี่

person scott    schedule 22.02.2013
comment
ไม่ แอปพลิเคชัน Tanspose ไม่ทำงาน เป็นอาร์เรย์ที่สร้างขึ้นใน VBA - person user1977802; 23.02.2013
comment
ฉันคิดว่าฉันได้ทำการปรับเปลี่ยนที่ถูกต้องตามที่คุณแนะนำให้ฉันทราบ (ดูการแก้ไขในโพสต์ต้นฉบับ) แต่ก็ยังใช้งานไม่ได้ ฉันทำสิ่งนี้ถูกต้องหรือไม่? - person user1977802; 23.02.2013
comment
มีข้อผิดพลาดหรือไม่? คุณอาจประสบปัญหาในการใช้ช่วงที่ไม่ได้กำหนดให้กับชีต.. เช่น sheets("sheet1").range("A1:A5").value = application.transpose(wc) - person scott; 23.02.2013
comment
ใช่ มันเป็นข้อผิดพลาดเดียวกับที่ฉันได้รับก่อนหน้านี้ - ขั้นตอนไม่ถูกต้องหรือข้อผิดพลาดในการโทร ถ้าฉันเปลี่ยนเป็น Sheets(sheet1).Range(M5:M22).Value = Application.Transpose(WC) ฉันยังคงได้รับข้อผิดพลาดเดิม - person user1977802; 23.02.2013
comment
โอเค ดูเหมือนว่าคุณกำลังอ้างถึงอาร์เรย์ที่คุณสร้างไว้ในส่วนย่อยอื่น ซึ่งจะทำให้เกิดข้อผิดพลาด ฉันได้รับข้อผิดพลาดในการคอมไพล์ คุณเปิดใช้งานตัวเลือกอย่างชัดเจนหรือไม่? - person scott; 23.02.2013
comment
ใช่. ฉันเปิดใช้งานตัวเลือกอย่างชัดเจน ใช่ อาร์เรย์ของฉันถูกสร้างขึ้นในส่วนย่อยอื่น ฉันได้สร้างส่วนย่อยเพื่อพิมพ์เท่านั้น - person user1977802; 23.02.2013
comment
@user1977802. หากต้องการส่งผ่านอาร์เรย์ WC ไปยังส่วนย่อยอื่น คุณควรตรวจสอบให้แน่ใจว่าตัวแปรนี้ถูกกำหนดให้เป็นโกลบอลภายนอกส่วนย่อยทั้งหมด นี่จะบันทึกการอัปเดตของคุณไปยังตัวแปร - person glh; 23.02.2013
comment
ฉันได้ประกาศให้เป็นสากล ฉันได้รวมและแก้ไขโค้ดทั้งหมดของฉันด้านบนแล้ว - person user1977802; 23.02.2013
comment
ฉันได้รวมฟังก์ชันย่อยการคำนวณและการพิมพ์เข้าด้วยกันแล้ว ดูเหมือนว่าทุกอย่างจะพิมพ์ได้อย่างถูกต้อง ยกเว้น Percolation() และ Runoff() ฉันสร้างอาร์เรย์เหล่านั้นถูกต้องหรือไม่ - person user1977802; 23.02.2013