วนซ้ำแต่ละแถวของช่วงใน Excel


117

นี่เป็นหนึ่งในสิ่งที่ฉันแน่ใจว่ามีฟังก์ชั่นในตัว (และฉันอาจจะเคยบอกไปแล้วในอดีต) แต่ฉันเกาหัวเพื่อจำมัน

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


คำตอบ:




8

เพิ่งสะดุดกับสิ่งนี้และคิดว่าฉันจะแนะนำวิธีแก้ปัญหาของฉัน โดยทั่วไปฉันชอบใช้ฟังก์ชันที่สร้างขึ้นในการกำหนดช่วงให้กับอาร์เรย์แบบหลายมิติ (ฉันเดาว่าเป็นโปรแกรมเมอร์ JS ในตัวฉันด้วย)

ฉันมักจะเขียนโค้ดเช่นนี้:

Sub arrayBuilder()

myarray = Range("A1:D4")

'unlike most VBA Arrays, this array doesn't need to be declared and will be automatically dimensioned

For i = 1 To UBound(myarray)

    For j = 1 To UBound(myarray, 2)

    Debug.Print (myarray(i, j))

    Next j

Next i

End Sub

การกำหนดช่วงให้กับตัวแปรเป็นวิธีที่มีประสิทธิภาพมากในการจัดการข้อมูลใน VBA


ฉันชอบวิธีนี้ที่สุด!
athos

2
สองข้อได้เปรียบหลักจะชอบมัน: 1) วิธีการอาร์เรย์เป็นเสมอได้เร็วขึ้นกว่าบ่วงผ่านช่วง 2) มันง่ายและคุณสามารถใช้งานได้ในทั้งสองทิศทางRange("A1:D4") = myarrayและเขียนกลับอาร์เรย์หลังจากคำนวณบางอย่าง: หมายเหตุ: Dim myarrayเป็นตัวแปร; ใส่ใจกับความจริงที่ว่ามันเป็น1basedอาร์เรย์ 2dim โดยค่าเริ่มต้น
TM

7

ในลูปฉันมักจะใช้Cellsคลาสโดยใช้วิธีการอ้างอิง R1C1 ดังนี้:

Cells(rr, col).Formula = ...

สิ่งนี้ช่วยให้ฉันวนซ้ำช่วงของเซลล์ได้อย่างรวดเร็วและง่ายดาย:

Dim r As Long
Dim c As Long

c = GetTargetColumn() ' Or you could just set this manually, like: c = 1

With Sheet1 ' <-- You should always qualify a range with a sheet!

    For r = 1 To 10 ' Or 1 To (Ubound(MyListOfStuff) + 1)

        ' Here we're looping over all the cells in rows 1 to 10, in Column "c"
        .Cells(r, c).Value = MyListOfStuff(r)

        '---- or ----

        '...to easily copy from one place to another (even with an offset of rows and columns)
        .Cells(r, c).Value = Sheet2.Cells(r + 3, 17).Value


    Next r

End With
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.