[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『差集合 エクセルVBA Application.Intersectと反対の処理』(ハマー)
下記の参考にしてうまく動かなかったので 半年ぶりに質問させていただきます。
下記の似た前投稿が2002年でしたので19年前からの長い間の話題になります。
差集合を考えております。差集合はエクセルの関数でないので
みなさん色々やられているようです。
具体的には セル数81×81=6561 Range("K140:CM220")
の中の任意の(固定の)9ヵ所を取り除いた範囲を指定したいと考えております。
下記のマクロを作成しましたが、コントロールを押しながら任意(固定)の
場所を選択し、9回マクロを動かさないといけないので少し大変です。
これを最初に選択したエリア(Range("K140:CM220"))から
最初に9か所選択して1回のVBAで取り除く
VBAの変更点が分かる方いらっしゃりますでしょうか?
作成したVBAはこちらです。
Sub DelSelectionArea()
Dim myArea As Range, myRng As Range
For i = 1 To selection.Areas.Count
For Each myArea In selection.Areas(i) If Intersect(selection.Areas(selection.Areas.Count), myArea) Is Nothing Then If myRng Is Nothing Then Set myRng = myArea Else Set myRng = Union(myRng, myArea) End If End If Next
Next i
If Not myRng Is Nothing Then myRng.Select MsgBox selection.Areas(1).Address(False, False) & "の" & "非共有範囲は" & _ String(2, vbLf) & myRng.Address(False, False) & "です。" End If
Debug.Print myRng.Address(False, False)
Set myRng = Nothing
'最後にDebug.Printで出力された範囲を UnionでまとめてSelectで確認しております。
Dim target As Range
Set target = Union(Range("K140:CM142"), Range("BB143:CM148"), Range("K143:AU153"), Range("AD154:AU159"), Range("K154:W178"), Range("T179:W184"), Range("K179:M220"), Range("N185:W220"), Range("X160:AU201"), Range("AD202:AU207"), Range("X208:AU220"), Range("AV149:CM152"), Range("BZ153:CM158"), Range("AV153:BS177"), Range("BB178:BS183"), Range("AV184:BS205"), Range("BB206:BS211"), Range("AV212:BS220"), Range("BT159:CM176"), Range("CK177:CM182"), Range("BT177:CD201"), Range("BZ202:CD207"), Range("BT208:CD220"), Range("CE183:CM220"))
target.Select
Set target = Nothing
End Sub
知恵袋も参照しております。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1191798316
これが実現しますと、任意の範囲から指定範囲を取り除いた
範囲を指定できるので、算術処理等非常に楽になります。
よろしくお願いします。
投稿
[[20110202155332]] 『Ctrlキーを使って複数セルの選択時に間違えたら』(けんたろう)
について...
< 使用 Excel:Excel2013、使用 OS:Windows10 >
Sub test()
Dim myArea As Range: Set myArea = ActiveSheet.Range("K140:CM220") Dim rngTarget As Range Dim strAddress As String
If TypeName(Selection) = "Range" Then Set rngTarget = Intersect(myArea, Selection) Else Exit Sub End If
With Worksheets.Add Set myArea = .Range(myArea.Address) myArea.Value = 1 .Range(rngTarget.Address).ClearContents strAddress = myArea.SpecialCells(xlCellTypeConstants).Address Application.DisplayAlerts = False .Delete Application.DisplayAlerts = True End With
Set myArea = ActiveSheet.Range(strAddress)
myArea.Select End Sub (まっつわん) 2021/01/21(木) 18:02
.Range(rngTarget.Address).ClearContents
の所で 実行エラー91が出てしまうようで、それ以上進みません。
rngTarget の値は Nothingと ローカルエリアでは表示されております。
何かわかりましたら、お知らせいただけると助かります。
(ハマー) 2021/01/21(木) 18:35
27エリアくらいならunionでスピード上問題無いと思います。 Sub test2() Dim rr As Range '選択したエリア(Range("K140:CM220")) Dim sel As Range '任意の(固定の)9ヵ所 Dim myRng As Range '除去後 Dim r As Range Set rr = Range("K140:CM220") Set sel = Range("AV143:BA148,BT153:BY158,X154:AC159,CE177:CJ182,AV178:BA183,N179:S184,X202:AC207,BT202:BY207,AV206:BA211") Debug.Print "除去エリア数", sel.Areas.Count ' sel.Select For Each r In rr If Intersect(r, sel) Is Nothing Then If myRng Is Nothing Then Set myRng = r Else Set myRng = Union(r, myRng) End If End If Next myRng.Select Debug.Print "残エリア数", myRng.Areas.Count End Sub
(kazuo) 2021/01/21(木) 18:54
任意の位置で、差集合ができるようにkazuo様のプログラムを改良してみました。
これで、私の要求が満足しました。
皆様のご協力ありがとうございます。
Sub test3()
Dim rr As Range '選択したエリア(Range("K140:CM220")) Dim sel As Range '任意の(固定の)9ヵ所 Dim myRng As Range '除去後 Dim r As Range
If selection.Areas.Count <> 1 Then
Set rr = selection.Areas(1) Set sel = selection.Areas(2)
Else
MsgBox "1つしか選択されていません。2つ以上選択してください。"
Exit Sub
End If
For i = 2 To selection.Areas.Count
Set sel = Union(selection.Areas(i), sel)
Next i
Debug.Print "除去エリア数", sel.Areas.Count
' sel.Select
For Each r In rr If Intersect(r, sel) Is Nothing Then If myRng Is Nothing Then Set myRng = r Else Set myRng = Union(r, myRng) End If End If Next myRng.Select Debug.Print "残エリア数", myRng.Areas.Count End Sub
(ハマー) 2021/01/21(木) 20:14
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.