vba遍歷字串 迴圈遍歷VBA中的指定工作表

2021-10-12 15:18:51 字數 2812 閱讀 9494

您在問題中顯示的**因以下原因而失敗:

assets = array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

assets是一種工作表,它是一種object,在為物件賦值時必須使用set:

set assets = array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

這會失敗,因為array("…")不是工作表。

您暗示您的**的早期版本會執行,但不會遍歷工作表。原因是:

msgbox activesheet.name

這將顯示活動工作表的名稱,但此迴圈中的任何內容都不會更改活動工作表。

我對你的解決方案不滿意,儘管它沒有明顯的錯誤。我看到太多的程式失敗了,因為程式設計師在乙個語句中做了太多。首先,宣告越複雜,首先要做的就越久,在後續維護中理解的時間就越長。有時原來的程式設計師得到的陳述略有錯誤;有時維護程式設計師在嘗試更新它時會出錯。在每種情況下,程式設計師花費的額外時間都沒有證明執行時的任何節省。

在解釋我的解決方案之前,有一些關於變體的背景知識。

如果我寫:

dim i as long

i將始終為長整數。

在執行時,編譯器/直譯器不必考慮遇到i時的內容:

i = i + 5

但是假設我寫道:

dim v as variant

v = 5

v = v + 5

v = "test"

v = v & " 1"

這是完全有效(有效但不明智)的**,因為variant可以包含數字,字串或工作表。但是每當我的**訪問v時,直譯器必須檢查v的當前內容的型別,並確定它是否適合當前情況。這很費時間。

我不想阻止你在適當的時候使用variants,因為它們非常有用,但你需要知道它們的開銷。

接下來我希望提倡使用有意義和系統的名稱。我根據我多年來使用的系統命名我的變數。我可以檢視我的任何程式/巨集,並知道變數是什麼。當我需要更新12或15個月前編寫的程式/巨集時,這可以節省時間。

我不喜歡:

dim assets as variant

assets = array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

因為" pipe_mat_tables"等不是資產;它們是工作表的名稱。我會寫:

dim wshtnames as variant

wshtnames = array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

我的第乙個提議是:

option explicit

sub test1()

dim wshtnames as variant

dim wshtnamecrnt as variant

wshtnames = array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

for each wshtnamecrnt in wshtnames

with worksheets(wshtnamecrnt)

debug.print "cell b1 of worksheet " & .name & " contains " & .range("b1").value

end with

next wshtnamecrnt

end sub

我可以將wshtnamecrnt命名為wshtname,但我被告知名稱應至少相差三個字元以避免使用錯誤的字元而不注意。

array函式返回包含陣列的變體。 for each語句的控制變數必須是物件或變體。這就是我將wshtnames和wshtnamecrnt定義為變體的原因。請注意,您的解決方案有效,因為工作表是乙個物件。

我使用了with worksheets(wshtnamecrnt),這意味著匹配的end with之前的任何**都可以通過在開頭有乙個句點來訪問此工作表的元件。因此.name和.range("b1").value引用worksheets(wshtnamecrnt)而不選擇工作表。這比任何替代方案都更快更清晰。

我使用debug.print而不是msgbox,因為它不那麼麻煩了。我的**執行時沒有必須為每個工作表按return,我在立即視窗中有乙個整潔的列表,我可以在閒暇時檢視。在開發期間,我的**中經常有很多debug.print語句,這就是為什麼我輸出乙個句子而不僅僅是工作表名稱或單元格值。

我的第二個提議是:

sub test2()

dim inxw as long

dim wshtnames as variant

wshtnames = array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

for inxw = lbound(wshtnames) to ubound(wshtnames)

with worksheets(wshtnames(inxw))

debug.print "cell b1 of worksheet " & .name & " contains " & .range("b1").value

end with

next inxw

end sub

此巨集與第乙個巨集具有相同的效果。我有時會發現for比for each更方便,儘管在這種情況下我無論如何都看不到任何優勢。請注意,即使wshtnames的下限始終為零,我也寫了lbound(wshtnames)。這只是我(過度?過度)精確。

希望這有幫助。

for迴圈遍歷字串

for迴圈和while迴圈很類似 1.可以讓程式中的某段 重複執行 2.可以遍歷容器型別中的每乙個資料 for迴圈的語法格式 for 臨時變數 in 容器型別的資料 字串,列表,元組,字典,range,集合 print 臨時變數 for迴圈遍歷字串中的每乙個資料 my str hello for v...

vba字串函式

trim string 去掉string左右兩端空白 ltrim string 去掉string左端空白 rtrim string 去掉string右端空白 len string 計算string長度 left string,x 取string左段x個字元組成的字串 right string,x 取...

VBA字串(十二)

字串是乙個字串行,可以由字母,數字,特殊字元或全部字元組成。如果乙個變數被包含在雙引號 中,則被認為是乙個字串。語法 variable name this is a string vb 簡單示例 str1 string only alphabets str2 132.45 only numbers ...