EXCEL VBA 參照值複製貼上指令 求救高手大大幫忙

有設置一個針對各個活頁簿做一個"整體集中觀察" 我也嘗試過全部塞在一個活頁簿 但是會超級卡.......所以各別項目有分開


呃,慢,所以樓主真正在係數表中,輸入的B1、B2......,並不是「工作表名稱」,而是[活頁簿+工作表]?...也就是說,要貼上的目標位置,是在別的活頁簿中?........

那要執行貼上前,樓主已經把B1、B2.....所在的活頁簿檔案(甚至可能有好幾個檔案?)事先開啟了嗎?

~~~以上得確認清楚,這樣語法才不會有問題。(不然就要多加檢查的程式碼....)

~~當然,若樓主覺得,只需要能做到同一檔案內的係數表+目標B...表的貼上,之後您能自己舉一反三改成跨檔案.....呃,那也OK啦。

還是那句話,看樓主囉。
Der,misser1
突然想到,樓主,您的真實係數表......該不會也是跨檔案存在吧???
Der,misser1
EDILUO
只有"觀測"我是跨檔案集中處裡 所以與我們討論得不相符 也無衝突
EDILUO
只需要能做到同一檔案內的係數表+目標B...表的貼上 這樣就可以了
收到樓主回覆囉,了解。

現在人在外面(用手機看文)
等下午或晚上就來動手.....沒意外的話,不會太久。

當然,這段時間樓主也可以看看,其他大大是否有提供新的idea,或做法參考。
Der,misser1
EDILUO
好的 感謝大大
報告樓主,程式應該完成了(目前有想到的)~~先post一下圖片給您看看:


觸發模式:將呼叫表單的巨集連結到鍵盤快速鍵(暫設:CTRL+SHIFT+I,後續樓主再自己修改成其他快速鍵,或自己改成按鈕觸發亦可)

大概操作流程:(在已經完成係數表內各項設定後......)
1.先選擇要執行的「係數表」
2.按下快速鍵(Ctrl+Shift+I),叫出表單。(若目前作用工作表不是「係數」開頭,會有提醒訊息....)
3.挑(勾)選要執行貼上的目標工作表
4.選擇模式(預設是全8格都貼,也可改前四,或後四)
5.按下貼上按鈕....一次搞定。

~~程式碼會盡量加入註解說明(處理中),方便樓主自行修改程式參數,或作其他運用~~應該晚點就可以把完成的檔案+程式碼傳上來,給樓主下載囉。(不會太久....)
Der,misser1
misser
2.綠底起始位置(F36),可以在表單執行時做下拉臨時切換,當然,樓主之後有確認新的固定位置的話,也可以修改表單預設值,省去開啟表單後還得下拉切換的動作。
EDILUO
感謝大大的費心 感恩
檔案來了~~
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吧,哈。
Der,misser1
EDILUO
研究了整晚 到剛剛 感謝大大 之前我一直搞不清楚的地方 在大大的範本中找到了答案 我完善出更快更理想的方式了 再次感謝您
misser
太讚了~~能夠自己改良成更貼近自己所需,效率才能發揮出來~~樓主加油!
樓主這幾天好好適應,並完善一下您自己改好的程式,妥善運用後,請稍微評估一下:改進前要花的2小時左右作業,而使用VBA後,可以濃縮到多短的時間?(節省多少時間).............給大家參考看看.....;也可讓大家知道:VBA的好處(使用得當的話)囉。

當然,如果樓主對程式還有疑問,也歡迎再提出來討論喔.....如果我沒上來看回應,或是超出我能力的.....,版上還有好幾位大大高手可以指點(如果他們有空的話),不用擔心。
Der,misser1
EDILUO
在前往目標的道路上 很幸運能遇到高手領路 不然 真的會走了很多冤枉路。打從心底感激您的不厭其煩且良苦用心的指導
misser
樓主您客氣了~~很高興能幫上忙啦。
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!