• ベストアンサー

エクセルで範囲指定の方法

指定する列の範囲はAから始まり、X~Z位までです。行は決まっています。先ず次の文で列の範囲を取得します。 Range("A1").CurrentRegion.Select I = .Selection.Columns.Count 例えば5行目のI列を指定する時はどうすれば良いでしょうか。 Range("A5:" & I & "5").Select では、エラーになります。

noname#33277
noname#33277

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

■ 1 点目 > .Range("A1").CurrentRegion.Select Range の前にピリオドがあるので、With ~ が省略されているのでしょう。 抜粋のコードでは正確なコメントがしにくいのですけど、恐らくシートを 切り替えて実行するとエラーになるのですよね?   With Worksheets("Sheet1") のようなコードでシートを指定しているのではないですか? > .Range(Cells(I, 1), Cells(I + 40, PrintCol)).Select 'この文でエラー発生 仮に With Worksheets("Sheet1") が省略されているとするなら、この コードを Sheet2 がアクティブの状態で実行すればエラーが発生します。 わかり易くコードを補完して書けば、この行は以下のように解釈されて 実行されてます。 Worksheets("Sheet1").Range(ActiveSheet.Cells(I, 1), ActiveSheet.Cells(I + 40, PrintCol)).Select Worksheets("Sheet1") は With によって補完されるもの。以下に続く Range() の括弧内の Cells はシートを指定しないと現在アクティブな シートとなります。 つまり、Sheet2 がアクティブな状態なら、次のコードと同意です。 Worksheets("Sheet1").Range(Worksheets("Sheet2").Cells(I, 1), Worksheets("Sheet2").Cells(I + 40, PrintCol)).Select Worksheets("Sheet1").Range ~ で Sheet1 にあるセルを参照するよー... としているのに、肝心の Range の中身で異なるシート、つまり Sheet2 のセルを指定してます。 これはイメージし易いと思いますが、物理的に不可能っぽいです。 ■ 2 点目 Select メソッドは「アクティブシートの中にあるものに対してのみ有効」 なので、現在アクティブでない別シートにあるものを Select しようと するとエラーになります。これは VBA の仕様です。 ■ 回避策ですが...一例を示しておきます。 With ActiveSheet   ' 列数をカウント   PrintCol = .Range("A1").CurrentRegion.Columns.Count   ' 罫線の描画   For I = 1 To PrintRow Step 41     Range(.Cells(I, 1), .Cells(I + 40, PrintCol)).Borders.Weight = xlThin   Next I End With # んーー。。。Rem を使う辺りから Basic 系言語の経験がある方だと # 推察致します。#2 や #3 のコードは VBA では良く使われるテクニック # ですから、とりあえずお試しを。

noname#33277
質問者

お礼

お付き合いありがとうございました。

noname#33277
質問者

補足

度々すみません。回避策でもだめでした。とりあえずRangeを使った文はエラーにならないので、邪道ですが、Cellsの代わりにRangeで切り抜けることにしました。本当に不思議です。 Rem 行,列数をカウント .Range("A1").CurrentRegion.Select PrintCol = .Selection.Columns.Count Select Case PrintCol Case 20: PrintCol = "T" Case 21: PrintCol = "U" Case 22: PrintCol = "V" Case 23: PrintCol = "W" Case 24: PrintCol = "X" Case 25: PrintCol = "Y" Case 26: PrintCol = "Z" Case 27: PrintCol = "AA" Case 28: PrintCol = "AB" Case 29: PrintCol = "AC" End Select PrintRow = .Selection.Rows.Count Rem 罫線の描画 For Qq = 1 To PrintRow Step 41 .Range("A" & Qq & ":" & PrintCol & Qq + 40).Select .Selection.Borders.Weight = xlThin .Selection.Borders(xlInsideVertical).Weight = xlHairline .Selection.Borders(xlInsideHorizontal).Weight = xlHairline Next Qq

その他の回答 (3)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

CurrentRegion はなかなか曲者なのであまりお勧めしませんが。。 Dim r As Range ' Range("A1").CurrentRegion の範囲と 5行目全体、Rows(5)で ' 重なるセルの参照を試みます Set r = Intersect(Range("A1").CurrentRegion, Rows(5)) ' 参照できれば選択 If Not r Is Nothing Then    r.Select End If とか。元のコードを生かすなら Range("A1").CurrentRegion.Select I = Selection.Columns.Count ' Cells(5,"A") は A5セルのこと。列の部分は列番号でも文字列でも ' 指定可能。ただし、この例での I は列番号に相当する数値を格納 ' した変数なので""で括らない。 Range(Cells(5,"A"),Cells(5,I)).Select

noname#33277
質問者

補足

知りたいのは前に書いたような事ですが、次の文にすると1回目は問題なく2回目エラーになります。 Rem 列数をカウント .Range("A1").CurrentRegion.Select PrintCol = .Selection.Columns.Count Rem 罫線の描画 For I = 1 To PrintRow Step 41 .Range(Cells(I, 1), Cells(I + 40, PrintCol)).Select 'この文でエラー発生 .Selection.Borders(xlEdgeLeft).Weight = xlThin .Selection.Borders(xlEdgeTop).Weight = xlThin .Selection.Borders(xlEdgeBottom).Weight = xlThin .Selection.Borders(xlEdgeRight).Weight = xlThin Next I

  • pauNed
  • ベストアンサー率74% (129/173)
回答No.2

こんにちは。 A5から変動列 i 列まで...なら Range(Cells(5, 1), Cells(5, i)).Select や Range("A5").Resize(, i).Select または Sub sample()   Range("A1").CurrentRegion.Rows(5).Select End Sub など^ ^

noname#33277
質問者

補足

>A5から変動列 i 列まで...なら >Range(Cells(5, 1), Cells(5, i)).Select この文が使えそうなのですが、次のようにするとエラーになります。 With objExcel 中略 .Range(Cells(5, 1), Cells(5, 24)).Select 中略 End With 実行時エラー '1004': 'Range'メソッドは失敗しました:'_Application'オブジェクト 何がいけないのでしょうか。

回答No.1

やりたいことが良く分かりませんが >例えば5行目のI列を指定する時 Range(Cells(5, i), Cells(5, i)).Select > Range("A5:" & I & "5").Select では、エラーになります。 たぶん Range(Cells(1, i), Cells(5, i)).Select のことかな?

noname#33277
質問者

お礼

知りたかったのは後の方です。こんな方法があったのですね。でも、 .Range("A1:X41").Select 上の文は何回やっても問題無いのですが、代わりに次の文にすると1回目は問題なく、同じ所を2回目通るとエラーになってしまいます。 全く同じ事をやっていると思うのですが何が原因なんでしょうか。。 .Range(Cells(1, 1), Cells(41, 24)).Select 実行時エラー '1004': 'Cells'メソッドは失敗しました:'_Global'オブジェクト

関連するQ&A

  • エクセルVBAで範囲の指定をしたいです(初心者)

    エクセルVBAで範囲の指定をしたいです(初心者) 列AからJがデータが入る範囲です。 列AとBとCには必ず数値等が何かしら入ります。 列Dは常に空白です。 列E以降は何か入ることも入らないこともあります。 7行目までデータがある場合、 A1セルからこの場合はJ7セルまでを範囲指定したいのですが 行数は未定なので、 Range("A1").Select Range(Selection,Selection.End(xlDown)).Select でA列のデータ最終行まで下がり、そこから9つ右の列までを 範囲指定するというのがよくわかりません。 自動記録で絶対参照と相対参照を切り替えてやってみたのですが、 どうしても Range(Selection, Selection.End(xlDown)).Select ActiveCell.Range("A1:J7").Select と常にA1からJ7が指定になってしまいます。 バージョンは2003です。 つたない質問文で申し訳ありませんが、 どなたか宜しくお願いいたします。

  • エクセルVBAでセル範囲選択→並べ替え

    大きなデータを選択する場合でA列には空白がない場合、 Range("A1").CurrentRegion.Select でいいと思うのですが、このデータを並べ替えようとするとき、1行から4行めには別の文字列がはいっており、5行目以下がデータであるとき、 Range("A1").CurrentRegion.Offset(4).Selectで下にさげると、最終選択範囲も下がってしまいます。 最終の範囲を変えず、開始位置を5行目にかえるにはどうすればよいのでしょうか?

  • VBA AutoFilter 範囲指定

    いつもお世話になっております 過去に https://okwave.jp/qa/q9707059.html にてワークシートのデータをオートフィルターをかけて別なワークシートにデータを取り出す方法を教えて頂きました 送られてくる元データが変更になって、A3セルの上のA2セルの上にテキスト文字が入るようになったので、範囲指定を正しく出来るようにする方法を https://okwave.jp/qa/q9708868.html にて教えて頂きました 今回、https://okwave.jp/qa/q9707059.htmlで教えて頂いたワークシートのコードを実行させると元データが変更になったデータを利用すると、A1セルまで含まれた範囲がAutoFilter の領域と判断される為正しい結果となりません 添付画像のワークシートで Sub test9() Worksheets("Sheet1").Range(Cells(3, "A"), Cells(Range("A3").CurrentRegion.Rows.Count, Range("A3").CurrentRegion.Columns.Count)) _ .AutoFilter Field:=2, Criteria1:=Cells(5, "G").Value End Sub を実行させれば、"秋田”でフィルターがきちんとかけれらた状態になります そこで教えて頂いたコードを下記に変更して実行させてみたのですが Dim i As Long With Worksheets("Sheet1") .Range("B4", .Range("B4").End(xlDown)).Copy .Range("G4").PasteSpecial (xlPasteAll) .Range("G4", .Range("G4").End(xlDown)).RemoveDuplicates Columns:=Array(1), Header:=xlNo For i = 4 To .Cells(Rows.Count, "G").End(xlUp).Row Worksheets.Add After:=Worksheets(Worksheets.Count) ActiveSheet.Name = .Cells(i, "G").Value .Range(Cells(3, "A"), Cells(Range("A3").CurrentRegion.Rows.Count, Range("A3").CurrentRegion.Columns.Count)) _ .AutoFilter Field:=2, Criteria1:=.Cells(i, "G").Value .Cells(3, 1).CurrentRegion.Copy Destination:=Worksheets(.Cells(i, "G").Value).Cells(3, 1) .AutoFilterMode = False Next .Range(Cells(3, "A"), Cells(Range("A3").CurrentRegion.Rows.Count, Range("A3").CurrentRegion.Columns.Count)) _ .AutoFilter Field:=2, Criteria1:=.Cells(i, "G").Value 部分で 実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーです になってしまいます 元データがA2セルにテキスト文字が入った状態でも正常にコード動作させるにはどのようにしたらいいのでしょうか よろしくお願い致します

  • Excelマクロ 範囲指定について教えて下さい。

    ソフトから書き出したテキスト形式のファイルを、エクセルで読み込んで範囲を指定し、 他のブックのシートに貼り付けるという、いつもの作業をマクロで簡素化しようと、 マクロ初心者の私は、マクロの自動記録と、インターネットで調べたりで作っているのですが、 範囲指定でつまづいています。 読込んだファイルには、A列からH列までデータがあります。 行のほうは、その都度変わります。 A列を下に見ていくと、途中<小計>という文字が何度か出てきます。 左上端がA4として、そこから初めての<小計>がある行の1段上の行までで 範囲指定させることは出来るのでしょうか? 例えば、A20に<小計>があるなら、指定範囲を A1:H19 という具合に するのはどうしたらいいですか? 下のマクロでは、H列の右下端まで全部範囲指定するので、ダメですね。 Dim 左上端 As String, 右下端 As String Windows("aaa.txt").Activate Worksheets("aaa").Select 左上端 = "A4" 右下端 = Range(左上端).SpecialCells(xlLastCell).Address Range(左上端 & ":" & 右下端).Select Selection.Copy Windows("bbb.xls").Activate Sheets("bbb").Select Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False Excel2003を使っています。 よろしくお願いします。

  • 日付が表示されているセルのみ範囲指定したい

    Excel2007でマクロ作成中の初心者です。 範囲指定がうまくいかない。 1)セルB30  =IF(A30="","",VLOOKUP(A30,表データ,2,FALSE))   セルB31  =IF(A30="","",VLOOKUP(A31,表データ,2,FALSE))    以下略  というように、セルB30~B60まで関数が入っており、  以下のように表示されています。  1   9月21日 2   9月22日    以下略    〃 29  10月19日 30  10月20日 31       ←(ここのセルは日付表示されず空欄。 関数 =IF(A60="","",VLOOKUP(A60,表データ,2,FALSE))が入っている) 2)以下のコードを実行すると Sub 範囲を選択() Range("B30").CurrentRegion.Select Selection.Resize(Selection.Rows.Count - 1).Select Selection.Offset(1, 0).Select Selection.Resize(Selection.Rows.Count - 1).Select End sub 1から31行まで選択されてしまします。これを30行目まで、日付の表示あるセルのみ 選択したいのですが、どうすればよろしいでしょうか

  • EXCELで印刷範囲指定

    マクロの記録で印刷範囲の指定を考えています。 以下のマクロを記録しました。 Sub 印刷範囲指定() Cells.Select With Selection.Font .Name = "MS Pゴシック" .Size = 9 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With Range("A1").Select With ActiveSheet.PageSetup .PrintTitleRows = "$6:$8" .PrintTitleColumns = "" End With ActiveSheet.PageSetup.PrintArea = "" With ActiveSheet.PageSetup .LeftHeader = "" .CenterHeader = "&A" .RightHeader = "" .LeftFooter = "" .CenterFooter = "&P / &N ページ" .RightFooter = "" .LeftMargin = Application.InchesToPoints(0.78740157480315) .RightMargin = Application.InchesToPoints(0.78740157480315) .TopMargin = Application.InchesToPoints(0.984251968503937) .BottomMargin = Application.InchesToPoints(0.984251968503937) .HeaderMargin = Application.InchesToPoints(0.511811023622047) .FooterMargin = Application.InchesToPoints(0.511811023622047) .PrintHeadings = False .PrintGridlines = False .PrintComments = xlPrintNoComments .PrintQuality = 600 .CenterHorizontally = False .CenterVertically = False .Orientation = xlLandscape .Draft = False .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic .Order = xlDownThenOver .BlackAndWhite = False .Zoom = 100 End With ActiveWindow.View = xlPageBreakPreview ActiveWindow.LargeScroll ToRight:=1 ActiveSheet.PageSetup.PrintArea = "$A$1:$I$50" ActiveWindow.View = xlNormalView Columns("B:I").Select Columns("B:I").EntireColumn.AutoFit Range("A1").Select End Sub やりたいことは ・まず最初にcsvファイルをxlsファイルに取り込む機能をつけたい。 ・取り込んだcsvをシートの一番最後につける。 そのファイルを以下のように設定していきたいです。 ・列の印刷範囲を数ある列のうちA列からI列までとする。 ・行の印刷範囲をA列の最終行までとしたい。 上記マクロでここを修正すればいいというところがあれば教えてください。。

  • セル範囲指定方法

    VBAにて下記作成中ですが、行き詰ってしまいました。 どなたか、ご教授願います。 Sub 転記ボックス1_Click() Sheets("S").Select Range("N13").Select If ActiveCell.Value <> "" Then Selection.Copy Sheets("H").Select Range("K65536").End(xlUp).Offset(0, 1).Select --->シートH、K列最終行の右隣からL列最終行の範囲を指定 上記指定範囲内全てに、シートS・N13の値を貼付 ElseIf ActiveCell.Value = "" Then Sheets("H").Select Range("K65536").End(xlUp).Offset(0, 1).Select --->シートH、K列最終行の右隣からL列最終行の範囲を指定 上記指定範囲内全てに、”シートS・N13”と入力 End If End Sub --->部分の書き方がわかりません。 よろしくお願いします。

  • 空白までのデータを範囲指定する

    EXCEL VBAにて教えてもらいたい事があります。 空白までの行列を範囲指定したいのです。         A  B   C   D  1   1123 123  12  57 2    32 1 5 52 3 2 98 852 11 4 65 2 72 1 A列からD列の行が空白になるまでの範囲を指定する マクロを教えてほしいです。 A列の最終行の次の行にカーソルを合わせるマクロはわかるのですが 範囲を指定する方法がわかりません。 よろしくお願いいたします。 最終行の次の行にカーソルを合わせるマクロ Range("A1").End(xlDown).Select ActiveCell.Offset(rowOffset:=1).Activate Selection.Copy

  • VBAでセルの範囲指定

    お世話になります。 下記の様に1回セルを指定範囲した後に、列を2列マイナス する場合の記述方法をお教え下さい。宜しくお願いします。      記 range("a1").currentregion.select

  • エクセルで指定した行範囲を別のシートにコピーするには?

    (1)指定した行(数値)を変数として登録する方法 tx1 = Sheets("0").Range("A1") tx2 = Sheets("0").Range("A2") tx3 = Sheets("0").Range("A3") A1=2 A2=2000 A3=2500 (2)(1)で指定した変数を使用して行範囲を他のシートSheets(”1”)、Sheets("2”)にコピーペースト。 行(”2:1999”) ←tx1 : tx2-1(A2の数値から1を引いた数値) Rows(▲▲▲▲▲▲).Select Selection.Copy Sheets("1").Select Rows("1:1").Select ActiveSheet.Paste 行(”2000:2499”) ←tx2 : tx3-1(A3の数値から1を引いた数値) Range(▲▲▲▲▲▲).Select Selection.Copy Sheets("2").Select Rows("1:1").Select ActiveSheet.Paste ▲部分がエラーになってしまい、うまくいきません。 正しい方法を教えてください。

専門家に質問してみよう