★ExcelVBA ~ 【配列の練習】指定したシート「以外」のシートの名前を、配列で返す自作関数のテスト作成(不完全だけど使えないことも無い)。ワークシートの一括削除などに一応使えます。
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
'Array()関数で指定したワークシート名「以外」のシート名を、
'「配列で」返してもらう関数。
'「s_AryWSNames」をArray()関数で指定する。
'v_AryAnotherWSNmGet01(Array("sheet1", "原本1", "原本2")) のような形。
'この関数では、英語のシート名の場合、大文字小文字は区別されません。
'
'テストは、
'? Join(v_AryAnotherWSNmGet01(Array("sheet1", "原本1", "原本2")),",")
'のように呼び出します。
'
'ワークシートの一括削除やその他に使えます。
'たとえばワークシートの削除なら以下のようにします。
'On Error Resume Next
'Worksheets(v_AryAnotherWSNmGet01(Array("sheet1", "原本1", "原本2"))).Delete
'しかしまだ完成しておらず、不完全で、使用には制約があります。(後述)
'ただ、そこだけ注意すれば使えることは使えます。
'配列の練習に作っただけなので、配列の練習課題にもなると思います・・・。
'
'Array()関数で指定するシートの数は自由です。
'が、しかし、指定するワークシートの名前は、
'「絶対に存在するシート名」じゃないといけないです。
'また、指定したシート以外に必ず何らかのワークシートがないとそれもだめです。
'でないと、配列をRedimしたときに数が狂ってエラーになってしまうので。
'そこだけ注意。
'なので、場合によっては、この関数を呼び出す際(前)に、
'そもそも「s_AryWSNamesに指定したシート」があるかどうかや
'それ以外のシートがちゃんとあるかどうか、のチェックをするか、
'なければダミーで作ってしまってから、この関数を呼び出す必要があります。
'場合によっては「On Error Resume Next」や「On Error GoTo 0」などと
'セットで使います。
'早い話、この関数は不完全です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
' ' '###################################################################### 'Array()関数で指定したワークシート名「以外」のシート名を、 '「配列で」返してもらう関数。 '「s_AryWSNames」をArray()関数で指定する。 'v_AryAnotherWSNmGet01(Array("sheet1", "原本1", "原本2")) のような形。 'この関数では、英語のシート名の場合、大文字小文字は区別されません。 ' 'テストは、 '? Join(v_AryAnotherWSNmGet01(Array("sheet1", "原本1", "原本2")),",") 'のように呼び出します。 ' 'ワークシートの一括削除やその他に使えます。 'たとえばワークシートの削除なら以下のようにします。 'On Error Resume Next 'Worksheets(v_AryAnotherWSNmGet01(Array("sheet1", "原本1", "原本2"))).Delete 'しかしまだ完成しておらず、不完全で、使用には制約があります。(後述) 'ただ、そこだけ注意すれば使えることは使えます。 '配列の練習に作っただけなので、配列の練習課題にもなると思います・・・。 ' 'Array()関数で指定するシートの数は自由です。 'が、しかし、指定するワークシートの名前は、 '「絶対に存在するシート名」じゃないといけないです。 'また、指定したシート以外に必ず何らかのワークシートがないとそれもだめです。 'でないと、配列をRedimしたときに数が狂ってエラーになってしまうので。 'そこだけ注意。 'なので、場合によっては、この関数を呼び出す際(前)に、 'そもそも「s_AryWSNamesに指定したシート」があるかどうかや 'それ以外のシートがちゃんとあるかどうか、のチェックをするか、 'なければダミーで作ってしまってから、この関数を呼び出す必要があります。 '場合によっては「On Error Resume Next」や「On Error GoTo 0」などと 'セットで使います。 '早い話、この関数は不完全です。 '###################################################################### Function v_AryAnotherWSNmGet01(s_AryWSNames As Variant) As Variant ' Dim s_AryWSNames As Variant 'デバッグ用 Dim o_WB01 As Workbook Dim o_ItemWS As Worksheet Dim i_WsAllCnt As Integer Dim v_Answ As Variant 'March関数でヒットした・しないの結果を格納する変数。ヒットしないと「Error型」の値が格納される。 ' Dim s_WsName01 As String 'デバッグ用 Dim i_ElmntCnt As Integer '引数の「s_AryWSNames」の要素の個数(1起点) Dim s_AryAnthWsNm01() As String 'シート名を入れる配列を用意。 Dim i_Cnt01 As Integer ' s_AryWSNames = Array("sheet1", "原本1", "原本2") ' Stop 'デバッグ用 Set o_WB01 = ThisWorkbook Let i_WsAllCnt = o_WB01.Worksheets.Count Let i_ElmntCnt = UBound(s_AryWSNames) + 1 '添え字の最大値じゃなくて要素の「個数」だから+1する If i_WsAllCnt = i_ElmntCnt Then MsgBox "削除すべきワークシートが無い可能性があります。よく確認してから再実行してください。" Exit Function Else End If ReDim s_AryAnthWsNm01(i_WsAllCnt - i_ElmntCnt - 1) '配列の再設定。普通にゼロ始りにしたので-1する。 Let i_Cnt01 = 0 For Each o_ItemWS In o_WB01.Worksheets Let v_Answ = Empty '念のため初期化。Error型の値が入ったりもするため。 Let v_Answ = Application.Match(o_ItemWS.Name, s_AryWSNames, 0) 'シート名の存在のチェック。 '「Let v_Answ = Application.WorksheetFunction.Match(o_ItemWS.Name, s_AryWSNames, 0)」と書くと 'なぜかエラーになってしまうため、というか、逆に、「WorksheetFunction.」を削ると、 'なぜかエラーにならないため、そうする。 If IsError(v_Answ) Then ' s_WsName01 = o_ItemWS.Name & """" & "," & """" & s_WsName01 'デバッグ用 Let s_AryAnthWsNm01(i_Cnt01) = o_ItemWS.Name '配列にシート名を入れていく。 Let i_Cnt01 = i_Cnt01 + 1 '次の要素への準備 End If Next ' Debug.Print """" & Left(s_WsName01, Len(s_WsName01) - 2) 'デバッグ用 Let v_AryAnotherWSNmGet01 = s_AryAnthWsNm01 '配列を返す。 ' Stop End Function ' ' |
- 投稿タグ
- AccessVBA, Accessの独学, Access操作の基礎, ExcelVBA, Excel連携VBA, パソコンでの自動化, マクロ, 独学, 自動化, 配列