一個關於Excel自動抓取資料填入對應儲存格問題

版上高手們,小弟又有一個關於Excel自動抓取資料填入對應儲存格的問題來請教大家,我現在製作了一個用來記錄統計的Excel表格如下表(簡略):
出貨日期 出貨單號 客戶代碼 地區 客戶名稱 部門 運送方式
2016/4/2 20160402001 20003 基隆 基隆長庚 病理科 新竹貨運
2016/4/3 20160403001 20005 基隆 部立基隆 檢驗科 新竹貨運
2016/4/3 20160403002 21002 台北 內湖三總 檢驗科 宅急便
2016/4/5 20160405001 21006 台北 仁愛醫院 檢驗科 新竹貨運
2016/4/5 20160405002 21005 台北 台北國泰 檢驗科 宅急便
2016/4/5 20160405003 20003 基隆 基隆長庚 病理科 新竹貨運


我在另一個工作表製作了一個可以被抓取的資料表如下圖(簡略):
代碼 地區 客戶名稱 部門
20001 基隆 基隆長庚 檢驗科
20002 基隆 基隆長庚 急檢科
20003 基隆 基隆長庚 病理科
20004 基隆 台礦醫院 檢驗科
20005 基隆 部立基隆 檢驗科
21001 台北 內湖三總 庫房
21002 台北 內湖三總 檢驗科
21003 台北 汀州三總 檢驗科
21004 台北 汀州三總 急檢科
21005 台北 台北國泰 檢驗科
21006 台北 市立聯合-仁愛院區 檢驗科
21007 台北 台北長庚 檢驗科
21008 台北 台北長庚 庫房
22001 新北 汐止國泰 檢驗科
22002 新北 汐止國泰 急檢科
22003 新北 林口長庚 檢驗科



原先小弟只是單純利用代碼為共通的key,運用VLOOKUP函數做抓取動作,就是在主要工作表內只輸入代碼,後面的地區,客戶名稱及部門都會自動帶入對應的儲存格中,但是隨著資料量愈來愈大,代碼愈來愈多,人腦根本無法去記住甚至去翻閱查找,因此想看看想有什麼方式可以解決,我曾經想過用下拉式清單方式,但是Excel下拉式清單無法像Access一樣可以連後面的地區,客戶名稱,部門都一起被看見做選擇,只能逐一點選,因此才想到上來向版上高手請教有沒有什麼方法可以解決這個問題,煩勞之處還請版上高手們見諒,謝謝!
2016-07-08 19:11 發佈
土法煉鋼

你把那一列/row 所有資料通通並在一個行/欄/column

Excel語法:A1=(B1&" "&C1&" "&D1&" "&E1)

舉例:
A------------------------------------- B------- C ------- D -------E
1 20001 基隆 基隆長庚 檢驗科 20001 基隆 基隆長庚 檢驗科
2 20002 基隆 基隆長庚 急檢科
.
.
.
.
16 22003 新北 林口長庚 檢驗科


然後把那一整行A拿去做下拉式選單 然後你要怎麼VLOOKUP再去自動填入就好了

cs113ta wrote:
土法煉鋼你把那一列...(恕刪)


感謝~ 我去試試,應該可行,謝謝囉

cs113ta wrote:
土法煉鋼你把那一列...(恕刪)


今天進公司去試過確認可行,但是我又發現另一個問題,那就是:
1.我手邊經手的客戶就有近500位遍佈全台,每筆資料Key-In都要去找有點麻煩!
2.每天Key-In出貨張數少說也有近百份,同上,每次都要從第一位客戶名稱往下拉,因為是以代碼作第一個排序,地區作第二個排序,客戶名稱作第三個排序,這樣編排我的被抓取清單內容!

想再請問有沒有什麼方法可以縮小範圍,例如:以代碼或地區作第一層清單選項,第二層會依據第一層限制自動縮小範圍,然後自動將地區,客戶名稱,部門別自動填入對應儲存格,如第一層選代碼30或選地區:桃園,第二層下拉式清單就只出現桃園地區的客戶名單及部門,然後再以VLOOKUP函數或其他函數或公式依序將客戶名稱及部門分別填入對應的儲存格中,我是這麼想像,只是不知道版上的各位高手有什麼方法可以依據這個條件來完成,或是說有更好的方法來達成,還請版上高手們不吝賜教!

厄洛斯 wrote:
今天進公司去試過確...(恕刪)


用VBA方式 看看
拿給的資料格式來做的

使用時客戶資料工作表 前4欄 務必為 代碼 地區 客戶名稱 部門 的順序

下面的程式碼貼到 要使用下拉的工作表裡
SheetName= 後面改成放客戶資料工作表的名稱

Const SheetName = "客戶清單" '資料工作表名稱
Const Col = "C1" '客戶代碼欄位

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Count = 1 And Target.Column = Range(Col).Column Then
Dim List As String
With Sheets(SheetName)
List = Unique(.Range(.Cells(2, 2), .Cells(.UsedRange.Rows.Count, 2)))
End With
Target.Offset(0, 1).Validation.Delete
Target.Offset(0, 1).Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _
Formula1:=List
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim MyKey As Integer '資料階層
MyKey = Target.Column() - Me.Range(Col).Column + 1
If Target.Count = 1 And MyKey > 1 And MyKey < 5 Then
Target.Offset(0, 1).Value = ""
Target.Offset(0, 1).Validation.Delete
Target.Offset(0, 1 - MyKey).Value = ""
If Target.Text <> "" Then
Dim Rng As Range
Set Rng = Sheets(SheetName).UsedRange
Rng.AutoFilter
If MyKey > 3 Then Rng.AutoFilter Field:=MyKey - 2, Criteria1:=Target.Offset(0, -2).Text
If MyKey > 2 Then Rng.AutoFilter Field:=MyKey - 1, Criteria1:=Target.Offset(0, -1).Text
Rng.AutoFilter Field:=MyKey, Criteria1:=Target.Text
If MyKey < 4 Then
Target.Offset(0, 1).Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _
Formula1:=Unique(Rng.Resize(Rng.Rows.Count - 1, 1).Offset(1, MyKey).SpecialCells(xlCellTypeVisible))
ElseIf MyKey = 4 Then
Target.Offset(0, 1 - MyKey) = Rng.Resize(Rng.Rows.Count - 1, 1).Offset(1, 0).SpecialCells(xlCellTypeVisible).Range("A1")
End If
Rng.AutoFilter
End If
End If
End Sub
Function Unique(DD As Variant) As String '刪除重複
Dim D As Variant, Str As String
For Each D In DD
If InStr(Str, D) = 0 Then
Str = IIf(Str = "", D, Str & "," & D)
End If
Next D
Unique = Str
End Function



使用時點 DoubleClick 代碼欄位 地區欄位就會出現下拉選單

YS2000 wrote:
用VBA方式 看看...(恕刪)

我試過將您提供的VBA程式複製貼上,執行時一直跳出錯誤,是因為儲存格名稱不一致嗎?我有試著改成跟你的一樣,也不行還是會出現錯誤,可以幫忙看看哪裡出錯,或是我把架構跟說明寄給你幫我看看,在公司用的是EXCEL2010版!

厄洛斯 wrote:
我試過將您提供的VBA...(恕刪)



Const SheetName = "客戶清單" '資料工作表名稱
Const Col = "C1" '客戶代碼欄位
程式碼應該只要改上面兩個變數就能運作了



測試用的檔案,你下載試看看
附加壓縮檔: 201607/mobile01-94db73e4097190acc93ea8dbead14cf3.zip


還不行的話,如果可以的話,傳不含資料的的表單結構 ,我試看看
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?