Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11266 / 13646 ツリー ←次へ | 前へ→

【17018】Array(0,1,2,3,4,....)内を配列でもちたい めぎゅ 04/8/18(水) 21:33 質問[未読]
【17019】Re:Array(0,1,2,3,4,....)内を配列でもちた... Asaki 04/8/18(水) 21:58 回答[未読]
【17072】Re:Array(0,1,2,3,4,....)内を配列でもちた... めぎゅ 04/8/20(金) 19:37 質問[未読]
【17074】Re:Array(0,1,2,3,4,....)内を配列でもちた... Hirofumi 04/8/20(金) 20:59 回答[未読]
【17080】Re:Array(0,1,2,3,4,....)内を配列でもちた... めぎゅ 04/8/21(土) 0:35 お礼[未読]

【17018】Array(0,1,2,3,4,....)内を配列でもちたい
質問  めぎゅ E-MAIL  - 04/8/18(水) 21:33 -

引用なし
パスワード
   こんにちは。
初歩的な質問でしたら申し訳ありません!

Array(0,1,2,...)と指定する際、
()内の、0,1,2,3,...を変数、あるいは、配列でもつことは可能でしょうか?
もつとしたらどのようにして指定することができますでしょうか?

宜しくお願いします。

【17019】Re:Array(0,1,2,3,4,....)内を配列でもち...
回答  Asaki  - 04/8/18(水) 21:58 -

引用なし
パスワード
   こんばんは。

↓こういうのでしょうか?(2種類)
Sub ss()
  Dim str   As String
  Dim arr   As Variant
  Dim v    As Variant

  str = "0,1,2,3"
  arr = Split(str, ",")
  For Each v In arr
    MsgBox v
  Next v

'------------------------------
  arr = Array("0", "1", "2")
  For Each v In arr
    MsgBox v
  Next v

End Sub

【17072】Re:Array(0,1,2,3,4,....)内を配列でもち...
質問  めぎゅ E-MAIL  - 04/8/20(金) 19:37 -

引用なし
パスワード
   こんばんわ。ご返事有難うございます。

すいません。うまく使えませんでした。
用途として詳しく説明しますと、

ファイル読み込みの際、Array関数を使うのですが、
読み込みたいカラムの列番号をシート、あるいは、ファイルに設定ファイルとして持ちます。

その際、
>  str = "0,1,2,3"
>  arr = Split(str, ",")

までは、OKなのですが、Array関数への格納がどうやるのかわかりません・・。。
  '書き込み用配列の確保
  vntColm = Array(0, 1, 2, 4, 5, 6)
          ~~~~~~~~~~~~~~~~
          ↑ここを可変で、設定ファイルとして持ちたい。
  ReDim vntWrite(UBound(vntColm))

補足として、ソースとしましては、このようになっています。

  Dim dfn As Integer
  Dim strBuff As String
  Dim vntColm As Variant
  Dim vntData As Variant
  Dim vntWrite As Variant
  Dim lngWriteRow As Long
  
  '書き込み用配列の確保
  vntColm = Array(0, 1, 2, 4, 5, 6)
  ReDim vntWrite(UBound(vntColm))
  
    '貼付行設定
    lngWriteRow = 1
    
    'ファイルオープン
    dfn = FreeFile
    Open CStr(sTXTPATH & sTXTName_i) For Input As dfn
    
    'ファイルの終わりまで繰り返し
    With Workbooks(sNewbook_name).Worksheets(sSheetName)
      Do Until EOF(dfn)
        '1行(1レコード)読み込み
        Line Input #dfn, strBuff
        '区切文字(Tab)で文字列を区切配列に格納(列数と添え字が等しい)
        vntData = Split(strBuff, vbTab, , vbBinaryCompare)
        '読み込み列を書き込み用配列に代入
        For i = 0 To UBound(vntColm)
          vntWrite(i) = vntData(vntColm(i))
        Next i
        '書き込み位置にデータを書き込み
        With .Cells(lngWriteRow, 1)
          Range(.Offset(, 0), .Offset(, _
                  UBound(vntColm))).Value = vntWrite
        End With
        '書き込み行を更新
        lngWriteRow = lngWriteRow + 1
      Loop
    End With
    
    'ファイルを閉じます
    Close #dfn
   End If

【17074】Re:Array(0,1,2,3,4,....)内を配列でもち...
回答  Hirofumi  - 04/8/20(金) 20:59 -

引用なし
パスワード
   ファイルで持ちたいという意味が善く解らないのですが?
こんな事なのかな?

マクロの有るBookに、「設定」と言う名前のシートを作成します
例えば、B2からC2、D2、E2・・・の様に横に読み込みたいCSVの列を読み込みたい順番に入力して置きます
ただし、Splitで分割するので、列の番号は、0から始まります

Public Sub ReadTest2()

  Dim dfn As Integer
  Dim strBuff As String
  Dim vntColm As Variant
  Dim vntData As Variant
  Dim vntWrite As Variant
  Dim lngWriteRow As Long
  
  Dim i As Long
  Dim sTXTPATH As String
  Dim sTXTName_i As String
  Dim sNewbook_name As String
  Dim sSheetName As String
  
  
  sTXTPATH = ThisWorkbook.Path & "\"
  sTXTName_i = "TestData.csv"
  sNewbook_name = ThisWorkbook.Name
  sSheetName = "Sheet1"

  '読み込む列番号を配列に読み込み  
  With ThisWorkbook.Worksheets("設定")
    vntColm = Range(.Cells(2, "B"), _
          .Cells(2, "IV").End(xlToLeft)).Value
  End With
  '書き込み用配列の確保
  ReDim vntWrite(1 To UBound(vntColm, 2))
 
  '貼付行設定
  lngWriteRow = 1
  
  'ファイルオープン
  dfn = FreeFile
  Open CStr(sTXTPATH & sTXTName_i) For Input As dfn
    
  'ファイルの終わりまで繰り返し
  With Workbooks(sNewbook_name).Worksheets(sSheetName)
    Do Until EOF(dfn)
      '1行(1レコード)読み込み
      Line Input #dfn, strBuff
      '区切文字(Tab)で文字列を区切配列に格納(列数と添え字が等しい)
      vntData = Split(strBuff, vbTab, , vbBinaryCompare)
      '読み込み列を書き込み用配列に代入
      For i = 1 To UBound(vntColm, 2)
        vntWrite(i) = vntData(vntColm(1, i))
      Next i
      '書き込み位置にデータを書き込み
      With .Cells(lngWriteRow, 1)
        .Resize(, UBound(vntColm, 2)).Value = vntWrite
      End With
      '書き込み行を更新
      lngWriteRow = lngWriteRow + 1
    Loop
  End With
  
  'ファイルを閉じます
  Close #dfn

End Sub

【17080】Re:Array(0,1,2,3,4,....)内を配列でもち...
お礼  めぎゅ E-MAIL  - 04/8/21(土) 0:35 -

引用なし
パスワード
   Asakiさん、Hirofumiさん

ありがとうございました!
ちゃんと動きました!ここまで細かく教えていただいて
とても感謝しています!

まだ、配列の理解が少なく、あさはかなことを聞いてしまったようで
恥ずかしくも、ほんとにありがとうございます!

11266 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free