Board logo

標題: [發問] 如何自行判斷並填入 [打印本頁]

作者: j88141    時間: 2014-4-22 21:14     標題: 如何自行判斷並填入

本帖最後由 j88141 於 2014-4-22 21:15 編輯

請問在原始資料中(檔案1)有五個地名
[attach]18120[/attach]
然後想要用VBA判斷並自動填入到另一個excel檔案(檔案2)
像下列這樣
[attach]18116[/attach]

請問有辦法嗎
[attach]18119[/attach]
作者: GBKEE    時間: 2014-4-23 06:17

本帖最後由 GBKEE 於 2014-4-27 05:56 編輯

回復 1# j88141

自動填入到另一個excel檔案(檔案2)的ThisWorkbook程式碼
  1. Option Explicit
  2. Dim D As Object
  3. Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  4.     Dim Rng As Range
  5.     Application.EnableEvents = False
  6.     If Target.Address = "$A$1" Then
  7.         Dictionary_Ex
  8.         Set Rng = Sh.[A2]
  9.         Do While Rng <> ""
  10.             If D.exists((Rng & Target)) Then   '字典物件中有這 key 值
  11.                 D(Rng & Target).Copy Rng.Offset(, 1).Resize(3)
  12.             Else
  13.                 Rng.Offset(, 1).Resize(3) = ""
  14.             End If
  15.             Set Rng = Rng.Offset(, 2)  '向左移動2欄
  16.         Loop
  17.     End If
  18.     Application.EnableEvents = True
  19. End Sub
  20. Private Sub Dictionary_Ex()
  21.     Dim Rng(1 To 2) As Range, i As Integer, a
  22.     Set D = CreateObject("SCRIPTING.DICTIONARY")
  23.     With Workbooks("Xl0000001.xls").Sheets("工作表1")   '原始資料檔案必須是開啟的
  24.         Set Rng(1) = .[A1]                              'A欄的星期是合併3列的儲存格
  25.         Do While Rng(1) <> ""
  26.             Set Rng(2) = Rng(1).CurrentRegion.Rows(Rng(1).Row & ":" & Rng(1).Row + 2)
  27.             'CurrentRegion 屬性 傳回 Range 物件,該物件代表目前的區域。目前區域是指以任意空白列及空白欄的組合為邊界的範圍。唯讀
  28.             'Rng(1).Row + 2 : Rng(1)所在的列號+ 2
  29.             
  30.             For i = 2 To Rng(2).Columns.Count           '星期的欄位從第2欄開始到最後一欄
  31.               Set D(Rng(1) & Rng(2).Cells(3, i)) = Rng(2).Columns(i)
  32.               'Rng(1) :星期 , Rng(2).Cells(3, i) :地名
  33.             Next
  34.         Set Rng(1) = Rng(1).End(xlDown) '下一個星期的位置
  35.         
  36.        Loop
  37.      End With
  38. End Sub
複製代碼

作者: j88141    時間: 2014-4-23 12:46

回復 2# GBKEE


輸入之後怎麼會出現編譯錯誤
Dictionary_Ex
這一個沒有定義sub或 function
作者: j88141    時間: 2014-4-23 21:11

回復 3# j88141


GBKEE老師

我還有一個問題
就是在資料2的A1 不是有地名嗎
可是好像要重新輸入 才會觸發VBA
請問該怎麼修改
或是加入一個CommandButton呢
作者: GBKEE    時間: 2014-4-24 04:57

本帖最後由 GBKEE 於 2014-4-27 06:04 編輯

回復 4# j88141
  1. Option Explicit
  2. Dim D As Object
  3. Private Sub Ex()  'Excel檔案(檔案2),加入一個CommandButton 的程式碼
  4.     Dim SH As Worksheet, Rng As Range
  5.     Dictionary_Ex        '執行這個程序
  6.     For Each SH In Sheets  'Sheets :Excel檔案(檔案2)中的工作表集合
  7.         Set Rng = SH.[A2]
  8.         Do While Rng <> ""
  9.             If D.exists(Rng & SH.[A1]) Then   '字典物件中有這 key 值
  10.                 D(Rng & SH.[A1]).Copy Rng.Offset(, 1).Resize(3)
  11.             Else
  12.                 Rng.Offset(, 1).Resize(3) = ""
  13.             End If
  14.             Set Rng = Rng.Offset(, 2)  '向左移動2欄
  15.         Loop
  16.     Next
  17. End Sub
複製代碼

作者: j88141    時間: 2014-4-27 00:33

回復 5# GBKEE


    GBKEE 老師

如果 我想把 地名 改變  如  原始資料金門改成台北

但在檔案二 好像 還是會自動搜尋金門  然後填入

我這兩天 查了 dictionary 這物件  
知道 要用d.RemoveAll 來清除字典中的數據
但卻不知道如何加入

順便一問  看不太懂這一句...
Set Rng(2) = Rng(1).CurrentRegion.Rows(Rng(1).Row & ":" & Rng(1).Row + 2)

謝謝GBKEE 老師
作者: GBKEE    時間: 2014-4-27 06:05

回復 6# j88141
2# ,5# 的程式碼都更新,可再看一次
作者: j88141    時間: 2014-4-28 22:29

回復 7# GBKEE
     GBKEE 老師   

這是我想出來的
因為一開始的 只有一個符合項目  就可以填入檔案2中

那如果需要符合 兩個項目 才可以填進
那程式碼需要怎麼改才行

[attach]18184[/attach][attach]18185[/attach]

[attach]18186[/attach]
作者: GBKEE    時間: 2014-4-29 07:04

回復 8# j88141

兩檔案的"中午" 這字串要一致
  1. Option Explicit
  2. Dim D As Object
  3. Private Sub Ex()  'Excel檔案(檔案2),加入一個CommandButton 的程式碼
  4.     Dim SH As Worksheet, Rng As Range, i As Integer
  5.     Dictionary_Ex               '執行這個程序
  6.     For Each SH In Sheets       'Sheets :Excel檔案(檔案2)中的工作表集合
  7.         Set Rng = SH.[A3]       '編號
  8.         Do While Rng <> ""
  9.             For i = 4 To SH.UsedRange.Columns.Count
  10.                 If D.exists(SH.Cells(2, i) & Rng & SH.[A1]) Then '字典物件中有這 key 值
  11.                     'key 值-> 星期 & 編號 & 地名
  12.                     '星期: Sh.Cells(2,i)
  13.                     '編號: Rng
  14.                     '地名" SH.[A1]
  15.                     D(SH.Cells(2, i) & Rng & SH.[A1]).Copy Rng.Cells(1, i).Resize(4)
  16.                 Else
  17.                     Rng.Cells(1, i).Resize(4) = ""
  18.                 End If
  19.             Next
  20.             Set Rng = Rng.End(xlDown) '下一個星期的位置
  21.         Loop
  22.     Next
  23. End Sub
  24. Private Sub Dictionary_Ex()
  25.     Dim Rng(1 To 3) As Range, i As Integer, a
  26.     Set D = CreateObject("SCRIPTING.DICTIONARY")
  27.     With Workbooks("Xl0000001.xls").Sheets("工作表1")   '原始資料檔案必須是開啟的
  28.         Set Rng(1) = .[A4]                              '星期
  29.         Do While Rng(1) <> ""
  30.             Set Rng(2) = Rng(1).Offset(, 1)             '編號
  31.             Do While Not Intersect(Rng(1).MergeArea, Rng(2).Offset(, -1)) Is Nothing
  32.                 For i = 4 To .UsedRange.Columns.Count - 1
  33.                   If Rng(2).Cells(1, i) <> "" Then     '
  34.                         Set D(Rng(1) & Rng(2) & Rng(2).Cells(3, i)) = Rng(2).Cells(1, i).Resize(4)
  35.                                                         '地名: Rng(2).Cells(3, i)
  36.                     End If
  37.                 Next
  38.                 Set Rng(2) = Rng(2).End(xlDown)         '下一個編號的位置
  39.             Loop
  40.             Set Rng(1) = Rng(1).End(xlDown)             '下一個星期的位置
  41.        Loop
  42.      End With
  43. End Sub
複製代碼

作者: j88141    時間: 2014-5-1 00:43

回復 9# GBKEE


    謝謝GBKEE 老師   
  我學到很多
作者: j88141    時間: 2014-10-27 22:07

本帖最後由 j88141 於 2014-10-27 22:08 編輯

回復 9# GBKEE


    GBKEE大:

如果我想要把檔案二的"地區"  改成輸入 檔案一的 "符號"
也就是從E3開始算起的A、B、C等
檔案一                                         檔案二
[attach]19401[/attach]

請問GBKEE大該怎麼修改?
謝謝~~~
[attach]19402[/attach]
作者: GBKEE    時間: 2014-10-28 06:16

回復 11# j88141
  1. 如果我想要把檔案二的"地區"  改成輸入 檔案一的 "符號"
  2. 也就是從E3開始算起的A、B、C等
複製代碼
附檔上 檔案二的"符號" 在哪裡判斷??
作者: j88141    時間: 2014-10-28 08:51

回復 12# GBKEE


    原本檔案二只要符合  檔案一的  " 星期 & 編號 & 地區  " 項目
    檔案一就會自動判斷填入檔案二中

    現在想要把檔案二自動輸入完畢後,在檔案二的 "地區"可以自動轉換成 檔案一的"符號"

[attach]19409[/attach]
作者: GBKEE    時間: 2014-10-28 10:01

回復 13# j88141

多加一字典物件
  1. Dim D(1 To 2) As Object
  2. Private Sub Ex()  'Excel檔案(檔案2),加入一個CommandButton 的程式碼
  3.     Dim SH As Worksheet, Rng As Range, i As Integer
  4.     Dictionary_Ex               '執行這個程序
  5.     For Each SH In Sheets       'Sheets :Excel檔案(檔案2)中的工作表集合
  6.         Set Rng = SH.[A3]       '編號
  7.         Do While Rng <> ""
  8.             For i = 4 To SH.UsedRange.Columns.Count
  9.                 If D(1).exists(SH.Cells(2, i) & Rng & SH.[A1]) Then '字典物件中有這 key 值
  10.                     'key 值-> 星期 & 編號 & 地名
  11.                     '星期: Sh.Cells(2,i)
  12.                     '編號: Rng
  13.                     '地名" SH.[A1]
  14.                     D(1)(SH.Cells(2, i) & Rng & SH.[A1]).Copy Rng.Cells(1, i).Resize(4)
  15.                     Rng.Cells(1, i).Range("a3") = D(2)(SH.Cells(2, i) & Rng & SH.[A1])
  16.                 Else
  17.                     Rng.Cells(1, i).Resize(4) = ""
  18.                 End If
  19.             Next
  20.             Set Rng = Rng.End(xlDown) '下一個星期的位置
  21.         Loop
  22.     Next
  23. End Sub
  24. Private Sub Dictionary_Ex()
  25.     Dim Rng(1 To 3) As Range, i As Integer, a
  26.     Set D(1) = CreateObject("SCRIPTING.DICTIONARY")
  27.     Set D(2) = CreateObject("SCRIPTING.DICTIONARY")
  28.     With Workbooks("檔案1.xlsx").Sheets("工作表1")   '原始資料檔案必須是開啟的
  29.         Set Rng(1) = .[A4]                          '星期
  30.         Do While Rng(1) <> ""
  31.             Set Rng(2) = Rng(1).Offset(, 1)             '編號
  32.             Do While Not Intersect(Rng(1).MergeArea, Rng(2).Offset(, -1)) Is Nothing
  33.             
  34.                 For i = 4 To .UsedRange.Columns.Count
  35.                   If Rng(2).Cells(1, i) <> "" Then     '
  36.                         Set D(1)(Rng(1) & Rng(2) & Rng(2).Cells(3, i)) = Rng(2).Cells(1, i).Resize(4)
  37.                         D(2)(Rng(1) & Rng(2) & Rng(2).Cells(3, i)) = .Cells(3, Rng(2).Cells(1, i).Column)
  38.                     End If
  39.                 Next
  40.                 Set Rng(2) = Rng(2).End(xlDown)         '下一個編號的位置
  41.             Loop
  42.             Set Rng(1) = Rng(1).End(xlDown)             '下一個星期的位置
  43.        Loop
  44.      End With
  45. End Sub
複製代碼

作者: j88141    時間: 2014-10-29 20:54

TKS~
作者: j88141    時間: 2014-11-2 22:46

回復 14# GBKEE

GBKEE大
我發現一個問題
當檔案一要複製到檔案二中 時
如果 檔案一 同排有很多資料
但檔案二也只會選擇其中一個作複製

請問有沒有辦法 當檔案一同排資料多的時候,  檔案二可以全部複製到同一儲存格?


    [attach]19460[/attach]
作者: GBKEE    時間: 2014-11-6 14:54

回復 16# j88141

請問有沒有辦法 當檔案一同排資料多的時候,  檔案二可以全部複製到同一儲存格
那要看你檔案二的工作頁儲存格的編排!!!




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