ด้านล่างนี้เป็นโค้ดที่ฉันคัดลอกค่าจากเซลล์ Q13 และวางลงในคอลัมน์ E จนกว่ารายการจะเสร็จสมบูรณ์ (Q13 จะได้รับการอัปเดตด้วยค่าใหม่ทุกครั้ง) ฉันมีเงื่อนไขที่บอกว่าถ้า Q13 อ่าน "45" ให้คัดลอกค่านั้นและวางลงในคอลัมน์ p ฉันรู้ว่านี่เป็นคำสั่ง if -then- else แต่ฉันได้รับข้อผิดพลาดในการคอมไพล์ที่แตกต่างกันสองสามอย่าง (บล็อกถ้าไม่มีจุดสิ้นสุด if และหากไม่มีการบล็อกถ้า) และตระหนักว่าเป็นไปได้มากว่าไวยากรณ์ของฉัน ถ้ามีใครมารีวิวเรื่องนี้ได้จะสุดยอดมาก
Sub Test()
Dim c As Range
Dim ws As Worksheet: Set ws = Sheet2
Dim range1 As Range: Set range1 = ws.Range("Q13")
Dim Cell As Range
For Each Cell In range1
If Cell.Value = "45" Then
NextRow = ws.Cells(ws.Rows.Count, "P").End(xlUp).Offset(1, 0).Row
Cell.Copy ws.Range("P" & NextRow)
Else
For Each c In Range("B2:B" & Range("B65536").End(xlUp).Row)
Dim R As Range
Set R = Worksheets("Sheet2").Cells(Rows.Count, "E").End(xlUp) 'last cell in Column E with data
If Len(R.Value) > 0 Then Set R = R.Offset(1)
R.Value = Worksheets("Sheet2").Range("Q13").Value
Exit For
End If
Next ws
End If
Next ws
เช่นws
ไม่มีการวนซ้ำ - person Nathan_Sav   schedule 12.11.2019Next
- person Brian M Stafford   schedule 12.11.2019ws
(หรืออะไรก็ตาม) ในNext ws
: แค่Next
ก็เพียงพอแล้ว - person Mathieu Guindon   schedule 12.11.2019Next ws
ไม่ควรโยนข้อผิดพลาดใช่ไหม for loop ที่เริ่มต้นคือFor each Cell
...หรือ VBA จะเพิกเฉยต่อสิ่งที่เกิดขึ้นหลังจากNext
จริง ๆ หรือไม่ (โดยทั่วไปฉันจะรวมตัวแปรNext
ไว้เสมอ เช่นNext ws / Next Cell
ดังนั้นฉันจึงสามารถเห็นได้ทันทีว่าฉันอยู่ในวงใด แต่ไม่เคยคิดจริงๆ ว่า VBA ใช้ข้อมูลนั้นจริงหรือไม่ - person BruceWayne   schedule 12.11.2019Next ws
เป็นข้อผิดพลาดทางไวยากรณ์เนื่องจากws
ไม่ใช่ตัวแปรวนซ้ำ ฉันไม่เคยระบุตัวแปรลูปในNext
เพราะหากตัวแปรลูปนั้นมีค่าใดๆ อยู่ที่นั่น แสดงว่าเนื้อความของลูปน่าจะทำหลายสิ่งมากเกินไปและควรปรับโครงสร้างใหม่เป็นขอบเขตขั้นตอนของมันเอง มีตัวแปรลูปเดี่ยวทางวากยสัมพันธ์เพียงตัวเดียวที่ถูกต้องตามกฎหมายทันทีหลังจากโทเค็นNext
และนั่นคือตัวแปรลูปสำหรับลูปที่ป้อนครั้งล่าสุด ไวยากรณ์Next foo
นี้มีไว้เพื่อสนับสนุนสิ่งที่น่ารังเกียจอย่างแท้จริงที่Next foo, bar
เป็นเท่านั้น - person Mathieu Guindon   schedule 12.11.2019Next foo, bar
จะเป็นเช่นไร? นั่นเป็นการก่อสร้างที่ถูกต้องใน VBA หรือไม่หากน่ารังเกียจ ... - person BruceWayne   schedule 12.11.2019For foo = 1 To 10
;For bar = 1 To 10
;Debug.Print foo, bar
;Next foo, bar
-- เชื่อหรือไม่ว่าถูกกฎหมาย! (thingsLearnedWhileWorkingOnRubberduck++;
) - person Mathieu Guindon   schedule 12.11.2019