エクセルVBAでの複数範囲結合方法とは?

このQ&Aのポイント
  • エクセルVBAを使用して複数のセル範囲を一括で結合する方法について教えてください。
  • 例えば、A列のセルを2行ずつ結合する方法はありますか?
  • Forループを使用して一つずつ結合するのではなく、一括で結合する方法を知りたいです。
回答を見る
  • ベストアンサー

エクセルVBA(rangeでの複数範囲指定方法)

いつも有難うございます。 タイトルの件でご教示いただきたく、お願いいたします。 やりたいことは、複数のセル結合を一括でおこないたい、というものです。 具体的には【A列をn行目まで、2行ずつセル結合する】方法です。 例えば、20行目まで2行ずつ結合する、と決まっていれば次のような記述が可能です。 (例1) Range( _ "A1:A2,A3:A4,A5:A6,A7:A8,A9:A10,A11:A12,A13:A14,A15:A16,A17:A18,A19:A20"). _ MergeCells = True これを「n行目」までとするため、次のような記述を考えました。 (例2)   Dim i As Integer   Dim n As Integer Range("A65536").End(xlUp).Select n = ActiveCell.Row + 1 For i = 1 To n Step 2 Range(Cells(i, 1), Cells(i + 1, 1)).MergeCells = True Next こちらの For ~ Next 内の構文についてです。 この構文ですと、一つずつ選択→結合をしていくので、相応の時間がかかってしまうため、 例1の構文のように、先に範囲を指定して一括で結合する方法を調べたのですが見つからず 質問させていただきました。 (やりたい構文) For i = 1 To n Step 2   ※ = (A1:A2,A3:A4,・・・An-1:An) Next   Range(※).MergeCells = True このような方法はありますでしょうか。 ご教示のほど、宜しくお願いいたします。

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

  • ベストアンサー
回答No.1

http://veaba.keemoosoft.com/2013/02/494/ これとか参考にどうでしょうか?

e-d-o-
質問者

お礼

皆様、いろいろとお知恵をくださり有難うございました。 それぞれ試してみたところ、甲乙付けがたかったのですが、 こちらが一番しっくりきたのとリンク先のページが その他の情報の参考にもなるので、ベストアンサーに 選ばせていただきました。 今後とも宜しくお願いいたします。

その他の回答 (3)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんにちは! 一例です。 A列の65536行目までを2行ずつ結合するとして・・・ 倍々でコピーしていってはどうでしょうか? まずA1・A2セルを結合 → A3セルにコピー&ペースト → A1~A4セルをA5セルに A1~A8セルをA9セルに → A1~A13をA17セルに・・・ といった感じです。 最初はあまり速くない感じですがコピー&ペーストの範囲がだんだん広くなっていきます。 最終的にはこれを15回繰り返せば65536行まで達すると思います。 Sub Sample1() Dim cnt As Long Range("A1:A2").Merge Do Until cnt = 15 cnt = cnt + 1 Range(Cells(1, "A"), Cells(2 ^ cnt, "A")).Copy Cells(2 ^ cnt + 1, "A") Loop MsgBox "処理完了" End Sub 尚、お示しのコードはA65536セルから上に向かって最終データ行を取得し、結合したいものと思われますが、 すべて同じデータであれば問題ないかもしれませんけど、データが違う場合は結合できないと思いますので インプットボックスに結合したい最終行(かならず偶数行)を入力し A1~入力したセルまでを二つずつ結合させるコードも載せてみます。 (単にオートフィルでの処理です) Sub Sample2() Dim lastRow As Long lastRow = InputBox("結合したい最終行を偶数で入力") Range("A1:A2").Merge Range("A1").Select Selection.AutoFill Destination:=Range(Cells(1, "A"), Cells(lastRow, "A")), Type:=xlFillDefault End Sub こんな感じではどうでしょうか?m(_ _)m

noname#203218
noname#203218
回答No.3

for ~lnext、Do~Loop両方やってみました。 10000行処理で両方共に約1秒の処理時間でした。 B1セルに処理時間表示するようにしてあります。 確認後はタイマーの不要部分は削除下さい。 処理速度はor ~lnextよりDo~Loopの方が早いとネットで出てましたが、演算でないのであまり変わらないようです。 selectやactive、copy等は処理速度が遅くなるはずですので、使用は出来るだけ避けたほうが良いようです。 Application.ScreenUpdating = Falseで画面更新を中断させました。これで私のPCで約0.5秒早く処理出来ました。 ご参考まで Sub sample1() Dim i, n As Long Dim dblStart As Double '開始時刻取得エリア Dim dblEnd As Double '終了時刻取得エリア Dim lngCnt As Long 'カウンタ Dim dblTime As Double '所要時間取得エリア dblStart = Timer '最終行が奇数行の場合は1を足し偶数行にする。 n = Cells(Rows.Count, 1).End(xlUp).Row If n Mod 2 = 1 Then n = n + 1 Application.ScreenUpdating = False For i = 1 To n Step 2 Range(Cells(i, 1), Cells(i + 1, 1)).MergeCells = True Next '終了時刻を取得する dblEnd = Timer '所要時間を計算する dblTime = dblEnd - dblStart ' 所要時間を表示します。 Cells(1, 2) = "所要時間は" & Format$(Int(dblTime * 10 ^ 4 + 0.5) / 10 ^ 4) & "秒だよ。" Application.ScreenUpdating = True End Sub Sub sample2() Dim i, n As Long Dim dblStart As Double '開始時刻取得エリア Dim dblEnd As Double '終了時刻取得エリア Dim lngCnt As Long 'カウンタ Dim dblTime As Double '所要時間取得エリア dblStart = Timer n = Cells(Rows.Count, 1).End(xlUp).Row If n Mod 2 = 1 Then n = n + 1 i = 1 Application.ScreenUpdating = False Do While i < n Range(Cells(i, 1), Cells(i + 1, 1)).MergeCells = True i = i + 2 Loop '終了時刻を取得する dblEnd = Timer '所要時間を計算する dblTime = dblEnd - dblStart ' 所要時間を表示します。 Cells(1, 2) = "所要時間は" & Format$(Int(dblTime * 10 ^ 4 + 0.5) / 10 ^ 4) & "秒だよ。" Application.ScreenUpdating = True End Sub

  • chie65535
  • ベストアンサー率43% (8525/19378)
回答No.2

Range("A65536").End(xlUp).Select n = Int((ActiveCell.Row + 1) / 2) * 2 Range("a1:a2").Select Selection.Merge Selection.Copy Range(Cells(3, 1), Cells(n, 1)).Select Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 「結合は書式だから、書式のコピーをすれば良い」ってのに気が付けるかどうか。 あと「2行分をコピーしているから、コピー先のセルの範囲指定は必ず2の倍数の行数にしないといけない」ので、nの計算にちょっと調整が入ってます。 あと「セルのコピー」なので、数万行あれば「それなりの時間」がかかります。

関連するQ&A

  • Excel 2007 <VBAでグラフの操作>

    Excel 2007 <VBAでグラフの操作> 現在すでにあるグラフを修正しています。 下記マクロでは「各グラフに系列が2つあり、その1つ目を削除して残る1つのデータ範囲(X軸の値)を再設定する」という内容です。 下記マクロではFor構文冒頭のSet~の行で、 「実行時エラー '1004': 'Cells'メソッドは失敗しました:'_Global'オブジェクト」 とのエラーが出ます。 このエラーについて検索してみたのですが、これといったものが見つからなかったので、このマクロでおかしなところがあれば直接指摘していただけないでしょうか。 よろしくお願いします。 Private Sub Test_Arrange()   Dim MyRng As Range   Dim R As Integer   Dim n As Integer   Dim i As Integer   n = 10   R = Sheets("Sheet1").Range("A1").End(xlDown).Row   For i = 1 To n     Set MyRng = Sheets("Sheet1").Range(Cells(2, 2 * n + 3), Cells(R, 2 * n + 3))     Charts(i).SeriesCollection(1).Delete     Charts(i).SeriesCollection(1).XValues = MyRng   Next i End Sub

  • エクセル VBA もっときれいな書き方?

    Sub test() Dim i As Integer, n As Integer n = 1 For i = 2 To 150 If Cells(i, 1) <> Cells(i - 1, 1) Then Cells(i - 1, 5) = i - n Cells(i - 1, 6) = Application.WorksheetFunction.Sum(Range("B" & n & ":" & "B" & i - 1)) n = i End If Next i End Sub 上記のマクロですが Application.WorksheetFunction.Sum(Range("B" & n & ":" & "B" & i - 1)) この部分、もっとスマートに書く方法を教えてください。 Range("B" & n & ":" & "B" & i - 1)って、ちゃんと動きますが、書き方が何か変なような気がするんです。 よくわかってもいないのにすみません。

  • エクセルVBAで範囲を変数で設定する方法?

    Dim i As Integer For i = 1 to 50 とした場合、 セルであれば Sheets("Sheet2").Cells(i, 2).Value = Sheets("Sheet1").Cells(i, 2) のように変数を使えますが、範囲に使う場合にはどう書けばいいのでしょうか? 例えば、 Sheets("Sheet2").Range("A1:G1").Value = Sheets("Sheet1").Range("A1:G1") のような式で、行数を変数にする場合です。 よろしくお願いします。

  • EXCEL VBA----離れたセル範囲の指定

    こんにちは。初歩的なことで困っています。 Range("A3:A19,F3:F19").Select のように、離れたセル範囲を選択したいのですが 上の例の19行目が不定であるため、変数を使ったCellsプロパティを使用し i=Range("A3").End(xldown).Row Range("Cells(3, 1).Cells(i, 1), Cells(3, 6).Cells(i, 6)").Select と書いてみたのですが、エラーになってしまいました。 正しい指定の仕方を教えて下さい。よろしくお願いします。

  • VBAで、35行3列の範囲を通し番号で埋めたい

    お世話になります。 表題のとおり、F5:H35の範囲で、通し番号を入力したいのですが、VBAコードのヒントを教えていただけませんでしょうか? 番号を振る規則は「5行が1・2・3」「6行が4・5・6」といった具合に、横に昇順に並べたいのです。 最後に「35行が103・104・105」としたいです。 下記のようにコードを書いてみました。 5行(1行目)まで走るんですが、6行(2行目)に改行してくれませんでした。 For構文の原理がいまひとつ理解できてないからでしょうか? --------------------------------------- Sub 通し番号() 1) Dim i As Integer, j As Integer, n As Integer 2) i = 5 3) j = 6 4) n = 1 5)For i = i To 35 6)For j = j To 8 7)Cells(i, j) = n 8)n = n + 1 9)Next 10)Next End Sub -------------------------------------- 以上です。 よろしくお願いいたいます。

  • エクセル2003のVBAで列を指定

    エクセルで特定の列の2~10行目に対して、ある作業をする場合、列を指定する方法は以下のどれがいいでしょうか?あるいはもっといい方法があれば教えてください。 実際には列は約40列(固定)、行は1~2万行(変動)程度で、作業はもっと複雑です。 Sub test01() Dim col Dim i As Long, n As Long For Each col In Array(1, 3, 7, 8, 11) '列番号で指定 For i = 2 To 10 n = n + 1 Cells(i, col).Value = n Next i Next col End Sub Sub test02() Dim col Dim i As Long, n As Long For Each col In Array("A", "C", "G", "H", "K") '列の記号で指定 For i = 2 To 10 n = n + 1 Cells(i, col).Value = n Next i Next col End Sub Sub test03() Dim col Dim i As Long, n As Long For Each col In Range("A2,C2,G2,H2,K2") 'セルで指定 For i = 2 To 10 n = n + 1 col.Offset(i - 2).Value = n Next i Next col End Sub

  • エクセルのマクロで複数セル指定は?

    以前(7月22日 質問No.936181)の質問でご回答を頂いたマクロなんですが、 Private Sub Worksheet_Change(ByVal Target As Range) Dim MyData As String Dim i As Integer Dim ImaNanji As String Dim SakkiNanji As String Dim ImaNanpun As String Dim SakkiNanpun As String SakkiNanpun = Cells(2, 3).Value ImaNanji = Cells(1, 3).Value ImaNanpun = Mid(ImaNanji, Len(ImaNanji) - 4, 2) If ImaNanpun <> SakkiNanpun Then Application.EnableEvents = False For i = 10 To 2 Step -1 MyData = Cells(i - 1, 2).Value Cells(i, 2).Value = MyData Next i MyData = Cells(1, 1).Value Cells(1, 2).Value = MyData Cells(2, 3).Value = ImaNanpun Application.EnableEvents = True End If End Sub A1のデータをB1からB10に一分おきにつぎつぎに書き込むというものなんですが、ひとつのセルではなく複数のセル(例えばA1からA30の30個のセル)をいっぺんに書き込むようにしたいのですが可能でしょうか? よろしくお願いします。

  • エクセルVBAでTransposeの不思議

    MS Officeのエクセル2000です。 下記Sub test01はRange("A1:I1")に文字列を入力し、一旦配列に取り込んでからワークシートに貼り付けるものです。 試験用のコードですので意味はありません。 このコードで255文字まではまったく問題はありません。 ところが、256文字以上の場合、横に貼り付けは問題ないのですが、 Transposeで縦に変換すると型が一致しません。(Error 13)となります。 どうしてでしょうか? 試行錯誤の結果、Sub test02のように一旦横に貼ったデータをコピーしてTransposeして貼り付けるのは大丈夫のようですので不思議でしょがありません。 またこの方法は列数256より要素が多い配列には使えないので解決策にはなりません。 ご教示くださいませ。 Sub test01() Dim myAr As Variant Dim i As Integer, n As Integer n = 256 '文字数 With ActiveSheet .UsedRange.ClearContents For i = 1 To 9 .Cells(1, i).Value = Application.Rept(Left(.Cells(1, i).Address(0, 0), 1), n) Next myAr = .Range("A1:I1").Value .Range("A3").Resize(, UBound(myAr, 2)).Value = myAr .Range("A5").Resize(UBound(myAr, 2)).Value = Application.Transpose(myAr) '256文字の場合エラー End With End Sub Sub test02() Dim myAr As Variant Dim i As Integer, n As Integer n = 256 '文字数 With ActiveSheet .UsedRange.ClearContents For i = 1 To 9 .Cells(1, i).Value = Application.Rept(Left(.Cells(1, i).Address(0, 0), 1), n) Next myAr = .Range("A1:I1").Value .Range("A3").Resize(, UBound(myAr, 2)).Value = myAr .Range("A3").Resize(, UBound(myAr, 2)).Copy .Range("A5").PasteSpecial Paste:=xlValues, Transpose:=True '256文字の場合もOK Application.CutCopyMode = False End With End Sub

  • エクセルのマクロで変動する範囲にコピペ

    いつもお世話になっております。 やりたいことは、 Sheet1において計算結果A1の値を変数nでとって、 (nが1以下になることはありません) A2のデータを W2からWnまで貼り付けたいのです。 そこで以下のマクロを書いてみました。 Range("A2").Select Selection.Copy Dim i As Integer Dim n As Integer n = Val(Worksheets("Sheet1").Range("A1").Value) For i = 2 To n Cells(i, 23).Select Next ActiveSheet.Paste しかし、これでは、(nが10とすると)  W10セルにしか貼り付けられません。 正しい記述方法をご教示ください。 よろしくお願いします。

  • 結合セルが連続して複数存在する場合。

    結合セルが連続して複数存在する場合。 vbaでどのようにしたら単体の結合セルが抽出できるでしょうか? 環境はexcel2003です。(写真は2010ですが) よろしくお願い致します。 以下ソース Dim MergeArray(1000),Mergecount '配列 複数のセルを格納したい。,添え字 Dim i,j'while文で使用する。 Dim m, n '行,列 m = 1'行だけ動かす。 n = 2'列は固定する。 i = 1 j = 1 mergecount = 1 while i <= 1000 If Range(Cells(m,n),Cells(m + j,n).mergecells = True then while j <= 1000 If Range(Cells(m,n),Cells(m + j,n)).mergecells = false then MergeArray(mergecount)=Range(Cells(m,n),Cells(m + j,n))'->ここでエラーがでました。 MsgBox MergeArray(mergecount) mergecount = mergecount + 1 m = m + j End If j = j + 1 wend End If m = m + 1 i = i + 1 Wend