'***************************************************************************************************
'* 処理名 :TEST1
'* 機能 :固定配列のサンプル①
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2006年11月07日
'* 作成者 :井上 治
'* 更新日 :2020年02月11日
'* 更新者 :井上 治
'* 機能説明:⇒配列変数を使わない、あるいは知らない場合は?
'* 注意事項:
'***************************************************************************************************
Sub TEST1()
'-----------------------------------------------------------------------------------------------
Dim lngRow As Long ' 行INDEX
Dim tblItem1 As String ' 文字列WORK①
Dim tblItem2 As String ' 文字列WORK②
Dim tblItem3 As String ' 文字列WORK③
Dim tblItem4 As String ' 文字列WORK④
Dim tblItem5 As String ' 文字列WORK⑤
' シートのクリア
Cells.ClearContents
' 配列の各要素に値を格納
tblItem1 = "あああ"
tblItem2 = "いいい"
tblItem3 = "ううう"
tblItem4 = "えええ"
tblItem5 = "おおお"
' 結果をシートに展開してみる
For lngRow = 1 To 5
' 変数名に番号が表意していてもループ処理の意味がない!
Select Case lngRow
Case 1: Cells(lngRow, 1).Value = tblItem1
Case 2: Cells(lngRow, 1).Value = tblItem2
Case 3: Cells(lngRow, 1).Value = tblItem3
Case 4: Cells(lngRow, 1).Value = tblItem4
Case 5: Cells(lngRow, 1).Value = tblItem5
End Select
Next lngRow
End Sub
'***************************************************************************************************
'* 処理名 :TEST2
'* 機能 :固定配列のサンプル②
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2006年11月07日
'* 作成者 :井上 治
'* 更新日 :2020年02月11日
'* 更新者 :井上 治
'* 機能説明:⇒シートの行列と同様に要素番号を1から始まる配列としてみる。
'* 注意事項:
'***************************************************************************************************
Sub TEST2()
'-----------------------------------------------------------------------------------------------
Dim lngRow As Long ' 行INDEX
Dim tblItem(1 To 5) As String ' 要素数5個(1~5)の配列
' シートのクリア
Cells.ClearContents
' 配列の各要素に値を格納
tblItem(1) = "あああ"
tblItem(2) = "いいい"
tblItem(3) = "ううう"
tblItem(4) = "えええ"
tblItem(5) = "おおお"
' 配列の要素番号範囲の確認
Debug.Print LBound(tblItem) & "~" & UBound(tblItem)
' 結果をシートに展開してみる
For lngRow = 1 To 5
Cells(lngRow, 1).Value = tblItem(lngRow)
Next lngRow
End Sub
'***************************************************************************************************
'* 処理名 :TEST3
'* 機能 :固定配列のサンプル③
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2006年11月07日
'* 作成者 :井上 治
'* 更新日 :2020年02月11日
'* 更新者 :井上 治
'* 機能説明:⇒要素番号を0から始まる配列としてみる。(これがデフォルト)
'* 注意事項:
'***************************************************************************************************
Sub TEST3()
'-----------------------------------------------------------------------------------------------
Dim lngRow As Long ' 行INDEX
Dim lngIx As Long ' テーブルINDEX
Dim tblItem(4) As String ' 要素数5個(0~4)の配列
' シートのクリア
Cells.ClearContents
' 配列の各要素に値を格納
tblItem(0) = "あああ"
tblItem(1) = "いいい"
tblItem(2) = "ううう"
tblItem(3) = "えええ"
tblItem(4) = "おおお"
' 配列の要素番号範囲の確認
Debug.Print LBound(tblItem) & "~" & UBound(tblItem)
' 結果をシートに展開してみる
For lngIx = 0 To 4
lngRow = lngIx + 1 ' 行番号は「1」始まり
Cells(lngRow, 1).Value = tblItem(lngIx)
Next lngIx
End Sub
'***************************************************************************************************
'* 処理名 :TEST4
'* 機能 :固定配列のサンプル④
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2006年11月07日
'* 作成者 :井上 治
'* 更新日 :2020年02月11日
'* 更新者 :井上 治
'* 機能説明:⇒定数的な件数の少ない配列はArray関数で作成することも可能
'* 注意事項:
'***************************************************************************************************
Sub TEST4()
'-----------------------------------------------------------------------------------------------
Dim lngRow As Long ' 行INDEX
Dim lngIx As Long ' テーブルINDEX
Dim tblItem As Variant ' 要素数不定の配列
' シートのクリア
Cells.ClearContents
' 配列の各要素に値を格納(要素0~4となる)
tblItem = Array("あああ", "いいい", "ううう", "えええ", "おおお")
' 配列の要素番号範囲の確認
Debug.Print LBound(tblItem) & "~" & UBound(tblItem)
' 結果をシートに展開してみる
For lngIx = 0 To 4
lngRow = lngIx + 1 ' 行番号は「1」始まり
Cells(lngRow, 1).Value = tblItem(lngIx)
Next lngIx
End Sub
'***************************************************************************************************
'* 処理名 :TEST5
'* 機能 :固定配列のサンプル⑤
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2006年11月07日
'* 作成者 :井上 治
'* 更新日 :2020年02月11日
'* 更新者 :井上 治
'* 機能説明:⇒宣言段階では要素数を決めないサンプル
'* 注意事項:
'***************************************************************************************************
Sub TEST5()
'-----------------------------------------------------------------------------------------------
Dim lngRow As Long ' 行INDEX
Dim lngIx As Long ' テーブルINDEX
Dim tblItem As Variant ' 要素数不定の配列
' シートのクリア
Cells.ClearContents
' 先に要素数を決定する
ReDim tblItem(4)
' 配列の各要素に値を格納
tblItem(0) = "あああ"
tblItem(1) = "いいい"
tblItem(2) = "ううう"
tblItem(3) = "えええ"
tblItem(4) = "おおお"
' 配列の要素番号範囲の確認
Debug.Print LBound(tblItem) & "~" & UBound(tblItem)
' 結果をシートに展開してみる
For lngIx = 0 To 4
lngRow = lngIx + 1 ' 行番号は「1」始まり
Cells(lngRow, 1).Value = tblItem(lngIx)
Next lngIx
End Sub
'***************************************************************************************************
' 配列の勉強 Module2(Module)
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev 変更履歴内容------------------------------------------------------------------------>
'06/11/07(1.00)新規作成
'16/11/19(1.10)*.xlsm化
'20/02/11(1.11)記述整理等
'***************************************************************************************************
Option Explicit
Option Base 1 ' 配列要素の最小値を「1」とする宣言
'***************************************************************************************************
'* 処理名 :TEST6
'* 機能 :固定配列のサンプル⑥
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2006年11月07日
'* 作成者 :井上 治
'* 更新日 :2020年02月11日
'* 更新者 :井上 治
'* 機能説明:⇒シートの行列と同様に要素番号を1から始まる配列としてみる。
'* 注意事項:
'***************************************************************************************************
Sub TEST6()
'-----------------------------------------------------------------------------------------------
Dim lngRow As Long ' 行INDEX
Dim tblItem(5) As String ' 要素数5個(1~5)の配列
' シートのクリア
Cells.ClearContents
' 配列の各要素に値を格納
tblItem(1) = "あああ"
tblItem(2) = "いいい"
tblItem(3) = "ううう"
tblItem(4) = "えええ"
tblItem(5) = "おおお"
' 配列の要素番号範囲の確認
Debug.Print LBound(tblItem) & "~" & UBound(tblItem)
' 結果をシートに展開してみる
For lngRow = 1 To 5
Cells(lngRow, 1).Value = tblItem(lngRow)
Next lngRow
End Sub
'***************************************************************************************************
'* 処理名 :TEST7
'* 機能 :固定配列のサンプル⑦
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2006年11月07日
'* 作成者 :井上 治
'* 更新日 :2020年02月11日
'* 更新者 :井上 治
'* 機能説明:⇒定数的な件数の少ない配列はArray関数で作成することも可能
'* 注意事項:
'***************************************************************************************************
Sub TEST7()
'-----------------------------------------------------------------------------------------------
Dim lngRow As Long ' 行INDEX
Dim lngIx As Long ' テーブルINDEX
Dim tblItem As Variant ' 要素数不定の配列
' シートのクリア
Cells.ClearContents
' 配列の各要素に値を格納(要素0~4となる?)
tblItem = Array("あああ", "いいい", "ううう", "えええ", "おおお")
' 配列の要素番号範囲の確認
Debug.Print LBound(tblItem) & "~" & UBound(tblItem)
' 結果をシートに展開してみる
lngRow = 0
For lngIx = LBound(tblItem) To UBound(tblItem)
lngRow = lngRow + 1 ' 行番号は「1」始まり
Cells(lngRow, 1).Value = tblItem(lngIx)
Next lngIx
End Sub
'------------------------------------------<< End of Source >>--------------------------------------
'***************************************************************************************************
' 配列の勉強 ※重複のない値だけ配列に格納するサンプル① Module1(Module)
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev 変更履歴内容------------------------------------------------------------------------>
'06/11/07(1.00)新規作成
'16/11/19(1.10)*.xlsm化
'20/01/17(1.11)記述整理等
'***************************************************************************************************
Option Explicit
'Option Base 1 ' 配列の最小要素番号を「1」に固定する宣言(本サンプルでは使用しない)
'===================================================================================================
Private Const g_cnsSh1 As String = "元データ"
Private Const g_cnsSh2 As String = "処理結果"
'***************************************************************************************************
' ■■■ シート側からの起動処理 ■■■
'***************************************************************************************************
'* 処理名 :TEST1
'* 機能 :重複のない値だけ配列に格納するサンプル①
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2006年11月07日
'* 作成者 :井上 治
'* 更新日 :2020年01月17日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:⇒シートの行列と同様に要素番号を1から始まる配列としてみる。
'***************************************************************************************************
Sub TEST1()
'-----------------------------------------------------------------------------------------------
Dim objSh1 As Worksheet ' 元データシート
Dim objSh2 As Worksheet ' 処理結果シート
Dim lngRow As Long ' 行INDEX
Dim lngIx As Long ' テーブルINDEX
Dim lngIxMax As Long ' テーブルINDEX上限
Dim strText As String ' テキストWORK
Dim tblText() As String ' テキストテーブル
Set objSh1 = Worksheets(g_cnsSh1) ' 元データ
Set objSh2 = Worksheets(g_cnsSh2) ' 処理結果
' 処理結果をクリア
objSh2.Cells.ClearContents
' 配列要素とインデックスをクリア(最小要素番号を「1」とする)
lngIxMax = 0
ReDim tblText(1 To 1)
'-----------------------------------------------------------------------------------------------
' 配列格納ループ(元データ最終行まで繰り返し)
For lngRow = 1 To objSh1.Range("$A$" & objSh1.Rows.Count).End(xlUp).Row
' Object参照を最小限にするため値(A列)を変数に格納
strText = Trim(objSh1.Cells(lngRow, 1).Value)
' 探し出しループ
lngIx = 1
Do While lngIx <= lngIxMax
' 見つかったらループ脱出
If tblText(lngIx) = strText Then Exit Do
' 次へ
lngIx = lngIx + 1
Loop
' 見つからない(途中脱出でない)時は配列に追加
If lngIx > lngIxMax Then
' 配列要素を加算してセット
lngIxMax = lngIx
ReDim Preserve tblText(1 To lngIxMax)
' イミディエイトに処理状態を出力
Debug.Print "(" & lngIxMax & ")=" & strText
tblText(lngIxMax) = strText
End If
Next lngRow
' イミディエイトに配列要素数を出力
Debug.Print LBound(tblText) & "~" & UBound(tblText)
'-----------------------------------------------------------------------------------------------
lngRow = 1
' 作成した配列を処理結果にセット(実際は一括でセットできるが記述サンプルなので....)
Do While lngRow <= lngIxMax
objSh2.Cells(lngRow, 1).Value = tblText(lngRow)
' 次の行へ
lngRow = lngRow + 1
Loop
'-----------------------------------------------------------------------------------------------
' 終了
objSh2.Activate
Set objSh1 = Nothing
Set objSh2 = Nothing
End Sub
'------------------------------------------<< End of Source >>--------------------------------------
'***************************************************************************************************
' 配列の勉強 ※重複のない値だけ配列に格納するサンプル② Module2(Module)
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev 変更履歴内容------------------------------------------------------------------------>
'06/11/07(1.00)新規作成
'16/11/19(1.10)*.xlsm化
'20/01/17(1.11)記述整理等
'***************************************************************************************************
Option Explicit
'===================================================================================================
Private Const g_cnsSh1 As String = "元データ"
Private Const g_cnsSh2 As String = "処理結果"
'***************************************************************************************************
' ■■■ シート側からの起動処理 ■■■
'***************************************************************************************************
'* 処理名 :TEST2
'* 機能 :重複のない値だけ配列に格納するサンプル②
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2006年11月07日
'* 作成者 :井上 治
'* 更新日 :2020年01月17日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:⇒要素番号を0から始まる配列としてみる。(この方法がデフォルト)
'***************************************************************************************************
Sub TEST2()
'-----------------------------------------------------------------------------------------------
Dim objSh1 As Worksheet ' 元データシート
Dim objSh2 As Worksheet ' 処理結果シート
Dim lngRow As Long ' 行INDEX
Dim lngIx As Long ' テーブルINDEX
Dim lngIxMax As Long ' テーブルINDEX上限
Dim strText As String ' テキストWORK
Dim tblText() As String ' テキストテーブル
Set objSh1 = Worksheets(g_cnsSh1) ' 元データ
Set objSh2 = Worksheets(g_cnsSh2) ' 処理結果
' 処理結果をクリア
objSh2.Cells.ClearContents
' 配列要素とインデックスをクリア
lngIxMax = -1
ReDim tblText(0)
'-----------------------------------------------------------------------------------------------
' 配列格納ループ(元データ最終行まで繰り返し)
For lngRow = 1 To objSh1.Range("$A$" & objSh1.Rows.Count).End(xlUp).Row
' Object参照を最小限にするため値を変数に格納
strText = Trim(objSh1.Cells(lngRow, 1).Value)
' 探し出しループ
lngIx = 0
Do While lngIx <= lngIxMax
' 見つかったらループ脱出
If tblText(lngIx) = strText Then Exit Do
' 次へ
lngIx = lngIx + 1
Loop
' 見つからない(途中脱出でない)時は配列に追加
If lngIx > lngIxMax Then
' 配列要素を加算してセット
lngIxMax = lngIx
ReDim Preserve tblText(lngIxMax)
' イミディエイトに処理状態を出力
Debug.Print "(" & lngIxMax & ")=" & strText
tblText(lngIxMax) = strText
End If
Next lngRow
' イミディエイトに配列要素数を出力
Debug.Print LBound(tblText) & "~" & UBound(tblText)
'-----------------------------------------------------------------------------------------------
lngIx = 0
' 作成した配列を処理結果にセット(実際は一括でセットできるが記述サンプルなので....)
Do While lngIx <= lngIxMax
' 行番号は1始まりなので1を加える
lngRow = lngIx + 1
objSh2.Cells(lngRow, 1).Value = tblText(lngIx)
' 次へ
lngIx = lngIx + 1
Loop
'-----------------------------------------------------------------------------------------------
' 終了
objSh2.Activate
Set objSh1 = Nothing
Set objSh2 = Nothing
End Sub
'------------------------------------------<< End of Source >>--------------------------------------
'***************************************************************************************************
' 配列の勉強 ※重複のない値だけ配列に格納するサンプル③ Module3(Module)
'
' 作成者:井上治 URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
' [参照設定]
' ・Microsoft Scripting Runtime
'***************************************************************************************************
'変更日付 Rev 変更履歴内容------------------------------------------------------------------------>
'06/11/07(1.00)新規作成
'16/11/19(1.10)*.xlsm化
'20/01/17(1.11)記述整理等
'***************************************************************************************************
Option Explicit
'===================================================================================================
Private Const g_cnsSh1 As String = "元データ"
Private Const g_cnsSh2 As String = "処理結果"
'***************************************************************************************************
' ■■■ シート側からの起動処理 ■■■
'***************************************************************************************************
'* 処理名 :TEST3
'* 機能 :重複のない値だけ配列に格納するサンプル③
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数 :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2006年11月07日
'* 作成者 :井上 治
'* 更新日 :2020年01月17日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:⇒配列ではないが同用途なのでDictionaryオブジェクトを使ってみる。
'***************************************************************************************************
Sub TEST3()
'-----------------------------------------------------------------------------------------------
Dim objSh1 As Worksheet ' 元データシート
Dim objSh2 As Worksheet ' 処理結果シート
Dim objDic As Scripting.Dictionary ' Dictionaryオブジェクト
Dim lngRow As Long ' 行INDEX
Dim strText As String ' テキストWORK
Dim vntItem As Variant ' Dictionaryの1要素WORK
Set objSh1 = Worksheets(g_cnsSh1) ' 元データ
Set objSh2 = Worksheets(g_cnsSh2) ' 処理結果
' Dictionaryオブジェクトの初期化
Set objDic = New Scripting.Dictionary
'-----------------------------------------------------------------------------------------------
' Dictionary格納ループ(元データ最終行まで繰り返し)
For lngRow = 1 To objSh1.Range("$A$" & objSh1.Rows.Count).End(xlUp).Row
strText = Trim(objSh1.Cells(lngRow, 1).Value)
' 既に格納済みか判定する
If objDic.Exists(strText) <> True Then
' 未格納なら加える
objDic.Add strText, strText
' イミディエイトに処理状態を出力
Debug.Print strText
End If
Next lngRow
'-----------------------------------------------------------------------------------------------
' 作成した配列を処理結果にセット
lngRow = 0
For Each vntItem In objDic.Items
' 行INDEXを加算して格納
lngRow = lngRow + 1
objSh2.Cells(lngRow, 1).Value = vntItem
Next vntItem
'-----------------------------------------------------------------------------------------------
' 終了
objSh2.Activate
Set objDic = Nothing
Set objSh1 = Nothing
Set objSh2 = Nothing
End Sub
'------------------------------------------<< End of Source >>--------------------------------------