静的配列

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

静的配の構造とLBound関数, UBound関数について説明しています。

この教材についての過去の質問・感想

11445 : 受講生さんのコメント (2019-06-06 14:52:58)

小川慶一さん:

ありがとうございました!発見してなおせました。

> 受講生 さん:
>
> ファイル、拝見しました。
>
> formのf_InputDataは、使っていないということでOKですね。
>
> > どのコードが原因なのかお教えいただけますでしょうか
>
> その話をするには、まずコードを整形してからですね。
>
> [1] option explicit を先頭につけましょう。
> [2] sub ... end sub 内は一段インデントを。
> [3] そのほか、インデントいろいろダメなので、全面的にみなおす。
> [4] 不必要に複数行改行が入っている箇所は詰めて書く。
>
> 上記[1]-[4]を実施後、再検討のうえ、また相談ください。
> というか、上記[1]-[4]を行うだけでもだいぶコードの見落としよくなりますし、自力解決できるようになるかも。
>
> [3]については、分からないところがあるようでしたら、やれる範囲で、でOKです。
>
> よろしくお願いします。
>
>

Sub nijigenseitekihairetsu()
> 
> 
> Dim moto() As Variant
> 
> Dim mx
> mx = Sheets("Master data_Mapping").Range("A" & Rows.Count).End(xlUp).Row
> Dim cnt As Long
> Dim d As Variant
> Dim idx As Long
> 
> idx = 0
>     For cnt = 12 To mx  'A12から科目データが入っている。mxはデータの最後
>     d = Range("A" & cnt).Value  'dに日付データを ←インデントすべきです ogawa
>       
>       'それが2009.9月以降なら
>     '  If Year(d) = 2009 And Month(d) >= 9 Then
>       
>       ReDim Preserve moto(6, idx)
>       '配列変数motoに、上書きされないよう記録していく
>       'idxは取っていくデータを付番していくもの
>       moto(0, idx) = d
>    
>       moto(1, idx) = Sheets("Master data_Mapping").Range("A" & cnt).Value
>       moto(2, idx) = Sheets("Master data_Mapping").Range("A" & cnt).Offset(, 1).Value
>       moto(3, idx) = Sheets("Master data_Mapping").Range("A" & cnt).Offset(, 2).Value
>       moto(4, idx) = Sheets("Master data_Mapping").Range("A" & cnt).Offset(, 3).Value
>       moto(5, idx) = Sheets("Master data_Mapping").Range("A" & cnt).Offset(, 4).Value
>       moto(6, idx) = Sheets("Master data_Mapping").Range("A" & cnt).Offset(, 5).Value
>       
>       
>       idx = idx + 1
>       
>      
>       
>   
>    
>     Next
>  
> 
> '科目リストから科目の記入。セル確認
> 
> cellconfirm = MsgBox("リストからの科目記入はこのセルのスタートでよろしいですか?", vbYesNo)
> 
> If cellconfirm = vbNo Then
> Exit Sub
> End If
> 
> s = ActiveCell.Row
> startcell = ActiveCell.Address
> l = ActiveCell.End(xlDown).Row
> 
> r = l - s
> 
> 
> c = InputBox("勘定科目の隣に入れたいもののNoを入力 MRI英語科目:3 MRI日本語科目:4 COGNOS科目コード:5 COGNOS科目名:6")
> inputc = InputBox("科目の何列目の左となりに入力したいかをInput。例:すぐ左隣だったら1")
> 
> 
> Dim cHidari As Long
>     For cHidari = 0 To r
>         For cnt = LBound(moto, 2) To UBound(moto, 2)
>             If ActiveSheet.Range(startcell).Offset(cHidari).Value = moto(0, cnt) Then
>                
>                 ActiveSheet.Range(startcell).Offset(cHidari, inputc).Value = moto(c, cnt)
>             End If
>         Next
>     Next
> 
> 
> 
> 
> End Sub

>
>
>
> > 小川先生
> >
> > 勘定科目のデータを配列motoに格納して、一列目にある勘定科目をキーにし、情報(科目名や他システムでの科目名)を、任意のセル(他シートを含み、科目名表記が始まるところをActivecellにしてマクロを実行すると、リスト(moto)の何列目の情報を勘定科目から見て何列目に表示したいかをInputboxで変数として格納し、出力をする
> >
> > というコーディングをしているのですが、motoに格納したデータのあるシート内は成功するのですが他シートだとうまくいきません。
> >
> > どのコードが原因なのかお教えいただけますでしょうか
> > よろしくお願いいたします。
> >


11443 : 小川慶一の回答 (2019-06-06 13:00:43)

受講生 さん:

おもしろい質問、ありがとうございます。

>変数に置き換えるメリットがあれば教えてほしいです。

実務上のメリットはありません。

一方、講義では、入れ子構造が増えると受講生にとって理解が難しくなるので、極力、入れ子構造のままのプログラムを使った解説はしないようにしています。
ここでは、その意味もあり、あえて stAry(cnt) の値を st に代入してから話を進めています。

たとえば、以下では、パフォーマンスを考えたら、変数に置き換えるメリットはないので、sample2のコードのほうがsample1のコードより好ましいです。
ですが、Instr関数について解説するためのコードとしては、sample1のコードのほうがsample2のコードより好ましいです。

Sub sample1()
    Dim s As String
    Dim i As Integer
    
    s = Range("B2").Value
    i = InStr(s, "都")
    Range("C2").Value = Left(s, i)
End Sub
Sub sample2()
    Dim s As String
    
    s = Range("B2").Value
    Range("C2").Value = Left(s, InStr(s, "都"))
End Sub
Sub sample3()
    Range("C2").Value = Left(Range("B2").Value, InStr(Range("B2").Value, "都"))
End Sub



>
 Sub GetZangyoList_Array_GetList()
>     Worksheets("残業3").Activate
>     
>     Dim stAry(5) As String
>     Dim cnt As Long
>     For cnt = 0 To 5
>         stAry(cnt) = Range("I2").Offset(cnt).Value
>     Next
>     
>     Dim st As String
>     For cnt = 0 To 5
>         st = stAry(cnt)
>         Range("B1").Offset(, cnt).Value = st
>         Range("B2:B14").Offset(, cnt).Value = Worksheets(st).Range("C3:C15").Value
>     Next
> End Sub

>
> について
> st = stAry(cnt)と一度変数stに置き換えてから書きだしていますが、
> For cnt = 0 To 5
> Range("B1").Offset(, cnt).Value = stAry(cnt)
> Range("B2:B14").Offset(, cnt).Value = Worksheets(stAry(cnt)).Range("C3:C15").Value
> Next
> にしてもうまく実行されます。
> 変数に置き換えるメリットがあれば教えてほしいです。


11442 : 小川慶一の回答 (2019-06-06 12:47:58)

受講生 さん:

ファイル、拝見しました。

formのf_InputDataは、使っていないということでOKですね。

> どのコードが原因なのかお教えいただけますでしょうか

その話をするには、まずコードを整形してからですね。

[1] option explicit を先頭につけましょう。
[2] sub ... end sub 内は一段インデントを。
[3] そのほか、インデントいろいろダメなので、全面的にみなおす。
[4] 不必要に複数行改行が入っている箇所は詰めて書く。

上記[1]-[4]を実施後、再検討のうえ、また相談ください。
というか、上記[1]-[4]を行うだけでもだいぶコードの見落としよくなりますし、自力解決できるようになるかも。

[3]については、分からないところがあるようでしたら、やれる範囲で、でOKです。

よろしくお願いします。

Sub nijigenseitekihairetsu()


Dim moto() As Variant

Dim mx
mx = Sheets("Master data_Mapping").Range("A" & Rows.Count).End(xlUp).Row
Dim cnt As Long
Dim d As Variant
Dim idx As Long

idx = 0
    For cnt = 12 To mx  'A12から科目データが入っている。mxはデータの最後
    d = Range("A" & cnt).Value  'dに日付データを ←インデントすべきです ogawa
      
      'それが2009.9月以降なら
    '  If Year(d) = 2009 And Month(d) >= 9 Then
      
      ReDim Preserve moto(6, idx)
      '配列変数motoに、上書きされないよう記録していく
      'idxは取っていくデータを付番していくもの
      moto(0, idx) = d
   
      moto(1, idx) = Sheets("Master data_Mapping").Range("A" & cnt).Value
      moto(2, idx) = Sheets("Master data_Mapping").Range("A" & cnt).Offset(, 1).Value
      moto(3, idx) = Sheets("Master data_Mapping").Range("A" & cnt).Offset(, 2).Value
      moto(4, idx) = Sheets("Master data_Mapping").Range("A" & cnt).Offset(, 3).Value
      moto(5, idx) = Sheets("Master data_Mapping").Range("A" & cnt).Offset(, 4).Value
      moto(6, idx) = Sheets("Master data_Mapping").Range("A" & cnt).Offset(, 5).Value
      
      
      idx = idx + 1
      
     
      
  
   
    Next
 

'科目リストから科目の記入。セル確認

cellconfirm = MsgBox("リストからの科目記入はこのセルのスタートでよろしいですか?", vbYesNo)

If cellconfirm = vbNo Then
Exit Sub
End If

s = ActiveCell.Row
startcell = ActiveCell.Address
l = ActiveCell.End(xlDown).Row

r = l - s


c = InputBox("勘定科目の隣に入れたいもののNoを入力 MRI英語科目:3 MRI日本語科目:4 COGNOS科目コード:5 COGNOS科目名:6")
inputc = InputBox("科目の何列目の左となりに入力したいかをInput。例:すぐ左隣だったら1")


Dim cHidari As Long
    For cHidari = 0 To r
        For cnt = LBound(moto, 2) To UBound(moto, 2)
            If ActiveSheet.Range(startcell).Offset(cHidari).Value = moto(0, cnt) Then
               
                ActiveSheet.Range(startcell).Offset(cHidari, inputc).Value = moto(c, cnt)
            End If
        Next
    Next




End Sub




> 小川先生
>
> 勘定科目のデータを配列motoに格納して、一列目にある勘定科目をキーにし、情報(科目名や他システムでの科目名)を、任意のセル(他シートを含み、科目名表記が始まるところをActivecellにしてマクロを実行すると、リスト(moto)の何列目の情報を勘定科目から見て何列目に表示したいかをInputboxで変数として格納し、出力をする
>
> というコーディングをしているのですが、motoに格納したデータのあるシート内は成功するのですが他シートだとうまくいきません。
>
> どのコードが原因なのかお教えいただけますでしょうか
> よろしくお願いいたします。
>


11441 : 受講生さんのコメント (2019-06-06 05:43:30)

 Sub GetZangyoList_Array_GetList()
    Worksheets("残業3").Activate
    
    Dim stAry(5) As String
    Dim cnt As Long
    For cnt = 0 To 5
        stAry(cnt) = Range("I2").Offset(cnt).Value
    Next
    
    Dim st As String
    For cnt = 0 To 5
        st = stAry(cnt)
        Range("B1").Offset(, cnt).Value = st
        Range("B2:B14").Offset(, cnt).Value = Worksheets(st).Range("C3:C15").Value
    Next
End Sub


について
st = stAry(cnt)と一度変数stに置き換えてから書きだしていますが、
For cnt = 0 To 5
Range("B1").Offset(, cnt).Value = stAry(cnt)
Range("B2:B14").Offset(, cnt).Value = Worksheets(stAry(cnt)).Range("C3:C15").Value
Next
にしてもうまく実行されます。
変数に置き換えるメリットがあれば教えてほしいです。


11439 : 受講生さんのコメント (2019-06-05 14:20:46)

小川先生

勘定科目のデータを配列motoに格納して、一列目にある勘定科目をキーにし、情報(科目名や他システムでの科目名)を、任意のセル(他シートを含み、科目名表記が始まるところをActivecellにしてマクロを実行すると、リスト(moto)の何列目の情報を勘定科目から見て何列目に表示したいかをInputboxで変数として格納し、出力をする

というコーディングをしているのですが、motoに格納したデータのあるシート内は成功するのですが他シートだとうまくいきません。

どのコードが原因なのかお教えいただけますでしょうか
よろしくお願いいたします。


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 式と戻り値1-データ型のおさらい
    【動画1】 式と戻り値1-データ型のおさらい 未習得
  2. 【動画2】 式と戻り値2-「式」と「戻り値」
    【動画2】 式と戻り値2-「式」と「戻り値」 未習得
  3. 【動画3】 式と戻り値3-「式」と「戻り値のデータ型」
    【動画3】  式と戻り値3-「式」と「戻り値のデータ型」 未習得
  4. 【動画4】 式と戻り値4-「式」とは(その1)
    【動画4】 式と戻り値4-「式」とは(その1) 未習得
  5. 【動画5】 式と戻り値5-「式」とは(その2)
    【動画5】 式と戻り値5-「式」とは(その2) 未習得
  6. 【動画6】 式と戻り値6-戻り値を返す式、戻り値を返さない式
    【動画6】  式と戻り値6-戻り値を返す式、戻り値を返さない式 未習得
  7. 【動画7】 コレクションとインデックス
    【動画7】  コレクションとインデックス 未習得
  8. 【動画8】 配列
    【動画8】 配列 未習得
  9. 【動画9】 静的配列
    【動画9】 静的配列 未習得
  10. 【動画10】 動的配列1-動的配列の基本
    【動画10】 動的配列1-動的配列の基本 未習得
  11. 【動画11】 動的配列2-Preserveキーワード
    【動画11】 動的配列2-Preserveキーワード 未習得
  12. 【動画12】 動的配列3-演習
    【動画12】 動的配列3-演習 未習得
  13. 【動画13】 多次元配列の基本
    【動画13】 多次元配列の基本 未習得
  14. 【動画14】 多次元動的配列
    【動画14】 多次元動的配列 未習得
  15. 【動画15】 多次元配列のサイズを調べる
    【動画15】 多次元配列のサイズを調べる 未習得
  16. 【動画16】 配列操作の便利関数、オプション、その他
    【動画16】  配列操作の便利関数、オプション、その他 未習得
  17. 【動画17】 連想配列1-Dictionaryオブジェクトの仕様
    【動画17】 連想配列1-Dictionaryオブジェクトの仕様 未習得
  18. 【動画18】 連想配列2-Dictionaryオブジェクトの使用例
    【動画18】 連想配列2-Dictionaryオブジェクトの使用例 未習得
  19. 【動画19】 連想配列3-Microsoft Scripting Runtimeのへの参照設定
    【動画19】 連想配列3-Microsoft Scripting Runtimeのへの参照設定 未習得
  20. 【動画20】 「名前付き引数」と「名前なし引数」
    【動画20】 「名前付き引数」と「名前なし引数」 未習得
  21. 【動画21】 省略可能な引数とその初期値
    【動画21】 省略可能な引数とその初期値 未習得
  22. 【動画22】 引数のデータ型
    【動画22】 引数のデータ型 未習得
  23. 【動画23】 Functionプロシージャ
    【動画23】 Functionプロシージャ 未習得
  24. 【動画24】 引数がひとつまたは複数のFunctionプロシージャ
    【動画24】 引数がひとつまたは複数のFunctionプロシージャ 未習得
  25. 【動画25】 Functionプロシージャ演習中
    【動画25】 Functionプロシージャ演習中 未習得
  26. 【動画26】 引数として配列を受け取るFunctionプロシージャ
    【動画26】 引数として配列を受け取るFunctionプロシージャ 未習得
  27. 【動画27】 引数を受け取らないSubプロシージャと引数つきSubプロシージャ
    【動画27】 引数を受け取らないSubプロシージャと引数つきSubプロシージャ 未習得
  28. 【動画28】 Subプロシージャの基本構造
    【動画28】 Subプロシージャの基本構造 未習得
  29. 【動画29】 モジュールレベル変数との使い分け
    【動画29】 モジュールレベル変数との使い分け 未習得
  30. 【動画30】 補講1-ディクショナリーオブジェクトのさらなる活用
    【動画30】 補講1-ディクショナリーオブジェクトのさらなる活用 未習得
  31. 【動画31】 補講2-ディクショナリーオブジェクトの .Count プロパティ
    【動画31】 補講2-ディクショナリーオブジェクトの .Count プロパティ 未習得
  32. 【動画32】 補講3-連想配列によるオブジェクトへの参照設定 - 新しいキーに設定する場合
    【動画32】 補講3-連想配列によるオブジェクトへの参照設定 - 新しいキーに設定する場合 未習得
  33. 【動画33】 補講4-連想配列によるオブジェクトへの参照設定 - 既存の値を上書きする場合
    【動画33】 補講4-連想配列によるオブジェクトへの参照設定 - 既存の値を上書きする場合 未習得
  34. 【動画34】 補講5-複数セルの集合を作るための便利なメソッド2つ
    【動画34】 補講5-複数セルの集合を作るための便利なメソッド2つ 未習得
  35. 【動画35】 補講6-連想配列演習-取引先ごとに取引金額の合計を算出する
    【動画35】 補講6-連想配列演習-取引先ごとに取引金額の合計を算出する 未習得
  36. 【動画36】 補講7-ウォッチ式の活用
    【動画36】 補講7-ウォッチ式の活用 未習得
  37. 【動画37】 補講8-ウォッチ式で配列の状態を確認する
    【動画37】 補講8-ウォッチ式で配列の状態を確認する 未習得
  38. 【動画38】 補講9-たった1行のコードでセルのデータを配列に投入する
    【動画38】 補講9-たった1行のコードでセルのデータを配列に投入する 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ