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.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に変換するなんて、たぶんできないですよね。
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.3
- 回答日時:
偶然にもNO2の方と意見がいっちしてようで、びっくりしています。
言っておきますが、No2とNo1は関係ないので、そこんとこよろしく。
>それをRange("E1:E12,G1:G12,I1:I12").Selectに変換するなんて、たぶんできないですよね
それでいいんです。このような発想を、”机上の空論”というのです。実際にやってみましたか?
このようにできるのか、できないのかを実際にやってみて、試行錯誤するのが初心者です。
みんなやっています。そこで、いろんなやり方があるのだと理解が深まるのです。
開発は、まず理論武装します。その次に、それを実践するために、設計します。その設計段階で、理論と合わないところや、やり方ににつまります。それで、実際に、実験をしてみます。
その実験は、検証といって、ただやるのではなく、あらゆる場合も想定して、ケースを作るのです。例えば3つの物の組み合わせは、3X3=9通りが理論ですね。
実証するときは、例えば、トランプを用意して、実際に、組み合わせを並べます。これが実証です。
この事例は簡単な話なのでイメージできないと思いますが、このようにすると見えないものが見えてくるのが実証実験です。何も見えないのなら、才能が無いということで、あきらめてください。
あなたの場合、やりもしないで、ただ子供が口をあけてまっているみたいに、「できないですよね」。
別に質問者ができようと、できまいと、回答者には何の関係もありません。あ、そ。で終わりです。
金をもらっているわけでもないし、責任があるわけでもない。個人的に講習料をいただけるなら別ですが・・・
ちなみに、ちゃんとコードを分析していないですよね???
>たぶんできないですよね。
それはちゃんとマニュアルみましたか? エクセルに付属しているヘルプにリファレンスがあるので、そこを見れば、何が引数になるか、書式がでています。見ていないことがばればれですよね。
さらにいえば、このコードのポイントは、セレクトして、アクティブです。それでアクティブになったセレクションイオブジェクトになるわけです。
GUIソフトはGUI的にといったはずです。
ためさないということは、ただの釣りの質問ですよね。
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.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)」の部分はとても勉強になりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
準・究極の選択
「年収1000万円で一生カレーライス」か 「年収180万円で毎日何でも食べ放題」 あなたはどちらを選びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
cellsで特定の離れた範囲を選択する方法は?
Visual Basic(VBA)
-
ExcelVBAで質問です。離れた二次元配列を一つにしたい
Visual Basic(VBA)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
-
4
【EXCEL】【VBA】空欄は飛ばして処理する方法を教えて下さい。
Excel(エクセル)
-
5
エクセルVBAで、条件に一致するセルへ移動
Excel(エクセル)
-
6
VBA 選択された離れたセルの値の取得について
Excel(エクセル)
-
7
エクセルV.BAで列の離れた範囲を選択する方法
Visual Basic(VBA)
-
8
文字列の結合を空白行まで実行
Visual Basic(VBA)
-
9
エクセルVBA 作業後に選択範囲を解除する方法
Excel(エクセル)
-
10
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
11
エクセルで複数列の検索をマクロで行いたい
Excel(エクセル)
-
12
Excel VBAでn行毎に行の選択
Excel(エクセル)
-
13
マクロについて 複数セルの値を別シートの任意のセルにコピー貼り付けしたい
Excel(エクセル)
-
14
VBAで離れたセルの値を一括で代入する方法について
Visual Basic(VBA)
-
15
特定の複数のシートに同じ処理をさせたい
Excel(エクセル)
-
16
VBAでのリスト不一致抽出について
Visual Basic(VBA)
-
17
EXCEL VBA Dictionaryで複数の値を格納→離れた位置に出力する方法
Excel(エクセル)
-
18
VBA Cのセルが空白でなかったら、Aのセルに順番に数値を入力
Visual Basic(VBA)
-
19
excel VBA 2つのシートの特定の列を比較して同じ値のセルがあったらその行を上書きしたい
Excel(エクセル)
-
20
VBAで色の付いているセルの行削除
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Excelで、あるセルの値に応じて...
-
重複データの合算(VBA)
-
IIF関数の使い方
-
【Excel VBA】 B列に特定の文字...
-
URLのリンク切れをマクロを使っ...
-
vba 重複データ合算
-
【VBA】複数行あるカンマ区切り...
-
リストビューのコンボボックス
-
vba 2つの条件が一致したら...
-
rowsとcolsの意味
-
VBAの構文 3列置きにコピーし...
-
VBAで文字列を結合
-
エクセルVBAにて =A1=B1とすれ...
-
セルの結合
-
VBScriptでfindを使うには??
-
VBAを用いて条件付きの平均値、...
-
VBA 値と一致した行の一部の列...
-
エクセルVBA intersect colu...
-
Cellsのかっこの中はどっちが行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
B列の最終行までA列をオート...
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
URLのリンク切れをマクロを使っ...
-
文字列の結合を空白行まで実行
-
データグリッドビューの一番最...
-
【VBA】2つのシートの値を比較...
-
VBA 何かしら文字が入っていたら
-
IIF関数の使い方
-
VBAを使って検索したセルをコピ...
-
Changeイベントでの複数セルの...
-
VBAの構文 3列置きにコピーし...
-
VBAのFind関数で結合セルを検索...
-
【Excel VBA】 B列に特定の文字...
-
VBAで指定範囲内の空白セルを左...
-
VBAでのリスト不一致抽出について
-
セルに値が入っていた時の処理
-
VBAコンボボックスで選択した値...
おすすめ情報