Excel VBA 多個工作表複製到一個工作表中的問題

2009-11-25 8:51 am
老師要求我們在userform中建立多個checkbox,讓使用者可以自由點選想要的工作表進行點選,透過VBA的方式將使用者選中的工作表,複製到一個工作表中進行工作。我遇到的狀況是當使用者只選中一個工作表進行複製時是可以的,但是使用者選擇多個工作表進行複製時,只會顯示最後一個複製過去的工作表。

1.要如何順利的將多個工作表複製到一個工作表中,而不會被覆蓋
2.使用者選擇好的checkbox已經順利製成新的工作表,要如何將userform關閉,並且導向到新的工作表進行作業

如下是我寫的程式語言

Private Sub CommandButton1_Click()
check1
check2
check3
End Sub

Sub check1()
If CheckBox1.Value = True Then
For a1 = 1 To 100
Sheets("Total").Range("A" & a1) = Sheets("Sheet3").Range("A" & a1)
Sheets("Total").Range("B" & a1) = Sheets("Sheet3").Range("B" & a1)
Sheets("Total").Range("C" & a1) = Sheets("Sheet3").Range("C" & a1)
Next a1
Else
For a1 = 1 To 100
Sheets("Total").Range("A" & a2) = ""
Sheets("Total").Range("B" & a2) = ""
Sheets("Total").Range("C" & a2) = ""
Next a1
End If
End Sub
Sub check2()
If CheckBox2.Value = True Then
For b1 = 1 To 100
Sheets("Total").Range("A" & b1) = Sheets("Sheet4").Range("A" & b1)
Sheets("Total").Range("B" & b1) = Sheets("Sheet4").Range("B" & b1)
Sheets("Total").Range("C" & b1) = Sheets("Sheet4").Range("C" & b1)
Next b1
Else
For b1 = 1 To 100
Sheets("Total").Range("A" & b2) = ""
Sheets("Total").Range("B" & b2) = ""
Sheets("Total").Range("C" & b2) = ""
Next b1
End If
End Sub
Sub check3()
If CheckBox3.Value = True Then
For c1 = 1 To 100
Sheets("Total").Range("A" & c1) = Sheets("Sheet5").Range("A" & c1)
Sheets("Total").Range("B" & c1) = Sheets("Sheet5").Range("B" & c1)
Sheets("Total").Range("C" & c1) = Sheets("Sheet5").Range("C" & c1)
Next c1
Else
For c2 = 1 To 100
Sheets("Total").Range("A" & c2) = ""
Sheets("Total").Range("B" & c2) = ""
Sheets("Total").Range("C" & c2) = ""
Next c2
End If
End Sub

程式很長,所以我用三個checkbox舉例,當每個check被點選時,就會啟動該有的動作,請大家幫幫我的忙,謝謝。

回答 (4)

2009-11-25 1:50 pm
✔ 最佳答案
這個程式碼BUG有2個
第一
不管你check有幾個
全部覆蓋A1:C100區塊不變
第二
既然使用者沒選擇跳過就好
不用在清空
爾且變數也錯誤
迴圈變數a1指定a2?

Q1
以check1為例
建議改為如下
Sub check1 ()
'沒選擇離開
If Not CheckBox1.Value Then Exit Sub
'找到目標區最後格
TotalR = Sheets("Total").Cells(Rows.Count, 1).End(xlUp).Row + 1
'貼上資料
Sheets("Total").Range("A" & TotalR & ":C" & TotalR + 99) = Sheets("Sheet3").Range("A1:C100").Value
End Sub

Q2
在Private Sub CommandButton1_Click()的最後
用Unload
Unload userform的name

2009-11-25 05:56:18 補充:
找到目標區最後格
這個方法有一個先決條件
就是A100要有資料
要是A100沒資料又B100及D100有
下一筆會蓋過去A列的尾格後的資料
保險的方法是3個(ABC列)都找取最大值
參考: 自己多年的煎熬
2009-11-25 6:46 pm
再給你一各方向。

For i = 1 To 3
MsgBox Controls("CheckBox" & i).Value
Next
2009-11-25 3:40 pm
簡化一下:

For a1 = 1 To 100
 Sheets("Total").Range("A" & a1) = Sheets("Sheet3").Range("A" & a1)
 She..........& a1)
 She........& a1)
Next a1

簡化為:
Sheets("Total").[A1:C100].Value = Sheets("Sheet3").[A1:C100].Value
(一句就攪定)

2009-11-25 07:42:06 補充:
For a1 = 1 To 100
 Sheets("Total").Range("A" & a2) = ""
 Sheets("Total").Range("B" & a2) = ""
 Sheets("Total").Range("C" & a2) = ""
Next a1

簡化為:
Sheets("Total").[A1:C100].ClearContents
(一句就攪定)

2009-11-25 07:54:49 補充:
整個 sub 簡化

Sub check1()
If Chec...
 For a1 = 1 To 100
  She...
  She...
  She...
 Next
Else
 For a1 =..
  She...
  She...
  She...
 Next
End If
End Sub

一行攪定。
Sub check1()
Sheets("Total").[A1:C100].Value = IIf(CheckBox1.Value = True, Sheets("Sheet3").[A1:C100].Value, "")
End Sub
2009-11-25 1:11 pm
老是寫入 A1:C100 同一個區塊,當然會覆蓋,
後令壓前令,最後結果當然只顯示最後一次的動作。

另外,
用『肉眼』就可以檢查出程式有寫錯的地方,
For a1 = 1 To 100
Sheets("Total").Range("A" & a2) = ""
......
Next a1
a2 這個變數應該是敲錯了。


收錄日期: 2021-04-27 17:10:32
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20091125000016KK00437

檢視 Wayback Machine 備份