返回列表 上一主題 發帖

不好意思 新手又來請教 資料比對問題 麻煩各位了

to 超級版主 下面的那個功能我寫出來了!! 感謝 那個mystr不用定義那個問題在麻煩你教我一下 謝謝

TOP

回復 10# ffntldj

抱歉!這是我的習慣不好
    mystr未宣告,你可自己加進去
把mystr為字串
未宣告的變數,EXCEL會認為是Variant
會自己判斷應該屬於哪一種變數存在
你可由程式碼逐行中看出mystr的變化
就知道他是甚麼型態的變數了
學海無涯_不恥下問

TOP

了解 謝謝你 目前已用這個架構去建立我想要的功能

另外跟你請問一個問題 如果我想要把輸入改成可以選擇檔案

是不是用application.getopenfilename

試了一下 在 With .Sheets("b") 會有問題

感激不盡

TOP

回復 13# ffntldj
抱歉沒說清楚  應是以下這段 改成選擇檔案
With Workbooks.Open '("D:\工程師送件範例.xls") '檔案路徑自行修改

TOP

getopenfilename會得到?
workbooks.open括號中是否與你getopenfilename得到的相同?
了解各個指令的參數資料型態,應是你目前最需要清楚的觀念
請利用F8的逐行功能來檢查變數的變化
學海無涯_不恥下問

TOP

本帖最後由 ffntldj 於 2011-7-22 23:18 編輯

回復 15# Hsieh

我寫出來了~~~ 謝謝 程式碼稍後附上

如下

myfile = workbook.application.getopenfilename ("excel文件(*.xls),*.xls")
with workbooks.open(myfile)

就可以用滑鼠點檔案了

感謝版主~

TOP

不好意思 新手又來請教 資料比對問題 麻煩各位了

本帖最後由 ffntldj 於 2011-7-23 01:26 編輯

不好意思 實在寫不出來 用了一堆if 跟for 實在好難  有問題想請教,
   資料不只三筆 只列出三筆 (附圖如下)

   1.如果想把 A sheet裡 mod part以下 action以上 (紅色字體 )裡的資料 填入A1 但是如果資料是重覆 ,則不重複表示 (如A1 sheet) 該怎麼做?

       之前是用板大教的
       Set d = CreateObject("Scripting.Dictionary")
    If a = "Mod part" Then mystr = a.Offset(1,0).Text

     但是如果遇到Mod part下面有很多筆 就不知道該怎麼寫了

   2. 比對A sheet 和 C sheet裡面的資料,當A sheet裡的紅色跟藍色 , 跟B sheet的partid欄位跟ope_no欄位

      都能夠match的話,將對應到的資料放到  B1 sheet裡面 (如B1所示)
   

附件如下   再麻煩大家了 真是不好意思 Book1.rar (2.57 KB)

本帖最後由 GBKEE 於 2011-7-23 09:23 編輯

回復 1# ffntldj
比對A sheet 和 C sheet裡面的資料   附黨中沒有C sheet 可以更新嗎?
  1. Sub 解答1Ex()
  2.     Dim Rng As Range, Ar, Msg As Boolean
  3.     Dim Word_In As String, Word_Out As String
  4.     Word_In = "Mod part"            '進入字串
  5.     Word_Out = "ACTION"             '離開字串
  6.     Set Rng = Sheets("A").[A1]      '尋找字串的起始點
  7.     ReDim Ar(0)                     '重新宣告陣列的維數
  8.     Do
  9.         If Rng = Word_In Then Msg = True        '是進入字串 邏輯值=True
  10.         If Rng = Word_Out Then Msg = False      '是離開字串 邏輯值=False
  11.         If Msg = True And Rng <> Word_In Then   '邏輯值=True 且字串不是"進入字串"
  12.             ' Application.Match(Rng, Ar, 0)     '在陣列比對不到同樣的字串 傳回錯誤值
  13.             If IsError(Application.Match(Rng, Ar, 0)) Then    '傳回錯誤值
  14.                 If Ar(UBound(Ar)) <> "" Then ReDim Preserve Ar(UBound(Ar) + 1)
  15.                                                         'Preserve   保留陣列原有資料的關鍵字
  16.                 Ar(UBound(Ar)) = Rng                    'UBound(Ar)  陣列的最大維數
  17.             End If
  18.         End If
  19.         Set Rng = Rng.Offset(1)                         '設定 Rng=Rng的下一列
  20.     Loop Until Rng = ""                                 '離開 DO 迴圈的條件是 Until(直到)  Rng = ""
  21.     Sheets("A1").Rows(1) = ""                           '整列
  22.     Sheets("A1").[A1].Resize(1, UBound(Ar) + 1) = Ar    'Resize 儲存格擴充範圍(1列, 欄位:=UBound(Ar) + 1)
  23. End Sub
複製代碼
  1. Sub 解答2Ex()
  2.     Dim Rng(1 To 2) As Range, Ar, Msg As Boolean, R As Range
  3.     Dim Word_In As String, Word_Out As String, Word_Look As String
  4.     Word_In = "Mod part"            '進入字串
  5.     Word_Out = "ACTION"             '離開字串
  6.     Word_Look = "MODIFY"
  7.     Set Rng(1) = Sheets("A").[A1]   '尋找字串的起始點
  8.     ReDim Ar(0)                     '重新宣告陣列的維數
  9.     Do
  10.         If UCase(Rng(1)) = UCase(Word_In) Then Msg = True        '是進入字串 邏輯值=True
  11.         If UCase(Rng(1)) = UCase(Word_Out) Then Msg = False      '是離開字串 邏輯值=False
  12.         If Msg = True And UCase(Rng(1)) <> UCase(Word_In) Then   '邏輯值=True 且字串不是"進入字串"
  13.             Set Rng(2) = Sheets("a").Columns(1).Find(Word_Look, After:=Rng(1), lookat:=xlWhole, MatchCase:=False)  '尋找最接近的 "MODIFY"
  14.             If IsError(Application.Match(Rng(1) & Rng(2).Offset(, 1), Ar, 0)) Then    '比對不到 "PARTID&OPE_NO"字串 傳回錯誤值
  15.                 If Ar(UBound(Ar)) <> "" Then ReDim Preserve Ar(UBound(Ar) + 1)
  16.                 Ar(UBound(Ar)) = Rng(1) & Rng(2).Offset(, 1)    'UBound(Ar)  陣列的最大維數
  17.             End If
  18.         End If
  19.         Set Rng(1) = Rng(1).Offset(1)                           '設定 Rng(1)=Rng(1)的下一列
  20.     Loop Until Rng(1) = ""                                      '離開 DO 迴圈的條件是 Until(直到)  Rng(1) = ""
  21.     Set Rng(1) = Nothing                                        '釋放變數
  22.     For Each R In Sheets("B").Range("a1").CurrentRegion.Rows    'R ->依序在Sheets("B")[A1延伸範圍的每一列
  23.         If Not IsError(Application.Match(R.Cells(1) & R.Cells(2), Ar, 0)) Then  '陣列中比對到SHEETS("B") A欄&B欄 的字串
  24.             If Rng(1) Is Nothing Then Set Rng(1) = R Else Set Rng(1) = Union(Rng(1), R)                                    '設定變數
  25.         End If
  26.     Next
  27.     With Sheets("B1")
  28.        .UsedRange.Clear        '清除 Sheets("B1")的內容
  29.         Rng(1).Copy .[A1]
  30.     End With
  31. End Sub
複製代碼

TOP

比對A sheet 和 C sheet裡面的資料,當A sheet裡的紅色跟藍色 , 跟B sheet的partid欄位跟ope_no欄位
此處打錯 應該是 比對A sheet 和 B sheet ,當A sheet裡的紅色跟藍色 , 跟B sheet的partid欄位跟ope_no欄位
抱歉  程式碼我研究一下

TOP

版主你好

謝謝你的code 讓我獲益良多 很感謝你   code沒有問題 ,但有些地方我看不懂 google過了也還是不會

想直接跟你請教,謝謝

1.   If IsError(Application.Match(Rng, Ar, 0))   這句是"在陣列比對不到同樣的字串 傳回錯誤"
      是說 如果ar裡面不是Mod part和ACTION就會傳回值然後往下走嘛?

2.  If IsError(Application.Match(Rng(1) & Rng(2).Offset(, 1), Ar, 0)) Then   
     這邊的ope_no 是用Offset的方式去寫,今天再想一各問題 如果想用欄位名稱(ope_no)去認的話這邊該怎麼改寫?是不是用一個回圈去抓第一列的名字?

3.如果A sheet在比對 B sheet時候, 如果只要B sheet裡PART ID的第一碼到第N碼  (如TMD1213 ,TMD1214)當他等於 A Sheet裡面的值時 ,也要把它抓出來的話 該怎麼做? 這我真的就不會了~~

以上 謝謝

TOP

        靜思自在 : 人事的艱難與琢磨,就是一種考驗。
返回列表 上一主題