質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

596閲覧

ExcelVBAで複数領域の選択

deigo

総合スコア200

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/07/22 06:38

ExcelVBAでマクロを作っています。
長方形の範囲を指定した際、その選択範囲を横一列毎の複数選択範囲に分割する必要がありますが、
方法がわかりません。

小さい範囲なら

Range("A1:C1,A2:C2,A3:C3").Select

で実現できますが
範囲が大きくなると255文字の制限に引っかかってエラーになります。
また

Uniom(Range("A1:C1,A2:C2,A3:C3"),...).Select

とした場合は文字数制限は解決しますが、選択範囲が結合してしまいます。

どうすれば実現できるでしょうか。
ご教示願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Unionはセル範囲の集合なので、隣接する範囲だと合体してしまうんですよね。
Range.AreasコレクションにAddでもできればよさそうなのですが、こちらはReadOnlyとのことで、なかなか痒いところに手が届かないようです。

今回の対応として思いつくのは2つ。

案①:Stringに収まる範囲で複数回の処理にわける。
⇒たとえば100行処理したい場合、10行ずつ10回処理する。

案②:連続しない範囲となるようUnionを分けて処理する。
⇒たとえば偶数行・奇数行で処理を分ける。

「Ctrl+範囲選択」でできる選択範囲の追加をVBAで実現できればもっとスマートになるのですが、この操作をマクロ記録してもトンチンカンなコードしか生成してくれないようで、現状こんなダサい回避策しか思い当りません。
もっとエレガントな回避策をご存じの方がいれば、自分も参考にさせていただきたいです(T-T)

投稿2017/07/24 04:48

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

根本的な解決にはなりませんが、Rangeの文字数制限を緩和するアドバイスです。

Rangeはセルに定義した名前でも範囲を指定することができます。
つまり選択範囲に1~2文字程度の簡潔な名前を定義してやればRangeの文字数を省略することができます。

VBA

1Range("A1:C1").Name = "X" 2Range("X").Select

Rangeの文字数省略を踏まえたコードを書いてみました。
何かしらの参考になりましたら幸いです。

※行単位・列単位で選択するとエラーになります。
※この方法ではせいぜい70行程度までしか処理できません。

VBA

1Option Explicit 2 3Private Sub Worksheet_SelectionChange(ByVal Target As Range) 4 5 '変数定義 6 Dim Source As String '選択範囲 7 Dim BgnRow As Long '選択開始行 8 Dim EndRow As Long '選択終了行 9 Dim BgnCol As Long '選択開始列 10 Dim EndCol As Long '選択終了列 11 Dim i As Long 'ループカウンタ 12 Dim DivRange As String 13 14On Error GoTo Exception 15 16 'イベント停止 17 Application.EnableEvents = False 18 19 '選択範囲をアドレスで取得 20 Source = Target.Address(False, False) 21 22 '選択範囲が連続したセル(長方形)か判定 23 If InStr(Source, ":") > 0 Then 24 25 '選択開始行と選択終了行を取得 26 BgnRow = Range(Split(Source, ":")(0)).Row 27 EndRow = Range(Split(Source, ":")(1)).Row 28 29 '選択開始列と選択終了列を取得 30 BgnCol = Range(Split(Source, ":")(0)).Column 31 EndCol = Range(Split(Source, ":")(1)).Column 32 33 '横一列毎に簡潔な名前を設定する 34 For i = BgnRow To EndRow 35 Range(Cells(i, BgnCol), Cells(i, EndCol)).Name = "_" & i 36 Next 37 38 'セルに設定した名前をカンマで結合する 39 For i = BgnRow To EndRow 40 DivRange = DivRange + "_" & i & "," 41 Next 42 43 '最後のカンマを除外 44 DivRange = Mid(DivRange, 1, Len(DivRange) - 1) 45 46 '横一列毎に選択 47 Range(DivRange).Select 48 49 'セルに設定した名前を全て削除する 50 For i = BgnRow To EndRow 51 Range(Cells(i, BgnCol), Cells(i, EndCol)).Name.Delete 52 Next 53 54 End If 55 56Exception: 57 58 'エラー内容を出力 59 If Err.Number <> 0 Then 60 MsgBox Err.Description 61 End If 62 63 'イベント再開 64 Application.EnableEvents = True 65 66End Sub 67

投稿2017/07/22 09:53

N-u-u

総合スコア113

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

deigo

2017/07/22 10:16

ありがとうございます。 一時的に名前をつけるんですね。目から鱗です。 ほかに実現方法がない場合はこの方法で検討しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問