• ベストアンサー

配列 変数の宣言 VBA

こんばんは。 Sub test() Dim myStr(200) As String For 行 = 0 To Cells(Rows.Count, 1).End(xlUp).Row myStr(行) = Cells(行 + 1, 1) Next MsgBox Join(myStr, "_") End Sub のようなコート゛を作成し、 アクティブシートのA列の最終行までを取得し、一つにまとめたいのですが 「Dim myStr(200) As String」の部分で 最終行を取得することは不可能でしょうか? 今回は200行なので大丈夫なのですが 場合によっては1行~65536行までさまざまです。 なので Dim myStr(Cells(Rows.Count, 1).End(xlUp).Row) As String としたらエラーになりました。 最初から Dim myStr(65536) As String とするべきでしょうか? しかしそうすると myStrの最後がずっと「________」となってしまいます。 どうするのが適切なのかわかりません。 ご教授よろしくお願いします。

noname#150929
noname#150929

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 通常は、動的配列にするのが一般的ですが、実際の内容を教えていただかないと、なんとも言えません。コードは現実的な内容ではありません。ループして、最後にJoin でつなぐ必要性が認められません。なお、配列変数は、データ型を決めたほうが格納できます。 >myStrの最後がずっと「________」となってしまいます。 Sub test2()   Dim myStr(65535) As String   Dim i As Long   Dim LastRow As Long   Dim buf As String   LastRow = Cells(Rows.Count, 1).End(xlUp).Row   '最終行までデータ入っていたら一つしか入らない   For i = 0 To LastRow     myStr(i) = Cells(i + 1, 1)   Next   buf = Join(myStr, "_")   buf = Mid(buf, 1, InStr(buf, "__"))   MsgBox buf End Sub 配列を使わない法 Sub test3()   Dim i As Long   Dim LastRow As Long   Dim buf As String   LastRow = Cells(Rows.Count, 1).End(xlUp).Row   If LastRow < 2 Then    'フルに入っているかチェックする     If Cells(Rows.Count, 1).Value <> "" Then       LastRow = Rows.Count     Else       Exit Sub     End If   End If   For i = 1 To LastRow     buf = buf & "_" & Cells(i, 1).Value   Next   buf = Mid(buf, 2)   MsgBox buf End Sub

noname#150929
質問者

お礼

配列を使わない方法もあるのですね。ありがとうございます。

その他の回答 (5)

  • myRange
  • ベストアンサー率71% (339/472)
回答No.5

  変数をVariantで宣言する方法もあります。 '---------------------------------  Sub Test333()  Dim myStr  myStr = Range("A1", Cells(Rows.Count, "A").End(xlUp)).Value  MsgBox Join(Application.Transpose(myStr), "_") End Sub '-------------------------------- この場合、変数myStrは配列になってますので、要素を取り出すときは For R = LBound(myStr) To UBound(myStr)   MsgBox myStr(R) Next R とします。 以上です。  

noname#150929
質問者

お礼

ありがとうございます。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.4

>場合によっては1行~65536行までさまざまです。  [動的配列変数]・[ReDim ステートメント] につきましては回答が出ておりますので、[ReDim ステートメント] のヘルプを参照なさってください。  小さなことかも知れませんが、お示しのコードで要素数の指定を Cells(Rows.Count, 1).End(xlUp).Row のままで Dim myStr(200) As String を Dim myStr() As String または Dim myStr As Variant ReDim myStr(要素数) に変えますと、 MsgBox Join(myStr, "_") の最後に余分な "_" が付きますよね。  せっかく「For 行 = 0 To」としていらっしゃるのでしたら、要素数の設定は、最後に「- 1」を付けて Cells(Rows.Count, 1).End(xlUp).Row - 1 とされた方が、後々問題も生じにくいかと存じます。  ついでに荒技ですが、 Sub oioi()  MsgBox Join(Application.WorksheetFunction.Transpose( _   Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row) _   ), "_") End Sub みたいなこともできます。  しかし、いずれにいたしましても、対象範囲内に「#VALUE!」などが入るとエラーになりますので、注意が必要です。  配列の宣言でデータ型を誤ったり、要素数を指定しなかったり(空の括弧を付けたり)、配列に格納し損ねると >コンパイル エラー  配列がありません。 >実行時エラー '13':  型が一致しません。 >実行時エラー '9':  インデックスが有効範囲にありません。 などの エラー メッセージ が表示され、結構面倒ですが、「何でだろぉ~、何でだろぉ~...」と原因を究明していくと、結構面白いですよね。 ・・・以上、ど素人の独り言でした。

noname#150929
質問者

お礼

なんだか解読不能ですがすごいですね! ありがとうございます。

  • Sinogi
  • ベストアンサー率27% (72/260)
回答No.3

動的配列で対応します。 宣言では要素数を明示せず、要素数を確定してから再宣言します。 配列にデータを代入後、さらに要素数を増やすときPreserveを使用すればデータが保持できます。 要素数を変数にして、変数で最終行を取得してください。 Dim 要素数 Dim myStr() As String ・・・ Redim myStr(要素数)

noname#150929
質問者

お礼

先ほどもありましたが「動的配列」というのですね。 覚えます。ありがとうございます。

  • lovesens
  • ベストアンサー率30% (48/158)
回答No.2

動的変数を使ってはどうでしょう。 ReDim Preserve 句を使うと内容を保持したまま配列の要素を増やすことができます。 Dim myStr() As String For 行 = 0 To Cells(Rows.Count, 1).End(xlUp).Row ReDim Preserve myStr(行) myStr(行) = Cells(行 + 1, 1) Next MsgBox Join(myStr, "_")

noname#150929
質問者

お礼

ありがとうございます。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

配列の大きさは後で変更することが可能です。  Dim myStr() As String  r = Cells(Rows.Count, 1).End(xlUp).Row  ReDim myStr(r) みたいなことができます。 ReDim Preserve を利用すると、既に配列に入っている値を保存したまま最宣言ができます。(条件がありますが) 詳しくは、ヘルプ等をご覧ください。

noname#150929
質問者

お礼

できました。ヘルプもちゃんと見てみます。ありがとうございます。

関連するQ&A

  • 連続して同じ値が入ってるなら削除したいのですが

    指定した値なおかつ連続して同じ値が入ってるなら削除したいのですが A列に 紅葉 紅葉 桜 桜 紅葉 とはいっていて、 Sub Sample() Dim i As Long Dim mystr As String mystr = "桜" For i = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1 If Cells(i, 1) = Cells(i - 1, 1) = mystr Then Rows(i).Delete End If Next i End Sub をしても、削除されません。 4行目の桜が削除されてもいいと思うのですが コードのどこが間違えてますか?

  • エクセルVBAで非アクティブブックのRow取得

    非アクティブシートの最終行のRowを取得するマクロが xls形式のファイルだと動いていたのですが、xlsm形式に変更後、エラーになってしまいました。 これは仕様の変更によるものなのでしょうか? Activeteせずに対処する方法があれば教えて頂きたいです。 Sub ボタン1_Click() Dim 最終行 As Long 最終行 = Workbooks("1.xls").Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row MsgBox 最終行 End Sub

  • エクセルマクロ配列で変数は使えますか

    エクセル2013です。 初めて配列を使います。 以下のように作成し思ったようにできました。 Sub 計算() '成功 Dim a As Integer Dim c As Integer Dim b(5) As Integer Dim 最終行 Dim 値列  値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To 5 b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub ただ計算する列の範囲をインプットボックスで入力した値 にしたい為以下のように改造しました。 Dim b(対象列) As Integerでエラーになります 配列には変数は使用できないのでしょうか? よろしくお願いします。 Sub 計算() '失敗 Dim a As Integer Dim c As Integer Dim b(対象列) As Integer’★ここでERRになる Dim 最終行 Dim 対象列 Dim 値列  対象列 = 22'インプットボックスで入力した値 値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To (対象列 - 17) b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub

  • 取得した変数の値の一番大きい変数を取る

    エクセル2002使用です。 セル(A~F列)にランダムに入力された列の最終行数を変数で取っています。 その中で最も大きい変数の値を取るコードを記述したいのですが、 良い方法がわかりません。 sub test() Dim rcnt1, rcnt2, rcnt3, rcnt4, rcnt5, rcnt6, rcnt As Integer '最終行の取得 rcnt1 = Cells(65536, 1).End(xlUp).Row rcnt2 = Cells(65536, 2).End(xlUp).Row rcnt3 = Cells(65536, 3).End(xlUp).Row rcnt4 = Cells(65536, 4).End(xlUp).Row rcnt5 = Cells(65536, 5).End(xlUp).Row rcnt6 = Cells(65536, 6).End(xlUp).Row rcnt = "最も大きい変数の値" ←ここがわかりません。 end sub よろしくお願いします。

  • VBA 変数について

    下記コードにおける変数rは、具体的にどういう事を意味するのでしょうか? よろしくお願いします。 Dim r As Long With Worksheets("Steet1") r=.Cells(.Rows.Count,"a").End(xlUp).Row

  • 【VBA】"オブジェクトが必要です"メッセージ出力

    VBAを使用し、A列に日付、B列に数量、C列に単価、D列に金額を入力し、 数量*単価にて、金額を求めるVBAを作成しています。 そこまでは上手くいくのですが、D列で求めた金額を最終行で合計する事で 躓いてしまっています。 行は常に追加され可変の為、最終行を「Cells(Row.Count, 1).End(xlUp).Row」 にて引っ張ってこようと思っております。以下のようなVBAを記載しましたが、 「オブジェクトが必要です」とのメッセージがでて、処理が上手くいきません。 どのような問題があるのか、お分かりの方、ご回答頂けますと幸いです。 ■環境  Windows7  Excel2010 ■VBA Sub test() Dim i As Long Dim j As Long Dim k As Long For i = 2 To Cells(Row.Count, 1).End(xlUp).Row Cells(i, 4) = Cells(i, 2) * Cells(i, 3) Next j = Cells(Row.Count, 1).End(xlUp).Row + 1 k = Cells(j, 1).End(xlUp).Row Cells(j, 4) = WorksheetFunction.Sum(Cells(2, 4), Cells(k, 4)) End Sub

  • range表記をcells表記にしたい

    B列の最終行までループさせたいのですが Sub Sample() Dim col As Long col = 2 For Each R In Range("B1:B" & Cells(Rows.count, "B").End(xlUp).Row) Next End Sub この状態から、Bを使わずに、 col = 2を使って、書き換えてもらっても良いですか? For Each R In Range(Cells(1, col), Cells((Rows.count, col)).End(xlUp).Row) これにするとエラーになります。

  • エクセル 検索コピーマクロ

    マクロで検索、抽出して別ファイルに保存したいのですが、 以下のようなマクロを教えてもらったのですが コピー先のセル位置を任意の位置に直したいのですが、 どうしてもわかりません どの部分をどう直せばよいのでしょうか? Option Explicit Sub copyTodayData() Dim dateToday As String Dim tempDate As String Dim lastrow1 As Long Dim lastrow2 As Long Dim i As Long Dim fileA As String Dim anotherBook As String Dim anotherFilePath As String fileA = ThisWorkbook.Name anotherBook = "別のファイル.xls" anotherFilePath = "C:\Documents and Settings\日本太郎\デスクトップ\どこかのフォルダ" '問い合せダイアログの表示をOFFにします Application.DisplayAlerts = False 'ファイルを開く ChDir anotherFilePath Workbooks.Open Filename:=anotherFilePath & "\" & anotherBook '問い合せダイアログの表示をONに戻します Application.DisplayAlerts = True 'ウインドウの切替 Windows(fileA).Activate '今日の日付を取得 dateToday = Date 'データ最終行を取得 lastrow1 = Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To lastrow1 If Cells(i, 1) = dateToday Then 'Range(Cells(i, 1), Cells(i, 4)).Copy 'コピー Windows(anotherBook).Activate 'ウインドウの切替 lastrow2 = Cells(Rows.Count, 1).End(xlUp).Row '別ブックの最終行 Cells(lastrow2 + 1, 1).Select ActiveSheet.Paste Windows(fileA).Activate 'ウインドウの切替 End If Next i MsgBox "実行しました" End Sub たぶん、lastrow2 = Cells(Rows.Count, 1).End(xlUp).Row '別ブックの最終行 Cells(lastrow2 + 1, 1).Select ここらへんというのは、わかりますが、 どこをどう変えたらいいかわかりません

  • 文字列を分割して、分割した文字の一番右側を表示するにはどうしたら良いのでしょうか?

    Sub test2() Dim moji() As String Dim a As Range Dim 行 As Long For 行 = 2 To Cells(Rows.Count, 1).End(xlUp).Row Set a = Cells(行, 1) moji() = Split(a, "-") On Error GoTo moji Cells(行, 2) = moji(3) Next 行 moji: Cells(行, 2) = moji(2) End Sub で A列 B列 1-2-3-4 4 10-11-11-12 12 1-2-3-10 10 1-2-10-3 3 1-2-3 3 1-2 1-13 11-14 11-3 の結果になりますが1-2,11-14,11-3の部分が表示できません。 どなたかよいほうほうをお願いします。

  • vba エクセル

    2行目から、最終行までEmptyにしたいのにならないです。 1行目はフィールド行なのに、そのままにしたいのですが 2行目から最終行は空白にしたいです。 なので Sub TEST() With Sheets("log") lastRow = .Cells(.Rows.Count, "b").End(xlUp).Row LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column .Range(.Cells(2, LastCol), .Cells(lastRow, LastCol)) = Empty End With End Sub としたのですが、何も起こりません。 lastRowは100、LastColは5なのですが、 このマクロを実行しても何も起こらないです。 なぜでしょうか?

専門家に質問してみよう