- ベストアンサー
Excel VBAでセルの結合をオートフィルする方法
- Excel VBAを使用して、セルの結合をオートフィルする方法について説明します。
- 結合されたセルに式を入力し、その式を最終行までオートフィルする方法についても解説します。
- また、不要なダミーデータの使用を避け、効率的な処理を行う方法も紹介します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでどうでしょうか。 Dim rw As Long rw = Cells(Rows.Count, 5).End(xlUp).Row Application.ScreenUpdating = False With Range("F5:F6") .Merge .Formula = "=Sheet2!A1" End With Range("F5:F6").AutoFill Destination:=Range("F5:Q6"), Type:=xlFillSeries Range("F5:Q6").AutoFill Destination:=Range("F5:Q" & rw), Type:=xlFillSeries Application.ScreenUpdating = True
その他の回答 (4)
- tsubuyuki
- ベストアンサー率45% (699/1545)
読み返して、「あ~、そうか。」とようやく納得。 > 1.まず、F~Q列の5001行に文字を入れる > 2.5000行まで2行ずつセルを結合する、F~Q列全て行う > 3.F5にオートフィルしたい式を入れる > 4.F5~Q6(ここも2行ずつ結合してあります)までオートフィルをする > 5.F5~Q6に入っている式を下方向へオートフィルする 要するに、結合してからフィルしようとしているのですね。 1.F5セルにオートフィルしたい式を入力 2.F5・F6セルを結合 3.Q列まで(結合されていない)列方向にフィル 4.最終行まで(結合されていない)行方向にフィル の順番のほうが良いですよ。 マクロを使わずに、エクセルで直接フィルする時も 途中に結合セルがあると失敗することがありますよね。 マクロでもそれと同様ですから。
お礼
説明下手で誤解を与えてしまい申し訳ないです 結合してからフィルを行おうとしていました 手動でオートフィルを行うと問題なく動いていたもので・・・ しかし処理の順番が悪いと言うのもあったのですね 以後の参考にします 貴重なお時間を煩わせて申し訳ありません、そしてありがとうございました
- tsubuyuki
- ベストアンサー率45% (699/1545)
うまく伝わらなかったようなので。 少々長くなりますがご容赦ください。 「オートフィル」がお好みのようですね。 じゃあ、オートフィルでいきましょう。 この場合に問題になるのは、A~E列が「どのように入力されているか、ですね。 5・6行目についてだけ、まずは考えて見ます。 考えられるパターンは3つ ・5行目だけに値が入っている ・6行目だけに値が入っている ・どちらも値が入っている と言うパターンですね。 コレ以降の行に拡張すると、 ・奇数行だけに値が ・偶数行だけに値が ・どちらにも値が と言う3パターンに加えて ・混在している と言う4つ目のパターンも考えられます。 また例外として、 ・どちらも空白である と言う選択肢も発生するかもしれません。 ただし、これはうまくないのは言うまでもありませんね。 もし実際の最終行がこの状態(奇数偶数どちらも空白)なのであれば、 データまたは最終行判定条件を見直すことを強くオススメします。 続いて最終行を判定する条件。 奇数行(5行目)から開始して、2行ごとに結合していくのですから、 「処理後の最終行は必ず偶数行である」と言えます。 2行を結合したセルを下(行)方向にフィルしていくわけです。 処理する行数が奇数だと、最終的に「く都合するべきセルが範囲に無い」ため、 エクセルはエラーを返すしかなくなるわけです。 つまり、xlupなどで見つけた最終行が奇数なら(処理範囲の行数が奇数なら)、 次の行(偶数行)までの処理(処理行数が偶数)であると置き換える必要があります。 見つけた最終行が偶数行(処理行数が偶数)であれば、そのまま処理を流してOKです。 これが解れば、 > 中途半端に設定すると最終行が取得できない可能性 は無いことが解ります。 つまり、奇数行で終わる場合は「次の行まで」 偶数行で終わるなら「その行まで」と言う終了条件をつければ良いのです。 見た感じ、E列を基準に「最終行」を拾っているようですので、 とりあえず、それを採用して書いてみます。 Sub sample1() Dim MaxRow As Long MaxRow = Cells(Rows.Count, 5).End(xlUp) ' 実データE列の最終行取得 If MaxRow Mod 2 = 1 Then MaxRow = MaxRow + 1 '最終行が奇数なら次の行までに拡張 With Range("F5") ' F5セルに対して .Value = "=SUM($E5:E5)" ' 式を文字列として入力(仮) .Resize(2, 1).Merge ' 下のセル(F6セル)と結合 End With ' 横方向にQ列までフィル Range("F5:F6").AutoFill Destination:=Range("F5:Q6"), Type:=xlFillDefault ' 縦方向にMaxRow行目までフィル Range("F5:Q6").AutoFill Destination:=Range("F5:Q" & MaxRow), Type:=xlFillDefault End Sub 入力したい式がわかりませんので適当な式を文字列で入力していますが、 ここはもちろんお使いの式に直してくださいませ。 文字列を入力する場合は .Value = "文字列" としてやればOKです。 図は"文字列"を入力して走らせた結果です。 実際のデータの最終行が奇数行(21行目)ですので、 その下の行(22行目)までを範囲として判定しています。 見やすいかどうかはわかりませんが、罫線を入れ、 結合された行を1行おきに色をつけています。 上記の ・奇数行だけに値が(11・12行目など) ・偶数行だけに値が(15・16行目) ・どちらにも値が(5・6行目など) つまり ・混在している と言う入力条件を全て網羅していると言うこと、 及び、データの途中であれば ・どちらも空白(7・8行目) にも対応できているのが確認いただけると思います。 (重ねますが、最終行が「どちらも空白」には対応できません。) ちなみにコレで5000行でも1秒かかりません。 (パソコンのスペックにもよるでしょうが、気になる遅さではないはずです。) 前の回答で言いたかったことは 「とりあえずいろいろな可能性を考えて、実際に動かしてみてください。」 と言うことです。 オートフィルにこだわらず、1セルずつ結合していく手段もありますよ、と言うことですね。 その他にも、 横方向にフィルが出来たのであれば、それをコピーして1行おきに貼り付ける手段もあるわけです。 ひとまず、上記コードを一度走らせてみてください。 で、ご自身のコードと見比べて補完なさってください。
- xls88
- ベストアンサー率56% (669/1189)
提示例に則ってやるとすれば With Cells(Rows.Count, 5).End(xlUp) Range(.Offset(1, 1), .Offset(1, 12)).value = "最終判定" End With With Range("F5:Q6") .AutoFill Destination:=Range(.Cells, .Cells.End(xlDown).Offset(-1)), Type:=xlFillSeries End With
お礼
ありがとうございます。 処理速度も速く、理想的な動きが出来ました
- tsubuyuki
- ベストアンサー率45% (699/1545)
長いので詳しく読んでいませんが・・ 要するに ・1行おきにデータ(式など)を入力 ・2行1列ずつ結合 したいのでしょうか。 何かの参考になるかもしれませんので、 新規ブックで下記を走らせてみてください。 Sub sample() For i = 1 To 5000 Step 2 Cells(i, 1) = "あ" Cells(i, 1).Resize(2, 1).Merge Next End Sub まぁつまり、入力と結合を一気にやってみようと言うだけのことです。 さすがに5000行をこなそうと思ったら時間はかかりますけどね。
お礼
5000行まで入力すると言うのは、回避手段なので本来は回避したいんです 2行ずつ結合した、E~QまでのEnd(xlDown)で取得した最終行まで一気にオートフィルをしたいのです・・・。
お礼
ありがとうございます。 やりたい動きはこれでした 処理速度も速く、理想的な処理が出来ました