Board logo

標題: [發問] 如何用VBA讓公式複制到工作表有資料的最後一列 [打印本頁]

作者: PJChen    時間: 2018-5-13 22:15     標題: 如何用VBA讓公式複制到工作表有資料的最後一列

想請問二種VBA寫法:
1.
A至C欄有公式
目前資料至第11列,資料會不斷增加
如何用VBA讓A~C欄自動把公式複制到工作表有資料的最後一列?

2.
E欄為等差數列
同1所述,如何讓數列自動複制到有資料的最後一列?

[attach]28712[/attach]
作者: iamaraymond    時間: 2018-5-13 22:50

回復 1# PJChen

請問一下針對第二個問題:
您是希望E欄一直持續加1,也就是488,489,490...
還是就483~487一直循環?
不是很懂複製的意思?
作者: PJChen    時間: 2018-5-13 23:22

回復 2# iamaraymond
數列的部份,不管那個數字是什麼,就從空白的上一個數字持續+1即可

例如:
現在的例子,有資料的部份到第11列,就針對A至C欄,自動偵測沒公式的地方開始複第到第11列,等蒫數列亦相同.
作者: iamaraymond    時間: 2018-5-13 23:54

回復 3# PJChen

不知道這樣符不符合您的需求
  1. Sub test()

  2. lastRow1 = Cells(Rows.Count, "F").End(xlUp).Row
  3. lastRow2 = Cells(Rows.Count, "A").End(xlUp).Row
  4. If lastRow2 <> lastRow1 Then
  5. Range("A" & lastRow2 & ":" & "C" & lastRow2).AutoFill Destination:=Range("A" & lastRow2 & ":C" & lastRow1)
  6. For i = lastRow2 To lastRow1 - 1
  7.     Cells(i + 1, "E") = Cells(i, "E") + 1
  8. Next
  9. End If
  10. End Sub
複製代碼

作者: PJChen    時間: 2018-5-14 22:05

回復 4# iamaraymond

首先感謝您幫忙寫這個程式
我在程式中加入一些其他功能,然後把程式與要執行自動複制公式的檔分開,也改了檔名(自動複制.xlsx,不過應該沒影響),測試了10多次一直出現問題(但不是您的程式問題),最終發現在檔案自動開啟時,執行程式沒問題,但若是檔案先打開了,就無法執行自動填寫公式,這樣又試了幾次仍然找不出原因,懇請幫忙看下問題出在哪?

另外我把填數列的功能暫停,也請教您,若是填數列的功能,想改為從1:1的下一列(也就是標題列的下一列)開始,自動從1填到有資料(以G欄為準)的最後一列,該如何修改?

[attach]28713[/attach]
作者: iamaraymond    時間: 2018-5-14 22:34

本帖最後由 iamaraymond 於 2018-5-14 22:38 編輯

回復 5# PJChen

想先確認一下您的問題:
您是說當執行VBA指令裡的程式時
1.若此時"自動複製"關著,則可以執行往下自動填滿
2.若此時"自動複製"開著,就沒有動作
所以您希望當"自動複製"開著時,也可以往下自動填滿?
不知道我的理解正不正確

您的第二個問題是希望"自動複製"的E2=1,E3=2,一直到目前最後一列E11嗎?
作者: PJChen    時間: 2018-5-14 23:15

回復 6# iamaraymond

當執行VBA指令裡的程式時
1.若此時"自動複製"關著,則可以執行往下自動填滿...Yes
2.若此時"自動複製"開著,就沒有動作...Yes (事先開啟,未透過VBA打開時)
所以您希望當"自動複製"開著時,也可以往下自動填滿? ...YES (我希望無論事先已開啟or經由VBA開啟,一按VBA執行鈕,它就能執行"自動複制公式"的功能

您的第二個問題是希望"自動複製"的E2=1,E3=2,一直到目前最後一列E11嗎?...YES
  1.     For Each Wb In Workbooks
  2.         If UCase(Wb.Name) = UCase("自動複制.xlsx") Then
  3.             Msg = True  '檔案已開啟
  4.             Exit For
  5.         End If
  6.     Next
  7.     '*****************************************
  8.     If Msg = True Then '檔案已開啟
  9.         Set Wb = Workbooks("自動複制.xlsx")
  10.     Else               '檔案尚未打開時
  11.         Set Wb = Workbooks.Open("W:\00_科毅\出貨文件連結\自動複制.xlsx")
  12.     End If
複製代碼

作者: iamaraymond    時間: 2018-5-14 23:27

回復 7# PJChen

這樣嗎?
  1. With Wb.Sheets("訂單出貨")
  2.    
  3.     lastRow1 = .Cells(Rows.Count, "G").End(xlUp).Row  '以G欄的資料列為基準
  4.     lastRow2 = .Cells(Rows.Count, "A").End(xlUp).Row '以A欄的資料列為基準
  5.     lastRow3 = .Cells(Rows.Count, "BL").End(xlUp).Row '以BL欄的資料列為基準
  6.     lastRow4 = .Cells(Rows.Count, "BP").End(xlUp).Row '以BP欄的資料列為基準
  7.    
  8.     If lastRow2 <> lastRow1 Then
  9.     .Range("A" & lastRow2 & ":" & "C" & lastRow2).AutoFill Destination:=.Range("A" & lastRow2 & ":C" & lastRow1)  '當A欄最後一列不等於G欄時,A:C自動往下填滿

  10.     For i = 2 To lastRow1
  11.     .Cells(i, "E") = i - 1
  12.     Next
  13.     End If
  14.    
  15.     If lastRow3 <> lastRow1 Then
  16.     .Range("BL" & lastRow3 & ":" & "BN" & lastRow3).AutoFill Destination:=.Range("BL" & lastRow3 & ":BN" & lastRow1)  '當BL欄最後一列不等於G欄時,自動往下填滿
  17.    
  18.     End If

  19.     If lastRow4 <> lastRow1 Then
  20.     .Range("BP" & lastRow4 & ":" & "CX" & lastRow4).AutoFill Destination:=.Range("BP" & lastRow4 & ":CX" & lastRow1)  '當BP欄最後一列不等於G欄時,自動往下填滿
  21.    
  22.     End If

  23. End With
複製代碼

作者: PJChen    時間: 2018-5-14 23:54

回復 8# iamaraymond

感謝...這樣完全正常了。
作者: iamaraymond    時間: 2018-5-15 00:01

回復 9# PJChen
其實只是幫您加個"."而已XD
用with的時候要使用"."才可以使用該物件
作者: PJChen    時間: 2018-5-15 19:38

回復 10# iamaraymond

一直不知道問題出在哪!謝謝您,幫忙解決.




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)