• ベストアンサー

VBA セル範囲をVariant変数に代入

Dim myVar As Variant myVar=Range("A1:A10") などのようにセル範囲を変数に一気に入力して使う際、myVarは2次元配列になる筈です。セル数が1個だけの時は、ひょっとしてただの変数つまり配列にならないのですか?確信ありませんが、そう思えるエラーがありました。 気のせいならこのまま粛々とエラー対策を続けます。本当だったら、データ数で変数の型が変わるので都合が悪いです。どう対策すればいいですか?

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

  • ベストアンサー
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.1

セルひとつだと配列を返さないので、配列にしたいなら自分で作る必要があります。 タイトル行などの余計なセルも読み込むことで「必ず範囲になるようにする」という手もありますが、データ数0なんて場合もありますし、そのへんはチェックして処理を変えた方がスマートです。 例)  if Range("A1:A1").count = 1 Then   Redim MyVar(1 to 1, 1 to 1)   MyVar(1, 1) = Range("A1:A1")  Else   MyVar = Range("A1:A1")  End if > 確信ありませんが、そう思えるエラーがありました エディタに「ローカルウィンドウ」という便利な機能があります。メニューの「表示」から有効にしてください。ブレイクポイントやStopなどで実行を止めると、その時点での変数の中身を覗くことができ、デバッグしやすくなる=確信を持てるようになると思います。 VBAの開発効率がいいと言われる理由のひとつです。ステップ実行などと合わせて、ぜひ使ってみてください。 変数にオブジェクトをSetすれば、オブジェクトの「プロパティ」も確認できます。  Set o = Range("A1")  Stop

High_Score
質問者

お礼

ありがとうございます。 少しですが、複雑になりますね。for-nextにしようかと思います。

関連するQ&A

  • VBA 変数Variantは万能??

    エクセル2002使用です。 A1セル  日付入力(ex.2005/7/25) A2セル  A1セルから月のみワークシート関数で取得 =month(A1) A3セル  日付入力 '12ヶ月分(ex.2005/7/25~2006/6/25) A4セル  A3セルから月のみワークシート関数で取得 =month(A3) ’12ヶ月分 3行目、4行には12ヶ月分AからL列に同じ設定があります。 (この質問にはあまり関係ないですが・・・) A7セルにA2の値を参照して入力のため sub test() Dim Myrg as variant ’またはstring、Duble Set Myrg = Range("A4:L4") _ .Find(what:=range("A2").value, lookat:=xlWhole) range("A7").value = myrg end sub とすると、Myrgはemptyのままで数値を拾ってくれません。 A2セルとA4~L4セルをA5セルA6~L6セルにフォーマットして sub test() Dim Myrg as variant ’またはstring、Duble  Range("A5").Value = Format(Range("A2").Value, "##")  Range("A6").Value = Format(Range("A4").Value, "##")  Range("B6").Value = Format(Range("B4").Value, "##")   ’(以下12ヶ月分フォーマット) Set Myrg = Range("A6:L6") _ .Find(what:=range("A5").value, lookat:=xlWhole) range("A7").value = myrg end sub とするとちゃんと数値を拾ってくれます。 分からないのは、  1.変数variantは、万能ではないのでしょうか?  2.ワークシート関数で得た数値はすべて一度フォーマットする必要があるのでしょうか?    フォーマットしない良い方法はあるのでしょうか? ちなみにキーボードから入力した数値もちゃんと拾ってくれます。 詳しい原因がわからないのでよろしくお願いします。

  • (変数)を使った特定の範囲の選択について

    下記のように、行を変数として、グラフの元になるデータの範囲(A列とC列)を指定した行までとしたいのですが、なかなかうまくいきません・・・("A1:セル番号,C1:セル番号1")の行ところでエラーになってしまいます。 どなたかよい方法を教えていただけませんでしょうか?お願いします。 Dim 行 As Integer Dim セル番号 As Variant Dim セル番号1 As Variant 行 = 7 セル番号 = "A" & 行 セル番号1 = "C" & 行 ActiveSheet.ChartObjects("グラフ11").Activate ActiveChart.ChartArea.Select ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:セル番号,C1:セル番号1"), _ PlotBy:=xlColumns ActiveWindow.Visible = False Windows("マクロ練習売上と見み.xls").Activate Range("A1").Select

  • VBA 変数の指定について

    エクセル2010を使っている者です。 過去の質問を見ていると、以下の記述が見つかりました。 Sub swap() Dim w, x As Range, y As Range If Selection.Areas.Count <> 2 Then Exit Sub Set x = Selection.Areas(1) Set y = Selection.Areas(2) w = x.Formula x.Formula = y.Formula y.Formula = w End Sub 変数の指定のところで、x, yはRangeの型を指定していますが、 wはどのようになっているのでしょうか? 検索してみると、変数の型を書かないと自動でVariantとして扱われるように なっているとのことですが、この場合もwもVariant型になっているのでしょうか? また、このようにwを中途半端に書かずに Dim x As Range, y As Range とwを外して書いてしまってもwは変数として機能するのでしょうか? よろしくお願いいたします。

  • VBAにて計算式をセルへ代入できなくて困っています

    計算式を変数QRdataへ代入し その変数から指定のセルへ入力するとき、実行時エラー1004となってしまい マクロを実行できずに困っています。 Cells(3, 6).ValueもRange("F3").Fourmulaと変えたりしたのですが解決方法が解らなく どうか御教授下さい。 Dim コードナンバー As String Dim 品名1行 As String Dim QRdata As String QRdata = "=("& Chr(34) & コードナンバー & 品名1行 & Chr(34) & ",1)" Cells(3, 6).Value = QRdata  ←ここでエラーとなってしまいます。

  • 変数の代入について

    他のファイルを参照し変数に代入しましたが 参照式まで代入されてしまいますが、これを回避したいです。 ='C:\フォルダ名\[ファイル名.csv]シート名'!$A$1 理由としては、参照先を知られたくないためです。 Dim A(9) As Variant A(0) = Path & "!$A$1" 'ここの部分の書き方を教えてください。 .Range("B1").Value = A(0) 変数は入力ミスをした場合に元に戻すために使います。

  • エクセルVBAコンボボックスについて

    図の左のように、商品リスト欄のセルA3から下方向に大分類(A16まで14種類) セルB3~O3(Bから数えて14個目のO)列から下方向に小分類があります。 P2~P11には1から10までの数字が入っています。 図の右側がユーザフォームで、コンボボックスの番号を入れています。 コンボボックス「1.4.・・・28.」までは大分類を選べるようにして、 コンボボックス「2.5.・・・29.」までは左の大分類に応じた小分類の値を表示させたいと思っています。 大分類「111」→小分類「あ~そ」 大分類「222」→小分類「た~と」といった具合です。 そのコンボボックスの値を指定したセルに入力しようと思っています。 下のように記述した結果、問題が発生しました。 (1)大分類で14個ほどあるリストの3つほどしかでてこない。 (2)Select Caseの構文を使用していて、大分類が14個だから「Case 13」までと しているが、「大分類の数-1」までの変えられる数までにしたい。 アドバイスをいただけると助かります。 ------------------------------------------------------------------ Private Sub UserForm_Initialize() Dim MyVar1 As Variant MyVar1 = Sheets("商品リスト").Range("A3:A" & Range("A3").End(xlDown).Row) Dim MyVar20 As Variant MyVar20 = Sheets("商品リスト").Range("P2:P" & Range("P2").End(xlDown).Row) '種類欄を指定 With ComboBox1 .List() = MyVar1 End With ※・・・(省略)・・・ コンボボックス4から25まで※ With ComboBox28 .List() = MyVar1 End With '数量欄を指定 With ComboBox3 .List() = MyVar20 End With ※・・・(省略)・・・ コンボボックス6から27まで※ With ComboBox30 .List() = MyVar20 End With End Sub '1番目 Private Sub ComboBox1_Change() Dim MyVar1 As Variant ※・・・(省略)・・・ MyVar2~13 As Variant※ Dim MyVar14 As Variant Dim MyVar20 As Variant MyVar1 = Sheets("商品リスト").Range("A3:A" & Range("A3").End(xlDown).Row) ※・・・(省略)・・・ B列からN列まで※ MyVar15 = Sheets("商品リスト").Range("O3:O" & Range("O3").End(xlDown).Row) MyVar20 = Sheets("商品リスト").Range("P2:P11") Select Case ComboBox1.ListIndex Case 0 With ComboBox2 .List() = MyVar2 End With ※・・・(省略)・・・ Case1~ Case12 ※ Case 13 With ComboBox2 .List() = MyVar15 End With End Select End Sub

  • Join関数 引数の配列変数

     複数行1列のセルの文字を結合してアクティブセルにセットしようとするとき、以下のステートメントでは (2)でエラーになります。 Join関数ではabが1次元配列でないとエラーですが、(1)で生成されるabは1次元配列にならないのでしょうか? または、それ以外の理由でエラーになるのでしょうか? ご教授を、よろしくお願いいたします。 Public Sub セル文字の結合()  Dim ab As Variant   ab = Range(Selection.Address).Value ・・・(1)   ActiveCell.Value = Join(ab, "") ・・・(2) ・・・・

  • Excelマクロ:変数でセル範囲指定

    マクロの迷い人です。 Excelの表をマクロで印刷しようと思っています。 行の数が毎回違うため、最終セルもその都度指定しなければなりません。 A1 B1 A2 B2 A3 B3 A4 B4 この例で、A5 B5 以降は空セルとします。 印刷範囲を Range("A1:B4")と書かずに、そのときどきのアクティブセルを変数に代入し、変数を使って範囲指定したいのです。 Sub MacroTest () Dim a As Variant Dim b As Variant Range("B1").Activate Do While a <> 0 ActiveCell.Offset(1, 0).Activate '空白でなければ一つ下に移る a = ActiveCell.Value Loop ActiveCell.Offset(-1, 0).Activate '上の行に移る b = ActiveCell.Value Range("A1:"& b).Select End Sub こうしてみましたがダメでした。 デバッグの方法がわからないので教えて下さい。よろしくお願いします。

  • Excelのセルから配列変数への一括読込み

    VB(というかプログラミング)の超初心者です。 Excelシートの任意の領域にある数値を、配列変数に一括して 入力したいと思っています。 これまで、 Dim XXX(10) As Variant For I = 1 To 10 XXX(I - 1) = Cells(1, I).Value Next I Range(Cells(10, 1), Cells(10, 10)).Value = XXX の様な感じで処理していましたが(最近まで、セルへの書込みも For-Nextで処理していました)、データ数が多くなると処理に 時間がかかってしまいます。 配列YYYへの読込みもセルへの書込みの様に一括して行うには どうすれば良いでしょうか? よろしくお願いします。

  • セル範囲を変数に格納したい

    セル範囲を変数に格納したいのですがどのようなコードになりますか ? (配列に値を読み込むのでは無く、単純にセル範囲を変数としたい) TargetRange = Range("A2:Z2") Set rngFind=TagetRange.Find(What:="A",LookIn:=xlValues,LookAt:=xlPart, ----- )のように使用したい。

専門家に質問してみよう