dポイントプレゼントキャンペーン実施中!

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重になってたり、全体的に見た目ダラダラというか、もうちょっとマシな表現はないでしょうか?主観的質問ですみません。まったく別な方法でもいいです。

A 回答 (3件)

こんにちは。

お邪魔します。

条件判別の部分だけを切り抜いて、
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 を扱う限りでは、
オブジェクトよりは文字列、文字列よりは数値、を優先する方向で、
判別できるような設計をしていくと、案外スッキリ書けちゃうことも多いのかな、と。

とりあえず、以上です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
私も最初は「変数2個の使い分けマトリクスで判定は4種類、いかに簡単に書くか」だけと思ってましたが、Is Nothingに伴うややこしさはありますね。

お礼日時:2015/02/15 08:56

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

こんな感じで、あまりスッキリとはしていないかな
    • good
    • 0
この回答へのお礼

ありがとうございます。
よく考えたら選択しは3個ってことになりますね。

お礼日時:2015/02/15 08:58

こんばんは。



>もうちょっとマシな表現はないでしょうか
別に正しく動くなら、後のことは気にしないほうがよいです。スタイルにこだわっても、今の所は、自分はこれだけとやっていかないと、前に進まないことが往々にしてあります。

必ず、二つのセルが入らないといけない所に、
 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
'//
    • good
    • 0
この回答へのお礼

ありがとうございます。
uRngを用意して、セル範囲を次々入れていくのですね。

お礼日時:2015/02/15 08:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!