• 締切済み

ExcelVBAのRangeで複数指定

Excel 2003 のVBAで質問です。 以下のサンプルプログラムですが、最後の MsgBox で 1 になってしまいます。 3 が帰ってくるようにするには、Range でどのように指定すればよいのでしょうか。 宜しくお願いします。 〔Sheetの値〕 ┌─┬─┬─┬─┐ │*│A│B│C│ ├─┼─┼─┼─┤ │1│11│12│13│ ├─┼─┼─┼─┤ │2│21│22│23│ ├─┼─┼─┼─┤ │3│31│32│33│ ├─┼─┼─┼─┤ │4│41│42│43│ ├─┼─┼─┼─┤ │5│51│52│53│ └─┴─┴─┴─┘ 〔サンプルプログラム〕 Dim myArray1, myArray2 As Variant myArray1 = ThisWorkbook.ActiveSheet.Range("A1:C5") myArray2 = ThisWorkbook.ActiveSheet.Range("A1:A5,B1:B5,C1:C5") '指定が間違ってる? MsgBox UBound(myArray1, 1) '結果 5 MsgBox UBound(myArray1, 2) '結果 3 MsgBox UBound(myArray2, 1) '結果 5 MsgBox UBound(myArray2, 2) '結果 1 → 3になって欲しい

みんなの回答

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

連続した範囲ではないからでは? なので A1:A5 ここしか代入されていないから そうなると思うのですが。。。

  • hirotn
  • ベストアンサー率59% (147/246)
回答No.1

Range().Selectしてみると、実際に選択されている範囲が確認できるでしょう。 myArray2 = Union(Range(),Range(),Range()) ではいかがですか? http://msdn.microsoft.com/ja-jp/library/office/ff838238.aspx

関連するQ&A

  • エクセル 転記ループが上手くいきません

    シート2のA列の数値と、シート3のA列の数値が一致したら、シート2のB列の数値をシート3のB列に転記したいです。(実際はもうちょっと複雑ですが・・) 実際はデータ量があるため、処理時間を少なくしたくて、配列に挑戦してみました。 処理は最後まで行くのですが、転記がされません。 どうしてでしょうか?? どなたか教えてください!!! Sub sample2() Dim i As Long Dim ii As Long Dim last As Long Dim last2 As Long Dim MyArray1 Dim MyArray2 last = Sheets("sheet2").Cells(Rows.Count, 1).End(xlUp).Row last2 = Sheets("sheet3").Cells(Rows.Count, 1).End(xlUp).Row MyArray1 = Sheets("sheet2").Range("A1:B" & last) MyArray2 = Sheets("sheet3").Range("A1:B" & last2) For i = LBound(MyArray1, 1) To UBound(MyArray1, 1) For ii = LBound(MyArray2, 1) To UBound(MyArray2, 1) If MyArray1(i, 1) = MyArray2(ii, 1) Then MyArray2(ii, 2) = MyArray1(i, 2) End If Next Next End Sub

  • EXCEL VBAのRangeプロパティについて

    EXCEL VBAのRangeプロパティについて 下の2つのプログラムで表示されるメッセージは、 プロシージャAは"$B$1" プロシージャBは"$A$1" なのですが、Rangeプロパティはどういう使われ方をしているのでしょうか? お教えくださいませ。 ・プロシージャA Sub test1() Cells(1, 2).Activate MsgBox ActiveCell.Range("A1").Address End Sub ・プロシージャB Sub test2() Cells(1, 2).Activate MsgBox ActiveSheet.Range("A1").Address End Sub

  • rangeオブジェクトについて

    こんばんわ。 rangeオブジェクトの行数と列数を出したいのですが、やりかた教えていただけませんでしょうか。 以下のように、方法1と方法2を試しましたが、「オブジェクトが必要です」というエラーになります(;;)ついでに、以下2つがなぜだめかも後学のために教えてください(;;) よろしくお願いします。 方法1-- dim rng as range set rng = range(cells(1,1),cells(2,2)) with rng msgbox .columns(.columns.count).column end with 方法2-- dim rng as range set rng = range(cells(1,2),cells(2,2)) msgbox ubound(range,1) -- エクセル2003

  • excelVBA rangeのdeleteの検出

    よろしくお願いします。 Sub test() Dim a As Range If a Is Nothing Then MsgBox "1:nothing" '表示する Set a = Range("C3") If a Is Nothing Then MsgBox "2:nothing" '表示しない MsgBox a.Row '表示する a.Delete shift:=xlUp If a Is Nothing Then MsgBox "3:nothing" '表示しない MsgBox a.Row    'エラーになる End Sub 知りたいのはaをdeleteしたことをif文で検出したいのです。どうすればいいのでしょうか。 (setしたあとでdeleteしても既にそれはnothingではありません。set a=nothing をa.Delete shift:=xlUp のあとに挿入すれば、3:nothingは表示します。しかし、今したいのは、deleteしたことを検知することです。)(on error goto を使わずに処理したいです。)

  • Excelの同時置換の置換場所指定

    以前、どなたかの質問の回答で… Sub MultiReplacement()  Dim MyWords As Variant  Dim MyRepWords As Variant  Dim Ans As Integer  Dim Rng As Range  MyWords = Array("A", "C") 'ここに検索語を入れてください。  MyRepWords = Array(1, 2) 'ここに置換語を入れてください。  '検索語と置換語を調べる  If UBound(MyWords) <> UBound(MyRepWords) Then   MsgBox "検索語数( " & UBound(MyWords) & _   " )と置換語数( " & UBound(MyRepWords) & " )数が違います。", 64   Exit Sub  End If    Set Rng = Selection 'マウスで範囲を選択してください。  If Rng.Count = 1 Then   Ans = MsgBox("セル1つしか選択されていませんが、よろしいですか?", vbYesNo)   If Ans = vbNo Then    Exit Sub   End If  End If  '実行  For i = LBound(MyWords) To UBound(MyWords)   Cells.Replace What:=MyWords(i), Replacement:=MyRepWords(i), _   LookAt:=xlPart, _   MatchCase:=True  Next i End Sub ------------------------ というものを出してくれた方が折られました。それでなのですが… 置換語の場所を指定する場合はこれをどの用にしたらよいのでしょうか?? たとえば、セルA1から並んでいる、りんご/みかん/めろん…を、ほかの列CにApple/Orange/Mellon…するには??教えてくださいませ。

  • 関数の引数でrangeを指定したとき

    Function mycount(y As Range) Dim num As Integer Dim c As String Dim a As Range c = y.Address For Each a In Range(c) If a.Text = ">" Then num = num + 1 End If Next a mycount = num End Function この関数を定義して,ワークシート上で=mycount("範囲")と入力するとその範囲内に">"のマークがいくつあるかを返します。この場合,引数yで指定された範囲のアドレスをcに入れていますが,yのアドレス取得せずにfor each a in range(y)としても正しい値を返してくれません。なぜでしょうか? また同じような問題で(サブプロシージャで) dim dat as range set dat = application.inputbox() とした時,このdatにはいったい何が入っているのですか?

  • ExcelVBA Dictionaryオブジェクト

    こんにちは。 Dictionaryオブジェクトについて、ご教示いただきたく質問させていただきます。 あるCSVデータにおいて、A列に入力されている番号で重複をなくし、重複する番号については、B列(売上額)C列(利益額)それぞれの値を合計してSheet2に表示させるコード(test1)を書きました。データの行数が3万5千行ほどあるため、処理が終わるのに3分程かかります。 今後もデータは増えていくので、処理終了までの時間をもう少し短縮したく、自分なりに調べてみたところ、Dictionaryオブジェクトというものを知り、使用例を参考にしながら見よう見まねでコード(test2)を書いて試してみたところ、処理終了まで数秒となり、かなり短縮されました。 エラーも出ることなく処理できるものの、Dictionaryオブジェクトに対する理解がイマイチでして、コードの書き方等、問題ないかを知りたく質問させていただいた次第です。 よろしくお願いいたします。 ------------------------------------------------------------------------------ Sub test1() Dim i As Long Dim lastRow As Long Dim ws As Worksheet Application.ScreenUpdating = False '不要データ削除 Rows("1:3").Select Selection.Delete Shift:=xlUp Range("B:Q,S:W,Y:AF").Select Selection.Delete Shift:=xlToLeft Range("A1").Select 'シート名変更・挿入 ActiveSheet.Name = "CSV" Sheets.Add After:=ActiveSheet ActiveSheet.Name = "売利集計" Set ws = Worksheets("売利集計") wS.Cells.ClearContents ws.Range("B1").Value = Worksheets("CSV").Range("B1") ws.Range("C1").Value = Worksheets("CSV").Range("C1") With Worksheets("CSV") .Range("A:A").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ws.Range("A1"), unique:=True lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row With Range(ws.Cells(2, "B"), ws.Cells(lastRow, "B")) .Formula = "=SUMIF(CSV!A:A,A2,CSV!B:B)" .Value = .Value End With With Range(ws.Cells(2, "C"), ws.Cells(lastRow, "C")) .Formula = "=SUMIF(CSV!A:A,A2,CSV!C:C)" .Value = .Value End With End With Application.ScreenUpdating = True Set ws = Nothing MsgBox "売利集計完了しました。" End Sub Sub test2() Dim i As Long Dim lastRow As Long Dim ws As Worksheet Dim c As Range Dim dicS As Object Dim dicP As Object Application.ScreenUpdating = False '不要データ削除 Rows("1:3").Select Selection.Delete Shift:=xlUp Range("B:Q,S:W,Y:AF").Select Selection.Delete Shift:=xlToLeft Range("A1").Select 'シート名変更・挿入 ActiveSheet.Name = "CSV" Sheets.Add After:=ActiveSheet ActiveSheet.Name = "売利集計" '番号別集計 Set ws = Worksheets("売利集計") Set dicS = CreateObject("Scripting.Dictionary") Set dicP = CreateObject("Scripting.Dictionary") With Sheets("CSV") For Each c In .Range("A2", .Range("A" & .Rows.Count).End(xlUp)) dicS(c.Value) = dicS(c.Value) + Val(c.Offset(, 1).Value) dicP(c.Value) = dicP(c.Value) + Val(c.Offset(, 2).Value) Next With Worksheets("売利集計") .Columns("A:C").ClearContents .Range("A1").Resize(, 3).Value = Worksheets("CSV").Range("A1").Resize(, 3).Value .Range("A2").Resize(dicS.Count).Value = WorksheetFunction.Transpose(dicS.keys) .Range("B2").Resize(dicS.Count).Value = WorksheetFunction.Transpose(dicS.Items) .Range("C2").Resize(dicP.Count).Value = WorksheetFunction.Transpose(dicP.Items) End With End With Set dicS = Nothing Set dicP = Nothing MsgBox "売利集計完了しました。" End Sub

  • Excel: SetステートメントでRangeオブジェクトに名前付きセルを指定したい

    Excel VBAです。 RangeオブジェクトにSetステートメントで名前付きセルを指定したのですが、結果、RangeオブジェクトはEmpty値になってしまいます。名前付きではない別のセルでやってみるとうまくいきます。 Dim sSheet as Worksheet Dim wRange as Range Worksheets("Sheet1").Select 【失敗する例:名前付きセルを指定】 Set wRange=Range("c_ControlNo") 【うまくいく例:セルA1を指定】 Set wRange=Range("A1") 名前付きセルは指定できないなんてことはない、と思うのですが、どこがおかしいのでしょうか? アドバイスをお願いします。

  • ExcelVBAの知恵をお貸しください。

    一つのシートで、複数のセル範囲を選択している場合に、セル範囲を選択しているのか?列、行を選択しているのかを判別する方法として次のようなのを考えました。 それとなく動いているのですが、なんとなくスマートでなく、場当たり的な感じがしますが、どのようにすればいいのか判りません!! どなたか、アドバイス頂けないでしょうか?宜しくお願いいたします。 Sub test()  Dim myRang As Range  Dim myArry As Variant  For Each myRang In Selection.Areas myArry = Split(Replace(myRang.Address, ":", ""), "$") If UBound(myArry) <> 2 Then   MsgBox "セル範囲を選択しています。" & myRang.Address Else If IsNumeric(myArry(1)) Then MsgBox "行を選択しています。" & myRang.Address Else MsgBox "列を選択しています。" & myRang.Address End If End If  Next End Sub

  • Excel VBA グラフチャート名で指定するには

    ExcelのVBAでグラフを作成した後 ActiveChartでアクティブなチャートを指定するのではなく ActiveChart.Nameなどで取得したチャート名で指定するには どのように記述すればよいでしょうか。 例えば、以下のtest()のコードの中の ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone) ActiveChart.PlotArea.Select ActiveChart.Parent.Copy の部分をActiveChartを使わずチャート名(chart_nameなど)で指定するには どのように記述すればよいでしょうか。 よろしくお願いします。(Windows7,Excel2016) --------------------------------------- Sub test()  Dim chart_name As String  ThisWorkbook.Worksheets("Sheet1").Select  ThisWorkbook.Worksheets("Sheet1").Range("A1") = "A"  ThisWorkbook.Worksheets("Sheet1").Range("A2") = "B"  ThisWorkbook.Worksheets("Sheet1").Range("B1") = "75"  ThisWorkbook.Worksheets("Sheet1").Range("B2") = "25"  ThisWorkbook.Worksheets("Sheet1").Range("A10").Select  ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart2(297, xlBarStacked100).Select  ThisWorkbook.Worksheets("Sheet1").Select  ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows  chart_name = ActiveChart.Name  chart_name = Trim(Right(chart_name, Len(chart_name) - Len(ActiveSheet.Name)))  ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).Activate  ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone)  ActiveChart.PlotArea.Select  ActiveChart.Parent.Copy End Sub

専門家に質問してみよう