ExcelVBAでマクロを作っています。
長方形の範囲を指定した際、その選択範囲を横一列毎の複数選択範囲に分割する必要がありますが、
方法がわかりません。
小さい範囲なら
Range("A1:C1,A2:C2,A3:C3").Select
で実現できますが
範囲が大きくなると255文字の制限に引っかかってエラーになります。
また
Uniom(Range("A1:C1,A2:C2,A3:C3"),...).Select
とした場合は文字数制限は解決しますが、選択範囲が結合してしまいます。
どうすれば実現できるでしょうか。
ご教示願います。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
Unionはセル範囲の集合なので、隣接する範囲だと合体してしまうんですよね。
Range.AreasコレクションにAddでもできればよさそうなのですが、こちらはReadOnlyとのことで、なかなか痒いところに手が届かないようです。
今回の対応として思いつくのは2つ。
案①:Stringに収まる範囲で複数回の処理にわける。
⇒たとえば100行処理したい場合、10行ずつ10回処理する。
案②:連続しない範囲となるようUnionを分けて処理する。
⇒たとえば偶数行・奇数行で処理を分ける。
「Ctrl+範囲選択」でできる選択範囲の追加をVBAで実現できればもっとスマートになるのですが、この操作をマクロ記録してもトンチンカンなコードしか生成してくれないようで、現状こんなダサい回避策しか思い当りません。
もっとエレガントな回避策をご存じの方がいれば、自分も参考にさせていただきたいです(T-T)
投稿2017/07/24 04:48
総合スコア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
総合スコア113
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。