

VBAでマクロを組んでいたところ、問題が出てきたので質問させてください。
1.任意の列を全選択する(たとえばA列とC列という離れた列です)
2.その列の中でも、すべての行にではなく、数行にだけセル結合解除という処理を施す
というマクロを組もうとしています。
しかし、全選択した列の一部の行(画像参照)にだけ処理を施す、というのができません。
1列だけ全選択→セル結合解除、というのはできるのですが、複数の列(しかも列同士が隣り合っていない)に対して処理を施すというのがうまくいかず…。
以下のようにマクロを作成してみたのですが、どこが問題になってるのでしょうか?
アドバイスいただけると幸いです。
Sub test1()
Dim intX_1 As Long
Dim intX_2 As Long
Dim rg1 As Range
Dim rg2 As Range
Set rg1 = Range(CStr(ActiveWindow.RangeSelection.Address))
For Each rg2 In rg1
'選択した列のうち、2行目~最後のデータが存在する行まで処理を行う
intIX_1 = 2
While rg2(intIX_1) <> ""
rg2(intIX_1).MergeCells = False
intIX_1 = intIX_1 + 1
If rg2(intIX_1) = "" Then
Exit For
End If
Wend
Next
End Sub

No.5ベストアンサー
- 回答日時:
個別の範囲なら処理できる、しかし複数の選択範囲を個別の範囲にバラす方法が分からない、というのが質問の核のようなので…。
Excel VBAのヘルプでRangeオブジェクトのプロパティを見ていくと、Areasというのがあります。
これでインデックスを指定して個別に参照できます。
Sub aaaa()
Dim i As Integer
Dim r As Range '列を参照する
For i = 1 To Selection.Areas.Count
Set r = Selection.Areas(i)
'列ごとの処理を実施
MsgBox r.Address & " -> " & r.Rows("3:5").Address
Next
End Sub
ご回答ありがとうございます。Areaを使うと複数の連続してない範囲についての処理ができるんですね。これを改造した結果、無事に目的のマクロを作成することができました。とても助かりました。ありがとうございました。
No.6
- 回答日時:
ちょっと横からおじゃまさせていただきます。
オブジェクト変数を使わずに、たとえば
Range("$A:$A,$D:$E")
から、スマートに単独の列をとりだす方法は思いつきませんので、オブジェクト変数を用います。
Sub test1()
Dim targetRange As Range, myArea As Range, myColumn As Range
'一旦、オブジェクト変数に受けると、インテリセンスが効いて
'Rangeオブジェクトの様々なメンバが表示されるので、参考になります
Set targetRange = Selection
'Range("$A:$A,$D:$E")の様な場合に対応するため、下記が常道
For Each myArea In targetRange.Areas
For Each myColumn In myArea.Columns
Debug.Print myColumn.Address
Next myColumn
Next myArea
'下記でも結果は同じでした
' For Each myColumn In targetRange.Columns
' Debug.Print myColumn.Address
' Next myColumn
'しかし
'Debug.Print targetRange.Columns.Count
'は最初の群の列数1を戻し、総列数の3は戻しません
End Sub
さて、本題に戻って、
Sub test2()
Dim myColumn As Range
For Each myColumn In Selection.Columns
'一列に対する処理を記述
Next
End Sub
とすれば良いですが、ご質問の文中のロジックでは、一列に対する処理の方も動かないと思います。
intIX_1 = intIX_1 + 1
では、次の結合セルに移りません。次の行に行くだけです。
intIX_1 = intIX_1 + 当該結合セルの行数(Range(...).MergeArea.Rows.Count)
にしなければいけませんね。
(他にOffset(1,0)で移る方法もあります)
ご参考まで。
ご回答ありがとうございます。For Eachを使ってもやり様があるのですね。勉強になりました。
あと質問文にあるintIX_1 = intIX_1 + 1 は行変更のために使ってたものなのは間違いないですし、これだと選択した他の列に移動できないのも分かってました(なので離れた列にも処理を行うには?と質問を投げました)。それは大丈夫です。ただ「intIX_1 = intIX_1 + 当該結合セルの行数(Range(...).MergeArea.Rows.Count)」の部分はとても勉強になりました。ありがとうございました。
No.4
- 回答日時:
大事な事忘れていました。
よく素人の方だと、バージョンをまったく無視して作る方が多いです。それで、何でできないのかと、よくここで質問されます。
何のバージョンのエクセルを対象にしているか、記載しましょう。もっともちゃんと理解しているなら、最初からバージョンの記載はあるはずですが
また、COMからのアクセスは、そのプラットフォームに依存するので、例えばコレクションや引数の指定などは、できない場合もあります。それはマイクロソフトのMSDNのサイトにテクニカル情報として、どうすればいいいか記載があります。
と言うことは、COMで使用している場合は、呼び出し元も記載しないと、明確にできるとかできないとか言い切れるものではありません。
No3とNo4の回答について、まとめてこっちでお礼をします。回答ありがとうございます。
書き方が悪かったので訂正します。Range("E:E","G:G").SelectをRange("E1:E5","G1:G5").Selectにするのは無理ですよね?と聞いたのは、実際試してみて駄目だったんで書きました。考え方を変えて、最初からE1:E5とG1:G5のセルを選択するようにしてみようと思いましたが、離れた「任意の」列の範囲取得は無理でした。エディターで最初からRange("E1:E5","G1:G5").Selectと書いて処理を行う列を指定しておけば1行目~5行目にだけ処理を施すというのはできましたが、「任意選択した列の1行目~5行目に処理を施す」となると、アドレスの取得方法が無かったので無理でした。探してみたけど駄目でした。
私自身試行錯誤を繰り返しました。試してないと言われるのは心外です。
釣りでもなんでもないんです。本当に詰まってしまったから質問したんです。自分の知識だけでは解決が難しいと判断したから質問したんです。回答者様はただひたすら「調べろ。検証しろ。」とおっしゃっていますが、それはなんのためにおっしゃっているのでしょうか。調べて検証して、結局分からなくて質問をした自分にそれを言われても困ります。なんのために回答をくれているのかわかりません。ごめんなさい。
No.3
- 回答日時:
偶然にもNO2の方と意見がいっちしてようで、びっくりしています。
言っておきますが、No2とNo1は関係ないので、そこんとこよろしく。
>それをRange("E1:E12,G1:G12,I1:I12").Selectに変換するなんて、たぶんできないですよね
それでいいんです。このような発想を、”机上の空論”というのです。実際にやってみましたか?
このようにできるのか、できないのかを実際にやってみて、試行錯誤するのが初心者です。
みんなやっています。そこで、いろんなやり方があるのだと理解が深まるのです。
開発は、まず理論武装します。その次に、それを実践するために、設計します。その設計段階で、理論と合わないところや、やり方ににつまります。それで、実際に、実験をしてみます。
その実験は、検証といって、ただやるのではなく、あらゆる場合も想定して、ケースを作るのです。例えば3つの物の組み合わせは、3X3=9通りが理論ですね。
実証するときは、例えば、トランプを用意して、実際に、組み合わせを並べます。これが実証です。
この事例は簡単な話なのでイメージできないと思いますが、このようにすると見えないものが見えてくるのが実証実験です。何も見えないのなら、才能が無いということで、あきらめてください。
あなたの場合、やりもしないで、ただ子供が口をあけてまっているみたいに、「できないですよね」。
別に質問者ができようと、できまいと、回答者には何の関係もありません。あ、そ。で終わりです。
金をもらっているわけでもないし、責任があるわけでもない。個人的に講習料をいただけるなら別ですが・・・
ちなみに、ちゃんとコードを分析していないですよね???
>たぶんできないですよね。
それはちゃんとマニュアルみましたか? エクセルに付属しているヘルプにリファレンスがあるので、そこを見れば、何が引数になるか、書式がでています。見ていないことがばればれですよね。
さらにいえば、このコードのポイントは、セレクトして、アクティブです。それでアクティブになったセレクションイオブジェクトになるわけです。
GUIソフトはGUI的にといったはずです。
ためさないということは、ただの釣りの質問ですよね。
No.2
- 回答日時:
初心者にとって、大事なことを忘れていませんか。
それはマクロの記録を採って、それでは記録が採れない問題化、使えないか検討し、修正箇所・方法を勉強することです。
ーー
本件はマクロの記録を採ってみると
C列とF列の例で
Sub test01()
Range("C1:C12,F1:F12").Select
With Selection
.MergeCells = False
End With
End Sub
となりました。(一部行を不要として削除してます。)
まずこれ(または一部修正して)を実行して、質問者が検討をして、それではニーズに合わない場合、それを柱にして質問をするぐらいしてほしい。
ーー
範囲全域の結合セルをすべて解除するなら、全セルについて繰り回しをする必要ないのは知っているのかな。
書式はセル範囲の全体に一発で設定できるのだ。
回答ありがとうございます。初心者なのでWith~End Withがあるのを知りませんでした。それからお言葉ですが、散々一人で悩んで試行錯誤して、どうしても駄目だったので質問をしました。検討しまくってこの結果でした。最初からそれをしてないと思われるのは少し残念です。
それから質問にあるように、私は選択したセル全体にではなく、全選択した列の一部のセルにだけ処理を施したいんです(たとえばC列を全選択したら、C1~C12のセルにだけ結合解除を行う等)。回答者様の回答でたとえるなら、Range("C1:C12,F1:F12").Selectの「"C1:C12,F1:F12"」の部分をどう取得したら良いのか分からないです。検索してもどこにも載ってないですし。
No.1
- 回答日時:
Range("E:E,G:G,I:I").Select
Range("I1").Activate
With Selection
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
を改良してつかってください。マクロの記録を使ってだしたものです。
私はこうして自動かしています。もっと早く解決する方法ですね。できなかったときに、何のオブジェクトなんだと考えると、理解が深まります。アクティブな物に対して行うものと、プログラム的に、セル選択、処理だと、あれれれ、というのが多いのがエクセル、ワード、オブジェクトです。
GUIソフトは、GUI的に処理するのが無難です。
回答ありがとうございます。初心者であるため、With~End Withというものがあるのを知りませんでした。ただ、これだとE列・G列・I列のすべてのセルに処理を施してしまいます。私はE列・G列・I列の「一部の」セルにだけ処理を施したいので、回答者様の回答でたとえるなら1行目はRange("E1:E12,G1:G12,I1:I12").Selectとなるように書かなければいけないですよね。
任意の列を全選択した後でそれが可能なのでしょうか?列を全選択したらRange("E:E,G:G,I:I").Selectになりますけど、それをRange("E1:E12,G1:G12,I1:I12").Selectに変換するなんて、たぶんできないですよね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) Sub 分けてソートして貼り付ける() Dim srcSheet As Worksheet Dim 6 2023/08/04 19:57
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
このQ&Aを見た人はこんなQ&Aも見ています
-
今年はじめたいことは?
今年はこれをはじめたい!ということを教えてください!
-
歳とったな〜〜と思ったことは?
歳とったな〜〜〜、老いたな〜〜と思った具体的な瞬間はありますか?
-
もし10億円当たったら何に使いますか?
みなさんの10億円プランが知りたいです!
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
「これいらなくない?」という慣習、教えてください
現代になって省略されてきたとはいえ、必要性のない慣習や風習、ありませんか?
-
cellsで特定の離れた範囲を選択する方法は?
Visual Basic(VBA)
-
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
VBA 選択された離れたセルの値の取得について
Excel(エクセル)
-
-
4
エクセルで複数列の検索をマクロで行いたい
Excel(エクセル)
-
5
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
6
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
7
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
8
VBAで離れたセルの値を一括で代入する方法について
Visual Basic(VBA)
-
9
VBAでの Replace関数で、ワイルドカードは使えないのでしょうか?
Visual Basic(VBA)
-
10
【VBA】2つのシートの値を比較して条件一致したら、同じ行の隣の値を別ブックへ転記したいです。 VB
Visual Basic(VBA)
-
11
もしセルが#N/A"なら~をする・・・には?"
Excel(エクセル)
-
12
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
13
エクセルVBA intersect columnsの複数列のやり方
Visual Basic(VBA)
-
14
読み込みで一行おきに配列に格納
Visual Basic(VBA)
-
15
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
16
エクセル VBA・マクロ コピー 貼り付け 飛び飛び
Excel(エクセル)
-
17
VBAで別のブックにシートをコピーするとセルの色が変わってしまう
Visual Basic(VBA)
-
18
B列の最終行までA列をオートフィル
Visual Basic(VBA)
-
19
vba クリップボードクリアについて教えてください
その他(プログラミング・Web制作)
-
20
EXCEL VBA----離れたセル範囲の指定
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで、あるセルの値に応じて...
-
B列の最終行までA列をオート...
-
URLのリンク切れをマクロを使っ...
-
Cellsのかっこの中はどっちが行...
-
vba 2つの条件が一致したら...
-
Worksheets メソッドは失敗しま...
-
VBAのFind関数で結合セルを検索...
-
IIF関数の使い方
-
【VBA】2つのシートの値を比較...
-
エクセル 2つの表の並べ替え
-
VBA 何かしら文字が入っていたら
-
VBAを使って検索したセルをコピ...
-
オートフィルタをマクロで作成...
-
Changeイベントでの複数セルの...
-
複数csvを横に追加していくマク...
-
VBAで、離れた複数の列に対して...
-
データグリッドビューの一番最...
-
エクセル アクティブセルから...
-
SUM関数の範囲を変数を代入して...
-
VBAで指定範囲内の空白セルを左...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Cellsのかっこの中はどっちが行...
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
vba 2つの条件が一致したら...
-
IIF関数の使い方
-
VBA 何かしら文字が入っていたら
-
VBAのFind関数で結合セルを検索...
-
【VBA】2つのシートの値を比較...
-
文字列の結合を空白行まで実行
-
Changeイベントでの複数セルの...
-
URLのリンク切れをマクロを使っ...
-
VBAで指定範囲内の空白セルを左...
-
【Excel VBA】 B列に特定の文字...
-
VBAを使って検索したセルをコピ...
-
VBAで、特定の文字より後を削除...
-
エクセル 2つの表の並べ替え
-
データグリッドビューの一番最...
-
rowsとcolsの意味
-
VBAでのリスト不一致抽出について
おすすめ情報