Board logo

標題: [發問] VLookup Vba用法 [打印本頁]

作者: ziv976688    時間: 2021-9-30 06:42     標題: VLookup Vba用法

本帖最後由 ziv976688 於 2021-9-30 06:43 編輯

想將下列的函數公式化為程式碼~
.[A4:A10].Formula = "=IF(A$1="""","""",VLOOKUP(A$1,DATA!$A:$H,ROW()-2,))": .[A4:A10] = .[A4:A10].Value    '列132
現改為程式碼
If .Cells(1, 1) <> "" Then .Range("A4:A10") = Application.VLookup(.Range("A1"), Sheets("DATA").Range("A:H"), Row() - 2, 0)    '列133

列133產生偵錯
[attach]34095[/attach]
請問:正確語法應該如何編寫?
懇請各位大大賜教。謝謝!

[attach]34096[/attach]
作者: samwang    時間: 2021-9-30 10:01

回復 1# ziv976688


If .[a1] <> "" Then For i = 4 To 10: .Cells(i, 1) = Application.VLookup(.Range("A1"), Sheets("DATA").Range("A:H"), i - 2, 0): Next
作者: samwang    時間: 2021-9-30 12:58

回復 1# ziv976688


.[A4:A10].Formula = "=IF(A$1="""","""",VLOOKUP(A$1,DATA!$A:$H,ROW()-2,))": .[A4:A10] = .[A4:A10].Value    '列132
>> 請問原來那個'列132不是可以用嗎? 為何要改?
作者: ziv976688    時間: 2021-9-30 13:46

本帖最後由 ziv976688 於 2021-9-30 14:15 編輯

回復 2# samwang
測試成功
多學一招(原來Row( ),必須以 i = 4 To 10來表達)
謝謝您的指導~感恩

回復 3# samwang
只是想學習函數公式如何轉化為程式語法~
由函數公式比對程式碼~末學較能消化語法的意義。
謝謝您
作者: ziv976688    時間: 2021-9-30 20:16

回復 3# samwang
不好意思~末學尚有3個函數公式,想轉化為程式語法~
詳如範例附件 :  [attach]34101[/attach]

以上   懇請賜教。謝謝您!   

作者: samwang    時間: 2021-10-1 21:21

回復 5# ziv976688

末學尚有3個函數公式,想轉化為程式語法~
>> 如附件,26列的最小=0 的個數答案與你的效果檔有差異,請再確認您的條件需求為何? 謝謝
作者: ziv976688    時間: 2021-10-2 00:17

本帖最後由 ziv976688 於 2021-10-2 00:38 編輯

回復 6# samwang
不好意思 ,測試未達結果~
測試好幾次,都在   .EntireColumn.AutoFit    '列172處中斷~如圖片
[attach]34108[/attach]
如果將  .EntireColumn.AutoFit  改為註解後~
再點執行~螢幕會變黑屏~檔案也關不掉~只能強制重新開機後~再測試~測試好幾次,都是如此

懇請賜正
謝謝您

作者: samwang    時間: 2021-10-2 08:54

回復 7# ziv976688


測試好幾次,都在   .EntireColumn.AutoFit    '列172處中斷~如圖片
>> 我測試沒問題,請看附件,可以先設中斷點在'列172的前面幾個,然後執行程式到中斷點後再按F8去偵測除錯,
請再測試看看,謝謝

作者: ziv976688    時間: 2021-10-2 10:43

本帖最後由 ziv976688 於 2021-10-2 10:45 編輯

回復 8# samwang
不好意思,依照您的說明操作,按執行鍵後~得如下偵錯點圖片~
[attach]34113[/attach]
再按F8~沒有反應

因為是初次操作如上的步驟,我也不知道步驟對不對?更不知道如何逐段偵錯~
所以乾脆將"版面格式"的程式碼全段改為註解~
再按執行鍵~可以正常而得到結果了。

測試結果 : W26有誤~答案應為 1
因為W51= 0
詳如附件範例 : [attach]34114[/attach]

以上  懇請賜正
謝謝您

作者: ziv976688    時間: 2021-10-2 19:29

本帖最後由 ziv976688 於 2021-10-2 19:58 編輯

回復 8# samwang
請參考本新附件範例即可
[attach]34121[/attach]
C26 : AY26補充說明 :
.[c26].Resize(1, 49)的搜尋範圍=.Range("c51:ay" & R);統計範圍=由c51起始每跳17列的儲存格。

.[c26:ay26]顯示的數字或文字的程式邏輯~
統計範圍各個單欄為各統計標的~
當某單欄全部=""時,則該欄第26列儲存格顯示""
EX1 : C欄統計範圍全部=""則C26=""
EX2 : E欄統計範圍全部=""則E26=""

其餘......類推。

當某單欄只要有顯示="0"的數字時,則將該欄有顯示="0"的總個數,填入第26列儲存格。
EX 1 : W 欄的統計範圍W51有顯示0;則W26=1
EX 2 : AC欄的統計範圍AC85有顯示0;則AC26=1

當某單欄都沒有顯示="0"的數字;有顯示其它>0的數字時,則在該欄第26列儲存格,填入"V"。
EX 1 : D欄都沒有顯示="0"的數字;D136=2,則D26=V
EX 2 : F欄都沒有顯示="0"的數字;F119=1F136=2則F26=V
其餘......類推。
詳如附件 : 7T前3大&小+0_0_1894期_100_6個_1次(需求效果檔)

目前效果檔的 W26=V~其答案有誤~
因為W51有顯示0
所以W26答案應為1


以上   懇請賜正
謝謝您 !

作者: ziv976688    時間: 2021-10-3 00:25

本帖最後由 ziv976688 於 2021-10-3 00:53 編輯

回復 8# samwang
參考   http://forum.twbts.com/thread-23380-1-1.html   8#的貴解~
If Arr(i, j) = 0 Then n = n + 1: Arr(1, j) = n Else Arr(1, j) = "V": GoTo 100]    '列167
改為
    If Arr(i, j) = 0 Then n = n + 1    '列167
    If n > 0 Then Arr(1, j) = n Else Arr(1, j) = "V": GoTo 100    '列168
跑出來的答案是正確的。
但不知道這樣改對不對 ? (沒有自信)

以上  懇請賜正
謝謝您

作者: samwang    時間: 2021-10-3 07:25

回復 11# ziv976688

只要有嘗試寫,就會有進步,修改如下,請測試看看,謝謝
        If Arr(i, j) = 0 Then
            n = n + 1: Arr(1, j) = n
        ElseIf Arr(i, j) > 0 And n = 0 Then
           Arr(1, j) = "V"
        End If
作者: ziv976688    時間: 2021-10-3 13:34

回復 12# samwang
OK了
謝謝您的耐心指導和熱心幫忙~受益良多~感恩

作者: ziv976688    時間: 2021-10-4 06:52

本帖最後由 ziv976688 於 2021-10-4 07:11 編輯

回復 12# samwang
[attach]34129[/attach]
不好意思,最後2個問題~勞駕您賜正~謝謝您

問題1:
7T_搜尋(統)字檔(主檔)_1003(C2_C26=VBA)執行後的效果檔~
統計"0"的個數~在C26都會固定多1個(以7T_搜尋(統)字檔(主檔)_0930(C2_C26=fx)的效果檔比對)~
請詳見:7T前3大&小_0_1902期_100_7個_1次(C26=VBA效果檔);7T前3大&小_0_1902期_100_14個_1次(C26=VBA效果檔)
PS:如果您要測試14個檔案的話~請將另7個7RA統的檔案,置入子資料夾內後~再執行(主檔)即可

問題2:
7T_搜尋(統)字檔(主檔)_1003(C2_C26=VBA)的列191~列197程式碼不能執行~
如果執行~會在列195自動欄寬產生"偵錯"~然後無法關閉檔案~會當機~必須強制重新開機

備註:
如果將7T_搜尋(統)字檔(主檔)_1003(C2_C26=VBA)的
列3改為
Dim Path As String, A, Ar(1 To 1000, 1 To 2), Arr, Brr(1 To 7), Crr, T, i&, j& ', n%, ci%, cj%, ai%
列142~列145改為執行
列147~列176改為註解
列191~列197改為執行
即=7T_搜尋(統)字檔(主檔)_0930(C2_C26=fx)
列191~列197的程式碼就可以執行

以上   懇請賜教。謝謝您    

作者: samwang    時間: 2021-10-4 07:47

回復 14# ziv976688


問題1: >> 已更新,如附件,請測試看看,謝謝。

問題2:
7T_搜尋(統)字檔(主檔)_1003(C2_C26=VBA)的列191~列197程式碼不能執行~
如果執行~會在列195自動欄寬產生"偵錯"~然後無法關閉檔案~會當機~必須強制重新開機
>> 問題2,我測試沒問題,另外列191~197(版面設定),後學認為是多餘的可以移除,
因為後面程式列200 是將整個原來檔案格式整個copy ,然後另存新檔,所以不用再每次重新設定,
清除舊資料時,需用.ClearContents,不可用.Delete(原格式設定清除),謝謝

作者: ziv976688    時間: 2021-10-4 09:17

本帖最後由 ziv976688 於 2021-10-4 09:46 編輯

回復 15# samwang
測試結果 :
問題1 :
列147 改為    Crr = .Range("c2:ay16"): Arr = .Range("c47:ay" & R): n = 0
問題已解決

問題2 :
因為細查後~發現BUG出在  .Font.Name = "Verdana" '字體;
而我所需要的是 .EntireColumn.AutoFit  '自動欄寬 (Sheets("Sheet1")預先設定的"自動欄寬"~無效~因為每期的欄寬是浮動不定的)

如貴建議~將 .Font.Name = "Verdana"
'字體移除
問題已解決

謝謝您的耐心指導和熱心幫忙~受益良多~感恩





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