Board logo

標題: [發問] 請問VBA 的程式有沒有可以辨認某個儲存格內的字元有無包含某幾個字串? [打印本頁]

作者: 198188    時間: 2013-3-1 00:48     標題: 請問VBA 的程式有沒有可以辨認某個儲存格內的字元有無包含某幾個字串?

請問VBA 的程式有沒有可以辨認某個儲存格內的字元有無包含某幾個字串?
例如
另外無論是大寫或小寫都辨認到
in   A1  A3  A4 包含 in
A1   window   
A2  office
A3  tina
A4  WINNIE   

另外可否找尋字串的位置
例如
in   
A1   window                       3
A2  office   
A3  tina                                2
A4  WINNIE                       2
作者: kimbal    時間: 2013-3-1 00:54

本帖最後由 kimbal 於 2013-3-1 01:07 編輯
請問VBA 的程式有沒有可以辨認某個儲存格內的字元有無包含某幾個字串?
例如
另外無論是大寫或小寫都辨認 ...
198188 發表於 2013-3-1 00:48


用EXCEL的SEARCH公式即可
    =IF(ISERROR(SEARCH("IN",UPPER(A1))),"",SEARCH("IN",UPPER(A1)))
[attach]14275[/attach]

VBA 的話
[attach]14277[/attach]
  1. Public Function csearch(find_text, rng_within)
  2.     Dim result
  3.     result = InStr(1, UCase(rng_within.Value), UCase(find_text))
  4.     csearch = IIf(result = 0, "", result)
  5. End Function
複製代碼

作者: 198188    時間: 2013-3-1 01:00

回復 2# kimbal


    感謝,但用一般excel我知道,我想知道vba有無這個功能?
作者: kimbal    時間: 2013-3-1 01:07

回復  kimbal


    感謝,但用一般excel我知道,我想知道vba有無這個功能?
198188 發表於 2013-3-1 01:00



    請看上面編輯
作者: 198188    時間: 2013-3-1 01:26

回復 4# kimbal

感謝
    csearch = IIf(result = 0, "", result)
請問如果只是檢查有沒有是否改成csearch = IIf(result = 0, "沒有", “有”)

另外請問
DO
UNTIL
可否同時有兩個UNTIL的條件
例如:
DO

UNTIL i>=1 or l = 0
UNTIL i>=1 and l = 0
作者: 198188    時間: 2013-3-1 01:33

回復  kimbal

感謝
    csearch = IIf(result = 0, "", result)
請問如果只是檢查有沒有是否改成csea ...
198188 發表於 2013-3-1 01:26



    這個程式是否需要在C欄處寫 csearch("in"a1,)?
如果在VBA內注明 SEARCH "IN"可以嗎?另外英文大寫和小寫都可以辨認到嗎?或者如何指定辨認大寫或小寫?
作者: kimbal    時間: 2013-3-1 13:39

回復 6# 198188


    回復 4# kimbal


>    csearch = IIf(result = 0, "", result)
> 請問如果只是檢查有沒有是否改成csearch = IIf(result = 0, "沒有", “有”)

對啊,就是這樣.


>另外請問
>DO
>UNTIL
>可否同時有兩個UNTIL的條件
>例如:
>DO
>UNTIL i>=1 or l = 0
>UNTIL i>=1 and l = 0

可以的,這樣就可
    Do
        ...
    Loop Until i> = 5 and l = 0
///
    Do
        ...
    Loop Until i> = 5 Or l = 0



>如果在VBA內注明 SEARCH "IN"可以嗎?另外英文大寫和小寫都可以辨認到嗎?或者如何指定辨認大寫或小寫?

現在是不論大寫小寫都可以辨認到的,
因為用了ucase把兩個輸入都先轉成大寫,然後才做比較
result = InStr(1, UCase(rng_within.Value), UCase(find_text))
例如:
result  = Instr(1, ucase("abc"), ucase("B"))
計算時會變為
result  = Instr(1, "ABC", "B")
result = 2


拿走ucase就的話就要大小寫全對才可以找到位置
result = InStr(1, rng_within.Value, find_text)
例如:
result  = Instr(1, "abc", "B")
result = 0

把"B"改成"b"就可以得出2
result  = Instr(1, "abc", "b")
result = 2
作者: mark15jill    時間: 2013-3-1 15:28

可以參考以下原始碼
紅字即為需搜尋得字串
Sub A()
                     工作表3.Cells(1, 16) = "搜尋目標源"
                     工作表3.Cells(1, 17) = "判斷是否找到"
                     工作表3.Cells(1, 18) = "關鍵字位置"
                     工作表3.Cells(1, 19) = "代碼"


        For i = 2 To ActiveSheet.Range("b2").CurrentRegion.Rows.Count
                If (InStr(1, 工作表3.Cells(i, 2), "內") >= 1) Then
                     工作表3.Cells(i, 16) = 工作表3.Cells(i, 2) '搜尋目標源
                     工作表3.Cells(i, 17) = "find" '判斷是否找到
                     工作表3.Cells(i, 18) = InStr(工作表3.Cells(i, 2), "內") '關鍵字位置
                     工作表3.Cells(i, 19) = "3"  '代碼
                     s = s + 1
                End If
        Next
              ' 工作表3.Cells(i, 17) = "find"
End Sub
作者: 198188    時間: 2013-3-8 15:56

  1. Sub Load_State_Detail()
  2. Dim FRng As Range
  3. Dim A As Range, Rng As Range
  4. Dim i As Integer
  5. Dim LastRec As Integer
  6. Dim l As Integer
  7. Dim k As Integer
  8. Dim j As Integer


  9. j = 2
  10. LastRec = Sheets("state").Range("A1").CurrentRegion.Rows.Count
  11. fs = "W:\Payment Daily Report\DOCS RECEIVED N RELEASED RECORD.xlsx"
  12. Set Wb = Workbooks.Open(fs)
  13. With ThisWorkbook.Worksheets("State")
  14. k = Wb.Sheets("收件記錄").Range("A1").CurrentRegion.Rows.Count
  15. For l = 2 To LastRec

  16. Do
  17. If Worksheets("State").Range("A" & l).Value = Wb.Sheets("收件記錄").Range("A" & j).Value Then
  18. Worksheets("State").Range("J" & l).Value = Wb.Sheets("收件記錄").Range("h" & j)
  19. If (InStr(1, Worksheets("State").Cells(l, 10), "OBL") >= 1) Then Worksheets("State").Range("J" & l).Value = Wb.Sheets("收件記錄").Range("h" & j) Else Worksheets("State").Range("J" & l).Value = ""
  20. End If
  21. j = j + 1
  22. Loop Until j = k Or (InStr(1, Worksheets("State").Cells(l, 10), "OBL") >= 1)
  23. Next
  24. End With
  25. End Sub
複製代碼
回復 7# kimbal

[attach]14315[/attach][attach]14316[/attach]
個程式If Worksheets("State").Range("A" & l).Value = Wb.Sheets("收件記錄").Range("A" & j).Value Then 出現RUN TIME ERROR "9" SUBSCRIP OUT OF RANG?
我這個程式的作用是
在test excel�堛漳tate sheet A欄的訂單號如果在DOCS RECEIVED N RELEASED RECORD表內有這個訂單號,而且在H欄�堛漲r元含有"OBL", 那麼在test excel�堛漳tate sheet的J欄就顯示DOCS RECEIVED N RELEASED RECORD表內H欄的字,否則就空格
作者: 198188    時間: 2013-3-8 15:58

回復 8# mark15jill

請幫我看看上面的問題,謝謝
作者: mark15jill    時間: 2013-3-8 16:41

回復 10# 198188


    大大您寫的好長....
    將兩個活頁簿合併成一個檔案判斷.. (寫法和 兩個活頁簿分開的寫法差不多)
   根據您所發問的問題,以簡易的程式判斷..

st1 = 工作表1.Range("a2").CurrentRegion.Rows.Count
st2 = 工作表2.Range("d2").CurrentRegion.Rows.Count

For k1 = 2 To st1
    For k2 = 2 To 233
        If 工作表2.Cells(k2, "D") = 工作表1.Cells(k1, "A") And (InStr(1, 工作表2.Cells(k2, "H"), "OBL") >= 1) Then
         '工作表2.Cells(k2, "c") = "對應到" & 工作表1.Cells(k1, "A")'此行為 在工作表2 C欄標註 D欄位是否有符合 工作表1  A欄位
         工作表1.Cells(k1, "J") = 工作表2.Cells(k2, "H")
        End If
    Next
Next
作者: 198188    時間: 2013-3-8 22:25

回復 11# mark15jill
  1. Sub State_Detail()
  2. Dim FRng As Range
  3. Dim a As Range, Rng As Range
  4. Dim i As Integer
  5. Dim LastRec As Integer
  6. Dim z As Integer
  7. Dim y As Integer
  8. Dim x As Integer
  9. Dim w As Integer

  10. z = Sheets("state").Range("a2").CurrentRegion.Rows.Count
  11. fs = "C:\Documents and Settings\USER\桌面\DOCS RECEIVED N RELEASED RECORD.xlsx"
  12. Set WB = Workbooks.Open(fs)

  13. With ThisWorkbook.Worksheets("State")

  14. x = 2
  15. For w = 2 To z
  16.     Do
  17.         If WB.Sheets("收件記錄").Cells(x, "D") = Sheets("state").Cells(w, "A") And (InStr(1, WB.Sheets("收件記錄").Cells(x, "H"), "OBL") >= 1) Then
  18.                  Sheets("state").Cells(w, "J") = WB.Sheets("收件記錄").Cells(x, "H")
  19.         End If
  20.         x = x + 1
  21.    Loop Until x = WB.Sheets("收件記錄").Row.Count.End(xlUp)
  22. Next

  23. End With
  24. WB.Close 0
  25. End Sub
複製代碼
出現執行階段錯誤9 陣列索引超出範圍
作者: Hsieh    時間: 2013-3-8 23:14

回復 12# 198188
會出現超出陣列索引錯誤是因為你在開啟來源檔以後,一般模組內程式碼若沒指定活頁簿,則會以當前作用中的活頁簿作為該活頁簿
通常我會這麼做,比較容易找出錯誤點
  1. Sub ex()
  2. Dim Sh As Worksheet, Rng As Range
  3. fd = ThisWorkbook.Path & "\"  '資料來源目錄
  4. fs = "DOCS RECEIVED N RELEASED RECORD.xlsx" '資料來源檔案(含副檔名)
  5. With Workbooks.Open(fd & fs)
  6.   Set Sh = .Sheets("收件記錄")
  7.       With ThisWorkbook.Sheets("State")
  8.          For Each A In .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))
  9.             Set Rng = Sh.Columns("D").Find(A, lookat:=xlWhole)
  10.             If Not Rng Is Nothing Then
  11.                If InStr(Rng.Offset(, 4), "OBL") > 0 Then _
  12.                A.Offset(, 9) = Rng.Offset(, 4).Value Else A.Offset(, 9) = ""
  13.             End If
  14.          Next
  15.       End With
  16.     .Close
  17. End With
  18. End Sub
複製代碼

作者: 198188    時間: 2013-3-9 09:38

回復 13# Hsieh


    有個問題,因為我的DATA BASE�堛滬q單號會重複幾次, Set Rng = Sh.Columns("D").Find(a, lookat:=xlWhole) 這句只是會找一次
例如:
200000     PLANT INV
200000     OHC
200000     OBL
200000     CO
200000     遲証信

211111     OBL
211111     OHC
211111     CO

222222     OHC
222222     CO
222222     OBL
效果就無法出現
因為我是想只要訂單號相同,而且這些訂單號只要有一列有OBL三個字,就出現OBL否則空格
作者: GBKEE    時間: 2013-3-9 11:23

本帖最後由 GBKEE 於 2013-3-9 12:52 編輯

回復 14# 198188
Set Rng = Sh.Columns("D").Find(a, lookat:=xlWhole) 這句只是會找一次
如下可尋找全部
  1. Option Explicit
  2. Sub Ex()
  3.     Dim A As String, Rng As Range, Sh As Worksheet, Address_First As String
  4.     Dim M As String
  5.     Set Sh = ActiveSheet
  6.     A = "OBL"                                          '尋找的字串
  7.     Set Rng = Sh.Columns("D").Find(A, lookat:=xlWhole) '第一個
  8.     If Not Rng Is Nothing Then
  9.         Address_First = Rng.Address                    '寫下第一個位址
  10.         Do
  11.             M = IIf(M <> "", M & ",", "") & Rng.Address
  12.             Set Rng = Sh.Columns("D").FindNext(Rng)   '繼續尋找下一個
  13.         Loop Until Address_First = Rng.Address        '回到第一個位址
  14.         MsgBox M
  15.      Else
  16.         MsgBox "找不到"
  17.     End If
  18. End Sub
  19. Sub Ex_1()
  20.     Dim A As String, Rng As Range, Sh As Worksheet, Address_First
  21.     Set Sh = ActiveSheet
  22.     A = "OBL"                                           '尋找的字串
  23.     Set Rng = Sh.Columns("D").Find(A, lookat:=xlWhole)  '第一個
  24.     If Not Rng Is Nothing Then
  25.         With Sh.Columns("D")
  26.             .Replace A, "=ABC", xlWhole                 '修改"尋找的字串" = 沒定義的名稱
  27.             Set Rng = .SpecialCells(xlCellTypeFormulas, xlErrors) '儲存格有錯誤值的特定範圍
  28.             Rng.Value = A                                '沒定義的名稱 改回 "尋找的字串"
  29.             MsgBox Rng.Address
  30.         End With
  31.     Else
  32.         MsgBox "找不到"
  33.     End If
  34. End Sub
複製代碼
因為我是想只要訂單號相同,而且這些訂單號只要有一列有OBL三個字,就出現OBL否則空格
不了解你檔案內容 無法回答
作者: 198188    時間: 2013-3-9 11:44

回復 15# GBKEE


我想要的效果是根據Test.xlsm的State Sheet 的A欄的訂單號,來尋找DOCS RECEIVED N RELEASED RECORD.xlsx 收單記錄SHEET內D欄是否有相同的訂單號和H欄的字元內包含"OBL"三個字(大小寫都沒有問題可以讀到),如果有,在Test.xlsm的State Sheet 的相應的訂單號J欄顯示DOCS RECEIVED N RELEASED RECORD.xlsx 收單記錄SHEET內H欄的資料。如果沒有就空格。
前面有附件
Test.xlsm
State sheet
A欄                J欄
20000          OBL-3
20001
20002
20003          OBL
20004          OBL

W:\Payment Daily Report\DOCS RECEIVED N RELEASED RECORD.xlsx"
收單記錄SHEET
D欄                          H欄
20000                     遲証信
20000                     OBL-3
20003                     OHC(BODY-1,OIE-1,ACCEPTED BSE-1),CO
20000                     OHC(BODY-1,HPAI-1)
20004                     OHC(BODY-1,OIE-1,ACCEPTED BSE-1,AD-1,CL-1)
20005                     OHC(BODY-1)
20003                     OBL
20003                     INV
20005                     INV
20005                     OBL
20004                     OBL
作者: GBKEE    時間: 2013-3-9 13:15

回復 16# 198188
  1. Option Explicit
  2. Sub Ex()
  3.     Dim R As Range, Rng As Range, E As Range
  4.     With Sheet1                         '*** 須改為: Test.xlsm的State Sheet
  5.         Set R = .Cells(1, "a")          'A1開始
  6.         Do Until R = ""                 '離開迴圈的條件:  A欄的 儲存格=""
  7.             With Sheet2                 '*** 須改為: W:\Payment Daily Report\DOCS RECEIVED N RELEASED RECORD.xlsx"
  8.                 Set Rng = .Columns("D").Find(R, lookat:=xlWhole)
  9.                  If Not Rng Is Nothing Then
  10.                     With .Columns("D")
  11.                         .Replace R, "=ABC", xlWhole                 '修改"尋找的字串" = 沒定義的名稱
  12.                         Set Rng = .SpecialCells(xlCellTypeFormulas, xlErrors) '儲存格有錯誤值的特定範圍
  13.                         Rng.Value = R                               '沒定義的名稱 改回 "尋找的字串"
  14.                         For Each E In Rng.Offset(0, 4)              'D欄位移4欄=H欄
  15.                             If InStr(UCase(E), "OBL") Then          'H欄的字元內包含"OBL"三個字
  16.                                                                     'UCase(E) 轉換為大寫
  17.                                 R.Offset(0, 9) = E.Value            'R.Offset(0, 9)-> A欄位移到 J欄
  18.                                 'Test.xlsm的State Sheet->J欄=DOCS RECEIVED N RELEASED RECORD.xlsx"->H欄的字元
  19.                                 Exit For    '有找到 "OBL" 離開迴圈                          '
  20.                             End If
  21.                        Next
  22.                     End With                '.Columns("D")
  23.                 End If
  24.             End With                        'Sheet2
  25.             Set R = R.Offset(1)             '下移到 A2
  26.         Loop
  27.     End With                                'Sheet1
  28. End Sub
複製代碼

作者: Hsieh    時間: 2013-3-9 21:46

回復 14# 198188
  1. Sub ex()
  2. Dim Sh As Worksheet, Rng As Range, C As Range, Ar()
  3. fd = ThisWorkbook.Path & "\"  '資料來源目錄
  4. fs = "DOCS RECEIVED N RELEASED RECORD.xlsx" '資料來源檔案(含副檔名)
  5. With Workbooks.Open(fd & fs)
  6.   Set Sh = .Sheets("收件記錄")
  7.       With ThisWorkbook.Sheets("State")
  8.          For Each A In .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))
  9.             Set Rng = Sh.Columns("D").Find(A, lookat:=xlWhole)
  10.             If Not Rng Is Nothing Then
  11.                For Each C In Sh.Range(Rng, Sh.Cells(Sh.Rows.Count, 4).End(xlUp))
  12.                   If C = A And InStr(UCase(C.Offset(, 4)), "OBL") > 0 Then
  13.                      ReDim Preserve Ar(s)
  14.                      Ar(s) = C.Offset(, 4)
  15.                      s = s + 1
  16.                   End If
  17.                 Next
  18.             If s > 0 Then A.Offset(, 9) = Join(Ar, "、"): Erase Ar: s = 0 Else A.Offset(, 9) = ""
  19.             End If
  20.          Next
  21.       End With
  22.     .Close
  23. End With
  24. End Sub
複製代碼

作者: 198188    時間: 2013-3-9 22:54

回復 18# Hsieh

可以了,感謝大大

fd = ThisWorkbook.Path & "\"  '資料來源目錄
fs = "DOCS RECEIVED N RELEASED RECORD.xlsx" '資料來源檔案(含副檔名)
另外請問上面兩句
如果我寫這句替代上面兩句fs = "W:\PIHK\DOCS RECEIVED N RELEASED RECORD.xlsx"
或者
fd = W:\PIHK\
fs = "DOCS RECEIVED N RELEASED RECORD.xlsx" '資料來源檔案(含副檔名)
這樣對嗎?

Join(Ar, "、"): Erase 這句是什麼意思?

另外請問如果我本來在state表的J欄已經有資料,會因應達到條件而取替資料,但如果要該儲存格是空格才取替

If s > 0 and trim(a.Offset(,9) )=“”Then a.Offset(, 9) = Join(Ar, "、"): Erase Ar: s = 0 Else a.Offset(, 9) = "" 這樣寫對嗎?
作者: 198188    時間: 2013-3-9 23:00

回復 17# GBKEE


With Sheet1                        (這句是否改With State sheet?)
With Sheet2                 (這句是否改With W:\Payment Daily Report\DOCS RECEIVED N RELEASED RECORD.xlsx ?)但是好像不對??
作者: Hsieh    時間: 2013-3-9 23:04

回復 19# 198188

如果我寫這句替代上面兩句fs = "W:\PIHK\DOCS RECEIVED N RELEASED RECORD.xlsx"
第5行這句
With Workbooks.Open(fd & fs)
就要改成
With Workbooks.Open(fs)

Join(Ar, "、"): Erase 這句是什麼意思?
程式語法不能只讀一半,在同一行敘述使用冒號,相當於兩行敘述
Join(Ar, "、") →  會得到陣列元素用頓號、連接的字串
Erase Ar →  是清空陣列

程式寫得對不對,執行一下就知道結果啦
作者: 198188    時間: 2013-3-9 23:15

回復 21# Hsieh

[attach]14320[/attach]
        感謝解釋,雖然不太明白,但會多嘗試。
另外我想問
如果H 欄如附件那樣合併,是否無法讀取?
只有214110 有資料
下面幾個是不是等於空格沒資料?
210695
214162
213924
212340
212341
211914
211915
212857
作者: Hsieh    時間: 2013-3-9 23:29

本帖最後由 Hsieh 於 2013-3-10 10:14 編輯

回復 22# 198188
這樣的程式與樓上程式碼比較看看應該就容易了解
  1. Sub ex()
  2. Dim Sh As Worksheet, Rng As Range, C As Range, Ar()
  3. fd = ThisWorkbook.Path & "\"  '資料來源目錄
  4. fs = "DOCS RECEIVED N RELEASED RECORD.xlsx" '資料來源檔案(含副檔名)
  5. With Workbooks.Open(fd & fs)
  6.   Set Sh = .Sheets("收件記錄")
  7.       With ThisWorkbook.Sheets("State")
  8.          For Each A In .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))
  9.             Set Rng = Sh.Columns("D").Find(A, lookat:=xlWhole)
  10.             If Not Rng Is Nothing Then
  11.                For Each C In Sh.Range(Rng, Sh.Cells(Sh.Rows.Count, 4).End(xlUp))
  12.                   If C = A And InStr(UCase(C.Offset(, 4).MergeArea(1)), "OBL") > 0 Then
  13.                      ReDim Preserve Ar(s)
  14.                      Ar(s) = C.Offset(, 4).MergeArea(1)
  15.                      s = s + 1
  16.                   End If
  17.                 Next
  18.             If s > 0 And A.Offset(, 9) = "" Then
  19.                A.Offset(, 9) = Join(Ar, "、")
  20.                Erase Ar
  21.                s = 0
  22.                   Else
  23.                A.Offset(, 9) = ""
  24.             End If
  25.             End If
  26.          Next
  27.       End With
  28.     .Close
  29. End With
  30. End Sub
複製代碼

作者: 198188    時間: 2013-3-10 00:17

回復 23# Hsieh


    原理明白,只是語法用法末清晰如何用,謝!
如果合併幾個儲存格是否讀不了?如上圖?
作者: Hsieh    時間: 2013-3-10 09:21

回復 24# 198188
善用F1說明與逐行偵錯才能對語法徹底了解
你問合併儲存格是否可行?
表示你根本沒有執行測試
沒有勇氣測試只會讓你永遠停頓
除非有證明樓上程式碼無法達成需求
且說明清楚問題點,否則此問題將不再回應
作者: 198188    時間: 2013-3-10 10:07

回復 25# Hsieh


    合併一問,之前已試過,只有第一個可讀取,其余是空格。我問題寫得不清楚,抱歉。
應該是不是有方法做到?
作者: Hsieh    時間: 2013-3-10 10:18

回復 26# 198188
你怎麼測試的?
[attach]14323[/attach]
作者: GBKEE    時間: 2013-3-10 15:16

回復 20# 198188
With Sheet2                 (這句是否改With W:\Payment Daily Report\DOCS RECEIVED N RELEASED RECORD.xlsx ?)但是好像不對??
如果我寫這句替代上面兩句fs = "W:\PIHK\DOCS RECEIVED N RELEASED RECORD.xlsx"
第5行這句
With Workbooks.Open(fd & fs)
就要改成
With Workbooks.Open(fs)
  1.              With Workbooks.Open(fs)
  2.                      Set Sh=.Sheets("收單記錄SHEET")
  3.              End With

  4.               With Sh  '->如此 Sh 已替代為為W:\Payment Daily Report\DOCS RECEIVED N RELEASED RECORD.xlsx"的 收單記錄SHEET
  5.             
  6.                End With
複製代碼

作者: 198188    時間: 2013-3-10 20:34

回復 27# Hsieh


    現在可以了,可能是excel有點衝突。
不知道為什麼有時候excel的程式本身一直沒問題,但是有時候會突然出現問題,但是重新啟動excel 後或者重新啟動電腦後,就沒有問題了。
作者: 198188    時間: 2013-3-10 20:53

回復 28# GBKEE
  1. Sub Ex()
  2. Dim Sh As Worksheet, Rng As Range, C As Range, Ar()
  3.     Dim R As Range, E As Range
  4.     With Sheets("State")                         '*** 須改為: Test.xlsm的State Sheet
  5.         Set R = .Cells(1, "a")          'A1開始
  6.                         
  7.          fs = "C:\Documents and Settings\USER\桌面\DOCS RECEIVED N RELEASED RECORD.xlsx"
  8. With Workbooks.Open(fs)
  9.   Set Sh = .Sheets("收件記錄")
  10.   Do Until R = "" '離開迴圈的條件:  A欄的 儲存格=""
  11.       With Sh '*** 須改為: W:\Payment Daily Report\DOCS RECEIVED N RELEASED RECORD.xlsx"
  12.               
  13.                 Set Rng = .Columns("D").Find(R, lookat:=xlWhole)
  14.                  If Not Rng Is Nothing Then
  15.                     With .Columns("D")
  16.                         .Replace R, "=ABC", xlWhole                 '修改"尋找的字串" = 沒定義的名稱
  17.                         Set Rng = .SpecialCells(xlCellTypeFormulas, xlErrors) '儲存格有錯誤值的特定範圍
  18.                         Rng.Value = R                               '沒定義的名稱 改回 "尋找的字串"
  19.                         For Each E In Rng.Offset(0, 4)              'D欄位移4欄=H欄
  20.                             If InStr(UCase(E), "OBL") Then          'H欄的字元內包含"OBL"三個字
  21.                                                                     'UCase(E) 轉換為大寫
  22.                                 R.Offset(0, 9) = E.Value            'R.Offset(0, 9)-> A欄位移到 J欄
  23.                                 'Test.xlsm的State Sheet->J欄=DOCS RECEIVED N RELEASED RECORD.xlsx"->H欄的字元
  24.                                 Exit For    '有找到 "OBL" 離開迴圈                          '
  25.                             End If
  26.                        Next
  27.                     End With                '.Columns("D")
  28.                 End If
  29.             End With                        'Sheet2
  30.             Set R = R.Offset(1)             '下移到 A2
  31.      Loop
  32.     End With                                'Sheet1
  33. End With
  34. End Sub
複製代碼
這樣就可以了。
不過這個程式,如果DOCS RECEIVED N RELEASED RECORD.xlsx的H欄幾列是合併的話,就讀不了只有第一個才會有資料,第二列開始就無資料。
作者: mark15jill    時間: 2013-3-11 08:19

回復  GBKEE


With Sheet1                        (這句是否改With State sheet?)
With Sheet2      ...
198188 發表於 2013-3-9 23:00



    With Sheet1                        (這句是否改With State sheet?)  這種寫法應該會出現錯誤
除非有另外宣告
作者: 198188    時間: 2013-3-13 11:31

回復 28# GBKEE

If Worksheets("OHC").Range("G" & i) - Date <= 2 Then
    Worksheets("OHC").Range("G" & i).Interior.Color = RGB(255, 251, 45)
    Worksheets("OHC").Range("G" & i).Font.ColorIndex = RGB(217, 24, 9)
    End If

請問大大,If Worksheets("OHC").Range("G" & i) - Date <= 2 Then 這句哪裡出現問題了?
作者: mark15jill    時間: 2013-3-13 12:19

回復  GBKEE

If Worksheets("OHC").Range("G" & i) - Date
198188 發表於 2013-3-13 11:31



    If Worksheets("OHC").Range("G" & i) - Date   
  把兩段分開
If Worksheets("OHC").Range("G" & i)
-
Date
作者: GBKEE    時間: 2013-3-13 12:30

回復 32# 198188
If Worksheets("OHC").Range("G" & i) - Date <= 2 Then 這句哪裡出現問題了?
條件式:  Range("G?")(<- 必需是日期) - Date(當天日期)<=2(天)
你說出現問題了 ,請說明白!!
作者: 198188    時間: 2013-3-13 12:48

回復 34# GBKEE


    兩個都是日期,但是電腦說typing mistake, 所以我想問是不是我的語法有錯?
作者: GBKEE    時間: 2013-3-13 14:23

回復 35# 198188
typing mistake 的翻譯是輸入錯誤
請檢查 Range("g?")是否是數字,或傳上檔案看看
作者: Hsieh    時間: 2013-3-13 14:53

回復 32# 198188


    應該這句錯誤
Worksheets("OHC").Range("G" & i).Font.ColorIndex = RGB(217, 24, 9)
ColorIndex 應該是數值不可使用RGB
可改成
Worksheets("OHC").Range("G" & i).Font.Color = RGB(217, 24, 9)
作者: apolloooo    時間: 2013-3-15 09:34

like 會比較好用。




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