--------------------------------------------------------------------------------
真抱歉,我把它做成表格,應該比較清楚了
A B C D E
1 物品 公司1 公司2 公司3 公司4
2 001 15 10
3 002 7 12 22
C D ... K
1 公司1 001 15
2 公司2 001 10
3 公司2 002 7
4 公司3 002 12
5 公司4 002 22
Sub zz()
Set a = Workbooks("檔案A.xls").Sheets(1)
Set b = Workbooks("檔案B.xls").Sheets(1)
lastrow = a.[A1].End(xlDown).Row
lastcol = a.[A1].End(xlToRight).Column
rb = 1
For c = 2 To lastcol
For r = 2 To lastrow
If a.Cells(r, c) <> "" Then
b.Cells(rb, 3) = a.Cells(1, c)
b.Cells(rb, 4) = a.Cells(r, 1)
b.Cells(rb, 11) = a.Cells(r, c)
rb = rb + 1
End If
Next r
Next c
End Sub
向板主檢舉 203.79.168.37 (?)
--------------------------------------------------------------------------------
BEFORE ASKING, YOU SHOULD RTFH, RTFM, STFW...
我倒還沒遇過 "Next 陳述式比它相對應的 For 陳述式先執行" 而發生錯誤的情形,
所以我一向只在 For...Next 後面加 counter ,以和 For Each...Next 陳述式有所區別而已,如同Help所說:除非遇到錯誤,否則加與不加都沒差。
如果要說加有什麼好處,大概就是不易出錯,而且如此例中使用多個 For ... Next 的巢狀迴圈時,較容易分辨哪個是哪個。
使程式碼較易於閱讀,是個好習慣。
把輔助說明有的東西拿來發教學文章,如果沒有值得一書的心得,沒什麼意思對吧?
忘了說 rb = rb + 1 的意思...
rb 是做為 B檔案列號的變數,一列一列接著往下填入資料。
A檔案已有 For ... Next 的計數變量做為欄列號,
B檔案的欄號是固定,而列號與 A檔不同,所以另設變數。
For…Next语句回圈的执行过程(工作原理):
先将回圈变量取为初始值,然后检验回圈变量的取值是否超出终值,若回圈变量没有超出终值,则执行一次回圈体语句,然后将回圈变量加上步长赋值给回圈变量本身,再与终值进行比较,直到回圈变量超出终值时,退出回圈,执行后面的语句。所谓超出终值是指:若步长为正值,则检验回圈变量是否大于终值;若步长为负值,则检验回圈变量的取值是否小于终值。
For…Next语句结束后会返回[回圈变量]的值,但它一定不等于[终值]:
Sub t()
Dim i
For i=1 to 10
Next
End sub
最后i是多少呢?不管是多少,它一定不是10:
Sub t1()
Dim i, j
For i = 1 To 10
j = j + 1
MsgBox "步长值为1,第" & j & "次回圈[回圈变量]的值:" & i
Next
MsgBox "回圈次数:" & j & Chr(13) & "最后[回圈变量]的值:" & i
End Sub
Sub t2()
Dim i, j
For i = 1 To 10 Step 1.6
j = j + 1
MsgBox "步长值为1.5,第" & j & "次回圈[回圈变量]的值:" & i
Next
MsgBox "回圈次数:" & j & Chr(13) & "最后[回圈变量]的值:" & i
End Sub
在回圈体中也可以改变[回圈变量]的值,但这会使程序代码的阅读和调试变得非常困难,一般不提倡这样做:
Sub t3()
Dim i, j
For i = 1 To 10
i = i + 1
j = j + 1
MsgBox "步长值为1.5,第" & j & "次回圈[回圈变量]的值:" & i
Next
MsgBox "回圈次数:" & j & Chr(13) & "最后[回圈变量]的值:" & i
End Sub
For Each…Next语句结束后,不会返回[回圈变量],这与For…Next语句不一样:
Sub t4()
Dim c
For Each c In Array(1, 2, "aa")
Next
MsgBox TypeName(c)
End Sub
Sub t5()
Dim r As Range
For Each r In [a1:a4]
Next
MsgBox TypeName(r)
End Sub
For…Next語句回圈的執行過程(工作原理):
先將回圈變數取為初始值,然後檢驗回圈變數的取值是否超出終值,若回圈變數沒有超出終值,則執行一次回圈體語句,然後將回圈變數加上步長賦值給回圈變數本身,再與終值進行比較,直到回圈變數超出終值時,退出回圈,執行後面的語句。所謂超出終值是指:若步長為正值,則檢驗回圈變數是否大於終值;若步長為負值,則檢驗回圈變數的取值是否小於終值。
For…Next語句結束後會返回[回圈變數]的值,但它一定不等於[終值]:
Sub t()
Dim i
For i=1 to 10
Next
End sub
最後i是多少呢?不管是多少,它一定不是10:
Sub t1()
Dim i, j
For i = 1 To 10
j = j + 1
MsgBox "步長值為1,第" & j & "次回圈[回圈變數]的值:" & i
Next
MsgBox "回圈次數:" & j & Chr(13) & "最後[回圈變數]的值:" & i
End Sub
Sub t2()
Dim i, j
For i = 1 To 10 Step 1.6
j = j + 1
MsgBox "步長值為1.5,第" & j & "次回圈[回圈變數]的值:" & i
Next
MsgBox "回圈次數:" & j & Chr(13) & "最後[回圈變數]的值:" & i
End Sub
在回圈體中也可以改變[回圈變數]的值,但這會使程式碼的閱讀和調試變得非常困難,一般不提倡這樣做:
Sub t3()
Dim i, j
For i = 1 To 10
i = i + 1
j = j + 1
MsgBox "步長值為1.5,第" & j & "次回圈[回圈變數]的值:" & i
Next
MsgBox "回圈次數:" & j & Chr(13) & "最後[回圈變數]的值:" & i
End Sub
For Each…Next語句結束後,不會返回[回圈變數],這與For…Next語句不一樣:
Sub t4()
Dim c
For Each c In Array(1, 2, "aa")
Next
MsgBox TypeName(c)
End Sub
Sub t5()
Dim r As Range
For Each r In [a1:a4]
Next
MsgBox TypeName(r)
End Sub