檔案來了~~
https://drive.google.com/file/d/16xlFHu8PcdTLnYJQVGyZoWkG_YhxzpM5/view?usp=sharing
表單程式碼的內容:
Sub reset_kind() '依目前新的修改選擇,重新顯示歸建區別的值
Label4.Caption = "" '清除目前歸建區別的內容
For i = 1 To 8
'從起始設定中,取值,共8欄
Label4.Caption = Label4.Caption & Cells(36 + ComboBox2.ListIndex, ComboBox1.ListIndex + i) & "--"
Next i
Label4.Caption = Left(Label4.Caption, Len(Label4.Caption) - 2) '去掉最右邊多餘的--
End Sub
Private Sub ComboBox1_Change()
If ComboBox1.ListIndex > -1 And ComboBox2.ListIndex > -1 Then reset_kind '如果有重新下拉,就重新顯示歸建區別的值
End Sub
Private Sub ComboBox2_Change()
If ComboBox1.ListIndex > -1 And ComboBox2.ListIndex > -1 Then reset_kind '如果有重新下拉,就重新顯示歸建區別的值
End Sub
Private Sub CommandButton1_Click()
'將listbox1全部勾選
For i = 0 To ListBox1.ListCount - 1
ListBox1.Selected(i) = True
Next i
End Sub
Private Sub CommandButton2_Click()
'選取本係數表中,歸建區別的範圍
If OptionButton1.Value = True Then
post_c = 1 '要貼到B1的第幾欄開始(1=A,5=E)
'選取前4格
Range(Cells(36 + ComboBox2.ListIndex, ComboBox1.ListIndex + 1), Cells(36 + ComboBox2.ListIndex, ComboBox1.ListIndex + 4)).Select
ElseIf OptionButton2.Value = True Then
post_c = 5 '要貼到B1的第幾欄開始(1=A,5=E)
'選取後4格
Range(Cells(36 + ComboBox2.ListIndex, ComboBox1.ListIndex + 5), Cells(36 + ComboBox2.ListIndex, ComboBox1.ListIndex + 8)).Select
Else
post_c = 1 '要貼到B1的第幾欄開始(1=A,5=E)
'選取後4格
Range(Cells(36 + ComboBox2.ListIndex, ComboBox1.ListIndex + 1), Cells(36 + ComboBox2.ListIndex, ComboBox1.ListIndex + 8)).Select
End If
Selection.Copy '複製
'將勾選的Bn...目標做貼上的動作
do_sum = 0 '計算執行貼上的目標工作表數
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) = True Then
Sheets(ListBox1.List(i, 0)).Select '切換到勾選的Bn工作表
Cells(Val(ListBox1.List(i, 1)), post_c).Select '選取要貼上的第1個儲存格
ActiveSheet.Paste '執行貼上
do_sum = do_sum + 1
End If
Next i
Sheets(Label2.Caption).Select '切換回原先係數表
Range("A1").Select
'訊息回饋
If do_sum = 0 Then MsgBox "無勾選目標工作表,故未執行貼上動作。" Else MsgBox "完成貼上目標工作表數:" & do_sum
End Sub
Private Sub CommandButton3_Click()
'將listbox1全部做反向選擇
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) = True Then ListBox1.Selected(i) = False Else ListBox1.Selected(i) = True
Next i
End Sub
Private Sub CommandButton4_Click()
'將listbox1全部取消勾選
For i = 0 To ListBox1.ListCount - 1
ListBox1.Selected(i) = False
Next i
End Sub
Private Sub UserForm_Initialize()
'--------------各項起始參數設定-----------
Label2.Caption = ActiveSheet.Name '取得目前作用工作表名稱
'加上警告訊息
If Left(Label2.Caption, 2) <> "係數" Then MsgBox "注意,目前工作表並非是係數表,請確認!"
'設置[歸建區別起始位置修改]的選單
For i = 1 To 26
ComboBox1.AddItem Chr(64 + i) '顯示A~Z
Next i
ComboBox1.ListIndex = 5 '預設選取第 5+1 個字母,即 [F]
For i = 36 To 1000
ComboBox2.AddItem i '顯示可選列號,從36~1000
Next i
ComboBox2.ListIndex = 0 '預設選取第 0+1 個列號選擇,就是36
ListBox1.ColumnWidths = "60;60;35;35;35;35;35;35;35;35" '設定listbox1每欄的顯示寬度
ListBox1.ColumnCount = 10 '設定listbox1該有的欄數
'以下取得本係數表中,顯示的各目標工作表(B1....)的參照內容
c_f = 3 '顯示第一個B的欄,預設是C欄開始
r_f = 14 '顯示第一個B的列,預設是14列開始
Do
If Cells(r_f, c_f) = "" And Cells(r_f + 1, c_f) = "" Then Exit Do '如果有連續2列空列,就跳出迴圈
If Cells(r_f, c_f) <> "" Then '如果該列有設定資料,就顯示到listbox中
b_f = ListBox1.ListCount '取得listbox現有列數
ListBox1.AddItem Cells(r_f, c_f) '新增listbox一列,放入Bn該列的第一欄值(B工作表的名稱)
For i = 1 To 9 '抓取該列(Bn)第2欄開始的內容,預設還有9欄
ListBox1.List(b_f, i) = Cells(r_f, c_f + i)
Next i
ComboBox3.AddItem r_f '將Bn的真實列號寫入combobox3,後續用
End If
r_f = r_f + 1
Loop
OptionButton3.Value = True '預設模式為:8格全貼
'隱藏參照用的元件
ComboBox3.Visible = False
Label7.Visible = False
End Sub
沒有太多的優化、以及嚴謹的定義....這部分暫時先省略了....。程式碼盡量加上註解,方便樓主研究。
其實節省的部分不多,畢竟無法確切掌握樓主的詳細的作業需求~~這還有待樓主往後能力增強後,應該還有很大效率改善的空間~~
樓主加油囉~~希望你的工作時間真的能因此大幅減少~~多的時間就拿來研究VBA吧,哈。