

2個のセル範囲rng1,rng2について、union(rng1, rng2)を用いて1個のセル範囲にまとめようとしてます。少なくとも一方がNothihgの場合にエラーになるので、以下のようにしてます。
Sub Macro()
Dim rng1 As Range
Dim rng2 As Range
Dim rng As Range
set rng1= 'ここで入力
set rng2=
If rng1 Is Nothing Then
If rng2 Is Nothing Then
Set rng = Nothing
Else
Set rng = rng2
End If
Else
If rng2 Is Nothing Then
Set rng = rng1
Else
Set rng = Union(rng1, rng2)
End If
End If
End Sub
IF文を使って分岐させてますが、rng2の条件判断が2重になってたり、全体的に見た目ダラダラというか、もうちょっとマシな表現はないでしょうか?主観的質問ですみません。まったく別な方法でもいいです。
No.2ベストアンサー
- 回答日時:
こんにちは。
お邪魔します。条件判別の部分だけを切り抜いて、
Is Nothing 判定の扱いについてお訊ね、
という解釈で、直接的にお答えします。
何れにしても、
rng に対して何もしない(Set しない)なら、値は Nothing ですから、
そういう前提で3通りを分けるような書き方をすれば
幾らかスッキリするのではないでしょうか。
' Set rng = Nothing ' ←省略するのが普通です。
If rng1 Is Nothing Then
If Not rng2 Is Nothing Then Set rng = rng2
ElseIf rng2 Is Nothing Then
Set rng = rng1
Else
Set rng = Union(rng1, rng2)
End If
直接の回答は以上です。
もしも、Set する以前の文脈で、判別やフラグを立てておくことが可能なら、
Is Nothing 判定は(ややこしいので)使わないで済む場合が多いですよね。
そういう意味では実例がイメージし難い課題のように、私も感じていたりもします。
Excel VBA で Excel を扱う限りでは、
オブジェクトよりは文字列、文字列よりは数値、を優先する方向で、
判別できるような設計をしていくと、案外スッキリ書けちゃうことも多いのかな、と。
とりあえず、以上です。
ありがとうございます。
私も最初は「変数2個の使い分けマトリクスで判定は4種類、いかに簡単に書くか」だけと思ってましたが、Is Nothingに伴うややこしさはありますね。
No.3
- 回答日時:
set rng1= 'ここで入力
set rng2=
多分mg2もここも入力するんですよね
ならば
If rng1 Is Nothing Then
If rng2 Is Nothing Then
↑
これは在り得ないでしょ?
それとも入力しないという選択肢もあるのかな?
rng1,rng2双方が範囲選択されれいる事が前提でUnion(rng1, rng2)を実行するのであれば
If Not rng1 Is Nothing And Not rng2 Is Nothing Then '両方共選択されている場合
Set rng = Union(rng1, rng2)
End If
Exit Sub
If rng1 Is Nothing Then
Set rng = rng1
Else
Set rng = rng2 ’この時点で選択肢はこれしか残らないのでIfで判定する必要なし
End If
End Sub
こんな感じで、あまりスッキリとはしていないかな
No.1
- 回答日時:
こんばんは。
>もうちょっとマシな表現はないでしょうか
別に正しく動くなら、後のことは気にしないほうがよいです。スタイルにこだわっても、今の所は、自分はこれだけとやっていかないと、前に進まないことが往々にしてあります。
必ず、二つのセルが入らないといけない所に、
set rng1= 'ここで入力
set rng2=
マクロが、空だと判断する前に、VBA側がエラーを起こします。
マクロの意味自体がよく分からないですが、以下ならいくつもあっても同じです。
'//
Sub DoubleRanges()
Dim rng(1) As Object 'とりあえず二つ 配列は0からでデフォルト
Dim uRng As Range
Dim i As Long, c As Variant, j As Long
On Error Resume Next
Application.DisplayAlerts = False
For i = 0 To UBound(rng)
Set rng(i) = Application.InputBox("セルを選んでください(" & i + 1 & ")", "RANGE" & i + 1, Type:=8)
If Not rng(i) Is Nothing Then j = j + 1 'オブジェクトの勘定
Next i
If UBound(rng) + 1 = j Then Exit Sub '全部空ならただちに終わる
Application.DisplayAlerts = True
On Error GoTo 0
For Each c In rng
If uRng Is Nothing And Not c Is Nothing Then
Set uRng = c
ElseIf Not c Is Nothing Then
Set uRng = Union(c, uRng)
End If
Next
uRng.Select
End Sub
'//
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VLOOKUP FALSEのこと
-
if関数の複数条件について
-
【マクロ】実行時エラー '424':...
-
同じ名前(重複)かつ 日本 ア...
-
excel
-
【マクロ】数式を入力したい。...
-
Office2021のエクセルで米国株...
-
【画像あり】オートフィルター...
-
エクセルシートの見出しの文字...
-
エクセルの複雑なシフト表から...
-
エクセルのVBAで集計をしたい
-
エクセルでフィルターした値を...
-
【関数】=EXACT(a1,b1) a1とb1...
-
【画像あり】【関数】指定した...
-
勤怠表について ABS、TEXT関数...
-
エクセルの文字数列関数と競馬...
-
表計算ソフトでの様式の呼称
-
【マクロ】【画像あり】4つの...
-
Excelで4択問題を作成したい
-
空白のはずがSUBTOTAL関数でカ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報