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も見ています
-
餃子を食べるとき、何をつけますか?
みんな大好き餃子。 ふと素朴な疑問ですが、餃子には何をつけて食べますか? 王道は醤油とお酢でしょうか。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
土曜の昼、学校帰りの昼メシの思い出
週休2日が当たり前の今では懐かしい思い出ですが、昔は土曜日も午前中まで学校や会社がある「半ドン」で、いつもよりちょっと早く家に帰って食べる昼ご飯が、なんだかちょっと特別に感じたものです。
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
cellsで特定の離れた範囲を選択する方法は?
Visual Basic(VBA)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
VBA 選択された離れたセルの値の取得について
Excel(エクセル)
-
-
4
【EXCEL】【VBA】空欄は飛ばして処理する方法を教えて下さい。
Excel(エクセル)
-
5
エクセルV.BAで列の離れた範囲を選択する方法
Visual Basic(VBA)
-
6
文字列の結合を空白行まで実行
Visual Basic(VBA)
-
7
ExcelVBAで質問です。離れた二次元配列を一つにしたい
Visual Basic(VBA)
-
8
特定の複数のシートに同じ処理をさせたい
Excel(エクセル)
-
9
Excel VBA 同じ処理を複数回行うとき、コードをできるだけ短くするには?
Visual Basic(VBA)
-
10
エクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?
Excel(エクセル)
-
11
EXCEL VBA で指定した範囲に入力があるかどうか?
Visual Basic(VBA)
-
12
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
13
エクセルVBAで、条件に一致するセルへ移動
Excel(エクセル)
-
14
「アイテムは収集されました」と表示させない方法
Excel(エクセル)
-
15
VBAで文字列を数値に変換したい
Excel(エクセル)
-
16
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
17
Excel VBAでn行毎に行の選択
Excel(エクセル)
-
18
VBAでのリスト不一致抽出について
Visual Basic(VBA)
-
19
マクロについて 複数セルの値を別シートの任意のセルにコピー貼り付けしたい
Excel(エクセル)
-
20
エクセルVBA intersect columnsの複数列のやり方
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
B列の最終行までA列をオート...
-
文字列の結合を空白行まで実行
-
IIF関数の使い方
-
ExcelVBAでテキストルーレット...
-
rowsとcolsの意味
-
Cellsのかっこの中はどっちが行...
-
VBAを使って検索したセルをコピ...
-
vba 2つの条件が一致したら...
-
データグリッドビューの一番最...
-
エクセルVBA intersect colu...
-
VBAで、離れた複数の列に対して...
-
VBAのFind関数で結合セルを検索...
-
【VBA】複数行あるカンマ区切り...
-
【Excel VBA】ReadCSVのOutputC...
-
【VBA】2つのシートの値を比較...
-
マクロ 最終列をコピーして最終...
-
Changeイベントでの複数セルの...
-
【補足欄が足りなかったため、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
Cellsのかっこの中はどっちが行...
-
URLのリンク切れをマクロを使っ...
-
vba 2つの条件が一致したら...
-
IIF関数の使い方
-
【Excel VBA】 B列に特定の文字...
-
VBAを使って検索したセルをコピ...
-
rowsとcolsの意味
-
文字列の結合を空白行まで実行
-
VBAのFind関数で結合セルを検索...
-
【VBA】2つのシートの値を比較...
-
VBAコンボボックスで選択した値...
-
データグリッドビューの一番最...
-
セルに値が入っていた時の処理
-
Changeイベントでの複数セルの...
-
VBAで、特定の文字より後を削除...
-
VBAで指定範囲内の空白セルを左...
-
マクロ 最終列をコピーして最終...
おすすめ情報