因為感謝的事情太多了

所以就謝天吧

攝影師:Negative Space,連結:Pexels

2020年09月20日,我為了專案的測試計畫能更自動的撰寫,研究了EXCEL巨集(VBA語法),雖然網路上資源很多,有很多很厲害的語法,但是對於初學者來說,如何思考要使用什麼樣的資源,並寫下自己改良的code,這思考的流程,我想要把它紀錄下來,這一系列的文章,總共會分為以下主題,如你有興趣可以直接連接到那一篇去看。

第四個部分,使用迴圈遇到超出陣列索引怎麼辦?

我期待的是,超出陣列索引時,直接忽略此錯誤,繼續進行下個變數。

我在google搜尋了「陣列索引超出範圍」,無法解決問題,後來又搜尋了「vba 迴圈超出索引 執行下個」,也無法解決問題,不過倒是有看到一個對迴圈詳細介紹的相關資源。

Excel VBA 程式設計教學:迴圈控制,For Loop、For Each 與 Do Loop

看完之後,知道沒有一個迴圈可以做到忽略錯誤變數,所以我後來轉向用if else,在for迴圈裡面放入if 某條件=false,不處理,else 我要處理的項目。

這過程當中我也曾經犯下一些錯誤,像是不處理那一塊曾寫成 變數 = 變數 +1,這樣的寫法如果只有一個變數不見還好,但若是連續兩個變數都不見時,仍會出錯,所以並不能這樣寫。

因為我要處理的問題是,變數導向許多分頁,但有可能會有某分頁被刪除了,所以我後來改成搜尋「vba判斷分頁是否存在」,並搜尋到以下資源,請參考以下網址版本二的寫法。

[VBA ] 檢查工作表是否存在

在code裡面,我在原本的基礎上面,增加了一些註解,給大家參考可以怎麼修改這組code。

看完這組code的註解,你可以學習到以下資訊。

1.迴圈語法遇到超出陣列索引怎麼處理?

2.判斷分頁是否存在,新增function搜尋特定工作表,如無此工作表回傳false

3.如果有sub、if、with等,別忘了使用完之後要有End sub、End if、End with,不然都會跳出錯誤,我遇到錯誤是有Next卻沒有for

4.簡單清空某欄的語法

Function checkSheetName(sheetname)
'檢查活頁簿是否存在的以下語法
isfind = False
For Each st In Sheets
If st.Name = sheetname Then
isfind = True
Exit For
End If
Next
checkSheetName = isfind
End Function

Sub 回傳案例()
Set A = Sheets("工作表1")
With A.Activate
'指定分頁
Crow = Range("A" & Cells.Rows.Count).End(xlUp).Row
For j = 9 To Crow - 1
' -1是因為我只要迴圈到倒數第二行(列)
sheetname = ("T" & A.Cells(j, 1))
'sheetname是底下function要執行的內容,分頁名稱請參考第二篇。
If checkSheetName(sheetname) = False Then

'不處理,所以什麼都沒key
Else
A.Range("F" & j) = Worksheets("T" & A.Cells(j, 1)).Range("D1")
'將右邊的值回傳到左邊,語法最前面的A是工作表1的代稱。
Worksheets("T" & A.Cells(j, 1)).Range("D1") = ""
'簡單清空D1的方法
End If
'End if勿漏掉
Next j
End With
'End with勿漏掉
End Sub

喜歡這篇文章,可以免費加入liker.land會員,並在底下為我拍手5下表達支持,會轉為實質收益,以利我支付網站營運費用,也歡迎留言告訴我你的看法,真心感謝你看完這篇文章。