Board logo

標題: [發問] 請問前輩們 如何讓VBA 依據欄位裡的名稱去搜索到同名稱的工作表 [打印本頁]

作者: 順勢而為    時間: 2015-10-2 22:22     標題: 請問前輩們 如何讓VBA 依據欄位裡的名稱去搜索到同名稱的工作表

請問前輩們 如何讓VBA 依據欄位裡的名稱去搜索到同名稱的工作表
我做了一個銷貨系統  在"銷貨單"工作表上完成填寫後 按下指定的巨集
就會自動導入"銷貨清單"中
問題來了 因為客戶產品都不相同 所以須要把各客戶的銷貨清單分開
例如分成銷貨清單A為"A公司"工作表名稱和銷貨清單B為"B公司"工作表名稱
在A1欄位 設置了資料驗證的清單 可供選擇A公司、B公司
如何讓VBA 依據A1欄位的名稱 去搜尋到和A1欄位同名稱的工作表呢??
指令該如寫呢??
拜託前輩們指導指導我 非常感謝
作者: lpk187    時間: 2015-10-2 23:29

本帖最後由 lpk187 於 2015-10-2 23:30 編輯

回復 1# 順勢而為

可以的話,最好上傳檔上來,比較可以得到較正確的答案
不然的話剛不久向准大學的語法,套進去你的程式也行
       SHN =Range("A1") '讀取A1儲存格的值,(A1欄位同名稱的工作表)
      On Error Resume Next'表示當一個執行階段錯誤產生時,程式控制立刻到發生錯誤陳述式接下去的陳述式
     Set xS = Sheets(SHN) '設定 xS 為尋找的工作表 如果找不到會產生錯誤,所以要有上一句和下一句
     On Error GoTo 0 '停止現在程序�堨籉韝w啟動的錯誤處理程式
然後後面
With xS      'xS=Sheets("A公司")
      ...  
      ...
End With
以上僅供參考
作者: 順勢而為    時間: 2015-10-3 00:04

回復 2# lpk187


    謝謝前輩願意指導
以傳上附件 只是A1欄位變成在O14  使用的巨集是"導入"  拜託前輩幫幫我 阿為由衷感謝
作者: lpk187    時間: 2015-10-3 01:10

回復 3# 順勢而為

考慮你不能下載檔案,所以只PO上程式碼,請自行換換置
原來的程式,大部份刪除掉了,嗯!太長了!陣列如此使用,會累死人的,所以我把它改掉了
  1. Sub 導入()

  2. With Sheets("銷貨單")
  3.     If .[B12] = "" Then MsgBox "請輸入資料後再按按鈕 ": Exit Sub
  4.     shN = .[O14]
  5.     Ro = .[B27].End(xlUp).Row
  6.     arr = .Range("C12:I" & Ro)
  7.     日期 = .[h7]
  8. End With
  9. On Error Resume Next '表示當一個執行階段錯誤產生時,程式控制立刻到發生錯誤陳述式接下去的陳述式
  10. Set xS = Sheets(shN) '設定 xS 為尋找的工作表 如果找不到會產生錯誤,所以要有上一句和下一句
  11. On Error GoTo 0 '停止現在程序�堨籉韝w啟動的錯誤處理程式
  12. With xS
  13.     xSro = .Cells(Rows.Count, 1).End(xlUp).Row + 1
  14.     .Cells(xSro, "B").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  15.     .Range("A" & xSro & ":A" & xSro + UBound(arr, 1) - 1) = 日期
  16. End With
  17. Sheets("銷貨單").Select
  18. Range("B12:B26,D12:D26,H7:H8,H5").ClearContents
  19. Range("C4") = "S" & Format(Right(Range("C4"), 4) + 1, "0000")

  20. End Sub
複製代碼

作者: 順勢而為    時間: 2015-10-3 08:31

回復 4# lpk187

前輩真的是太感謝您了 ,一早醒來都感動到快流眼淚了。
我知道我那樣寫是笨蛋的方式,所以才不敢拿上來傳。
我是這1~2個月才自己從網路影片學習的超級門外漢
真的是幫了我好大的忙阿!!謝謝~萬分感謝您
作者: 准提部林    時間: 2015-10-3 11:17

回復 2# lpk187

'↓由儲存格來指定工作表〔名稱〕
SHN =Range("A1")

'↓〔忽略〕程式錯誤,〔繼續〕往下執行後面的指令
On Error Resume Next 
 
'↓設定 xS 給〔指定工作表〕,如果該工作表不存在,會產生〔錯誤並中斷〕在這一行,
Set xS = Sheets(SHN)  '因為有上一句,程式不中斷而往下執行

'↓〔恢復〕程式錯誤處理,亦即 On Error Resume Next 到這行以後就〔失效〕,
' 其後程式若有錯誤,一樣會產生〔中斷〕,不然下方程式有錯誤就無法發現!
On Error GoTo 0

'↓所以,還是要加這行以〔提醒〕使用者,並〔跳離〕程式
If xS Is Nothing Then MsgBox "工作表不存在": Exit Sub  

'↓上方都沒問題,才會執行以下的程式碼,以避免無法預知的錯誤,造成資料錯誤
With xS      'xS=Sheets("A公司")
      ...  
End With
作者: lpk187    時間: 2015-10-3 11:35

回復 6# 准提部林

對吼!忘記加了,感謝准大提醒!謝謝
作者: 順勢而為    時間: 2015-10-3 13:57

回復 6# 准提部林

准提部林版大: 謝謝您的寶貴提醒 ,的確有這一點小小的狀況 。
但是版大 If xS Is Nothing Then MsgBox "工作表不存在": Exit Sub
這行貼上去後 我去做一個沒有工作表的執行
指令只跑到   If xS Is Nothing Then 就出現偵錯了
而不會繼續跑 MsgBox "工作表不存在": Exit Sub 這段錯誤提醒
請問我是哪個部分錯了??
  1. Sub 導入()
  2. Application.ScreenUpdating = False
  3. With Sheets("銷貨單")

  4. If .[B12] = "" Then MsgBox "請輸入資料後再按按鈕 ": Exit Sub
  5.     shN = .[O14]
  6.     Ro = .[B27].End(xlUp).Row
  7.     arr = .Range("C12:I" & Ro)
  8.     日期 = .[h7]
  9. End With
  10. On Error Resume Next '表示當一個執行階段錯誤產生時,程式控制立刻到發生錯誤陳述式接下去的陳述式
  11. Set xS = Sheets(shN) '設定 xS 為尋找的工作表 如果找不到會產生錯誤,所以要有上一句和下一句
  12. On Error GoTo 0 '停止現在程序�堨籉韝w啟動的錯誤處理程式

  13. If xS Is Nothing Then MsgBox "工作表不存在": Exit Sub

  14. With xS
  15.     xSro = .Cells(Rows.Count, 1).End(xlUp).Row + 1
  16.     .Cells(xSro, "B").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  17.     .Range("A" & xSro & ":A" & xSro + UBound(arr, 1) - 1) = 日期
  18. End With
  19. Sheets("銷貨單").Select
  20. Range("B12:B26,D12:D26,H7:H8,H5").ClearContents
  21. Range("C4") = "S" & Format(Right(Range("C4"), 4) + 1, "0000")
  22. Range("O14").Select
  23. Application.ScreenUpdating = True
  24. End Sub
複製代碼

作者: 順勢而為    時間: 2015-10-3 13:58

回復 7# lpk187

真的很感謝您~
作者: lpk187    時間: 2015-10-3 16:53

回復 8# 順勢而為

你把If xS Is Nothing Then MsgBox "工作表不存在": Exit Sub把這列放到
On Error GoTo 0 上面看看
作者: 准提部林    時間: 2015-10-3 17:22

回復 8# 順勢而為


Sub 導入()
Dim xS As Worksheet 

寫VBA請養成〔變數〕宣告!

進VBE說明檔,了解一下〔區域變數〕〔模組變數〕〔全域變數〕的宣告方式及功用,
對以後寫複雜程式絕對有用∼∼
作者: 順勢而為    時間: 2015-10-4 02:44

回復 10# lpk187
果然跟前輩說的一樣 換到上一行就正確了:victory:
作者: 順勢而為    時間: 2015-10-4 02:45

回復 11# 准提部林

謝謝版大 我會去看的 感謝版大
作者: 順勢而為    時間: 2015-10-5 12:02

回復 2# lpk187
前輩 不好意思 我不能私訊你 所以在這裡和你聯絡
關於前輩提的複雜性 我自己有意識到 但我不是學這出身的
所以只能硬著頭皮試看看
至於年度問題 我是打算用另存檔案的方式來做區隔
例如104年12月結束後 我將檔案另存成105年度 然後錄製一個年度復歸的按鈕
將各公司的銷貨清單刪除成空白 再重新開始105年度
這樣可行嗎??
不知是否 可和前輩私下聯絡 想多知道 前輩說的資料庫的方式 是怎麼樣的一個系統
謝謝前輩!!
作者: 順勢而為    時間: 2015-10-5 12:12

回復 2# lpk187
忘了和前輩說 你所看到的1~12月份的格式 就是之前的人留下來的格式
但是 是一間客戶 一個EXCEL檔 但我就是不想每次都要開一堆檔案 才會想把它整合成一個的
客戶雖然不少間 但實際有1~12月分都有叫貨紀錄的 約莫10間左右
請前輩多多指教




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