
いつも有難うございます。
タイトルの件でご教示いただきたく、お願いいたします。
やりたいことは、複数のセル結合を一括でおこないたい、というものです。
具体的には【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ベストアンサー
- 回答日時:
皆様、いろいろとお知恵をくださり有難うございました。
それぞれ試してみたところ、甲乙付けがたかったのですが、
こちらが一番しっくりきたのとリンク先のページが
その他の情報の参考にもなるので、ベストアンサーに
選ばせていただきました。
今後とも宜しくお願いいたします。
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
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
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) ExcelVBAの転記について 1 2022/03/23 20:13
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Excel(エクセル) vbaで列幅について 1 2022/11/15 08:31
- Visual Basic(VBA) データのある範囲を選択するVBAについて 2 2022/09/03 00:20
- Excel(エクセル) VBAのoffsetの動き方について教えてください 3 2022/11/25 23:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セル入力文字が、「右のセルに...
-
Excelのセル内の文字の頭に半角...
-
エクセルで知らない間に行がず...
-
エクセルでセルの中の文字が削...
-
あるセルに色を付けた時、別の...
-
Wordで、表のセルが変なところ...
-
エクセルで複数行を括弧でくく...
-
エクセルの一つのセル内に2つの...
-
エクセル2010で、結合したセル...
-
Wordの表で逆L字型のセルを作成...
-
ピボットで作成した表は、セル...
-
エクセル 結合したセルの間にセ...
-
ワードの表で中央揃えが出来ない
-
Word 表のセル塗りつぶし
-
ワードで表の中の文字がセンタ...
-
ワードで表を作ってセル内で改...
-
Wordで天地(上下)が同じ中に...
-
エクセルVBA 文字を入力したら...
-
Excelで文字の周りにスペースを...
-
Word 表のセルを結合せずに文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セル入力文字が、「右のセルに...
-
エクセルでセルの中の文字が削...
-
エクセルで知らない間に行がず...
-
あるセルに色を付けた時、別の...
-
Excelのセル内の文字の頭に半角...
-
Wordで、表のセルが変なところ...
-
エクセルの一つのセル内に2つの...
-
エクセル 結合したセルの間にセ...
-
エクセル2010で、結合したセル...
-
WORDで表の行を2行に分けたい
-
Wordでセルに文字を入力すると...
-
ワードで表を作ってセル内で改...
-
ワードで表の中の文字がセンタ...
-
Wordの表で逆L字型のセルを作成...
-
ピボットで作成した表は、セル...
-
エクセルで複数行を括弧でくく...
-
Word 表のセルを結合せずに文字...
-
エクセルで捺印をもらう欄を別...
-
Wordで天地(上下)が同じ中に...
-
Word 表のセル塗りつぶし
おすすめ情報