Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7981 / 13644 ツリー ←次へ | 前へ→

【35695】複数条件に当てはまる時に値を返す 青たん 06/3/10(金) 15:15 質問[未読]
【35697】Re:複数条件に当てはまる時に値を返す 青たん 06/3/10(金) 15:27 質問[未読]
【35702】Re:複数条件に当てはまる時に値を返す Kein 06/3/10(金) 16:20 回答[未読]
【35706】Re:複数条件に当てはまる時に値を返す 青たん 06/3/10(金) 17:48 質問[未読]
【35715】Re:複数条件に当てはまる時に値を返す Kein 06/3/10(金) 20:36 回答[未読]
【35728】Re:複数条件に当てはまる時に値を返す 青たん 06/3/11(土) 10:41 お礼[未読]
【35731】再びすみません。 青たん 06/3/11(土) 12:20 質問[未読]
【35732】Re:再びすみません。 Kein 06/3/11(土) 15:13 回答[未読]
【35736】Re:再びすみません。 青たん 06/3/11(土) 16:27 お礼[未読]

【35695】複数条件に当てはまる時に値を返す
質問  青たん  - 06/3/10(金) 15:15 -

引用なし
パスワード
   はじめまして。
VBA関係のホームページを色々見て周り、複数条件に当てはまる時、セルの色を変えたりするのはありましたが、
複数条件に当てはまる時、計算して値を返すというのがどこにもなかったので、教えていただけますでしょうか?

下記の文章のカッコは見やすくした為で、実際は全てカッコは要りません。

仮に、
A1にリストボックスで、(ピーマン)(ナス)があり、B2にのリストボックスに
(空白)(福岡)(静岡)があるとして、C1には金額をランダムに入力できるような
シートがあるとして、

仮に、ピーマンを5と考え、空白を12と考えたとき、

A1で(ピーマン)を選択、B2で(空白)を選択した時に、C3のセルに、C1×(5÷12)というような計算をして、値を求めたいのです。

同様に、
ナスを8とし、静岡を6と考えたとき、

A1で(ナス)B2で(静岡)を洗濯した場合はC3のセルに、C1×(8÷6)という計算をして値をセルに返したいのです。

なかなか説明がわかりにくいと思いますが、よろしくお願いいたします。
ポイントは、複数のセルで、そのセルごとの特定の文字列にHITした時、計算式を変えて値を返すということです。

言葉で言うと、
もしA1がピーマンで、B2が空白の場合はC3のセルにC1×5÷12という計算をして値を返す。
もしA1がピーマンで、B2が静岡の場合はC3のセルにC1×5÷6という・・・
というような感じです。
それではよろしくお願いいたします。

【35697】Re:複数条件に当てはまる時に値を返す
質問  青たん  - 06/3/10(金) 15:27 -

引用なし
パスワード
   すみません。補足です。
必ずしも、ピーマンが5ではなく、ピーマンと空白、ピーマンと静岡を選んだ場合のみ、ピーマンを5と考え、ピーマンと福岡を選んだ場合はピーマンを15と考えて、C1×15÷・・・・というような計算式にしたいのです。

【35702】Re:複数条件に当てはまる時に値を返す
回答  Kein  - 06/3/10(金) 16:20 -

引用なし
パスワード
   リストボックス というのは、入力規則を設定したときのものでしょーか ?
つまり、フォームツールバーやコントロールツールボックスのものでは無い、ということ
なら、セルの入力イベントで処理するのが適当ですね。その場合、A1とB1の値の
組み合わせ全てを、Select Case ステートメントをネストする形で書き出し、それに
対応する数値を変数に入れる必要があります。だから組み合わせが多くなると、比例して
コーディングも手間ひまかかると思って下さい。具体的には、概ね・・

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim x As Long, y As Long, z As Long

  If Intersect(Target, Range("A1:B1")) Is _
  Nothing Then Exit Sub
  x = Range("C1").Value
  With Target
   If .Count > 1 Then Exit Sub
   If .Address = "$A$1" Then
     Select Case .Value
      Case "ピーマン"
        Select Case .Offset(, 1).Value
          Case "静岡": y = 5: z = 2
          Case "福岡": y = 15: z = 4
          以下、同様にCase節を記述
        End Select
      Case "にんじん"
        Select Case .Offset(, 1).Value

     End Select
   ElseIf .Address = "$B$1" Then
     Select Case .Value
      Case "東京"
        Select Case .Offset(, -1).Value
          Case "きゃべつ": y = 5: z = 2
          Case "かぼちゃ": y = 15: z = 4
          以下、同様にCase節を記述
        End Select
      Case "大阪"

     End Select
   End If
  End With
  With Application
   .EnableEvents = False
   Range("C3").Value = x * (y / z)
   .EnableEvents = True
  End With
End Sub  

というようなコードになるでしょう。

【35706】Re:複数条件に当てはまる時に値を返す
質問  青たん  - 06/3/10(金) 17:48 -

引用なし
パスワード
   ▼Kein さん:
早々のご回答ありがとうございます。
試してみたのですが、コンパイルエラーになり、
Elseに対応するIFがありません。と出ました;;
少し少なくして下記で作ってみたのですが、、、
後、条件を満たすセルを3つ作るとすると、どのような記述になるのでしょうか?
仮にA2に、みかんとりんごがあるという過程でお願いします。
お手数かけますがご回答のほどよろしくお願いします。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim x As Long, y As Long, z As Long

  If Intersect(Target, Range("A1:B1")) Is _
  Nothing Then Exit Sub
  x = Range("C1").Value
  With Target
   If .Count > 1 Then Exit Sub
   If .Address = "$A$1" Then
     Select Case .Value
      Case "ピーマン"
        Select Case .Offset(, 1).Value
          Case "静岡": y = 5: z = 2
          Case "東京": y = 5: z = 2
                  End Select
        Select Case .Offset(, 1).Value
       Case "きゃべつ"
       Case "静岡": y = 5: z = 2
      Case "東京": y = 5: z = 2
      End Select
   ElseIf .Address = "$B$1" Then
     Select Case .Value
      Case "東京"
        Select Case .Offset(, -1).Value
          Case "きゃべつ": y = 5: z = 2
          Case "ピーマン": y = 5: z = 2
                  End Select
        Select Case .Offset(, -1).Value
       Case "静岡"
       Case "きゃべつ": y = 5: z = 2
      Case "ピーマン": y = 5: z = 2
      End Select
   End If
  End With
  With Application
   .EnableEvents = False
   Range("C3").Value = x * (y / z)
   .EnableEvents = True
  End With
End Sub

【35715】Re:複数条件に当てはまる時に値を返す
回答  Kein  - 06/3/10(金) 20:36 -

引用なし
パスワード
   >条件を満たすセルを3つ作る
例えば A1:A3 に入力された値で・・ということなら、先のやり方では条件分岐の
ネストが深くなりすぎて、極端に可読性が悪くなってしまいますから「A1,A2,A3の
値を & で連結したときの全パターン」によって、一回の Select Case で対応できる
ように改造します。その場合先の y / z の結果は、予め算出済みの定数としてしまい、
コードではそれに C1 の値をかけるだけとします。
即ち

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim x As Long, y As Long
  Dim St As String

  If Intersect(Target, Range("A1:A3")) Is _
  Nothing Then Exit Sub
  If Target.Count > 1 Then Exit Sub
  x = Range("C1").Value
  St = Range("A1").Text & Range("A2").Text & _
  Range("A3").Text
  Select Case St
   Case "ピーマン東京3月10日": y = x * ? '?は定数

   以下、全てのパターンを書き出す
  End Select
  With Application
   .EnableEvents = False
   Range("C3").Value = y
   .EnableEvents = True
  End With
End Sub

というようなコードになりますが、他のやり方は分かりません。

【35728】Re:複数条件に当てはまる時に値を返す
お礼  青たん  - 06/3/11(土) 10:41 -

引用なし
パスワード
   ▼Kein さん:
ありがとうございます。
自分がイメージしてたものが出来ました。
本当に助かりました。
また、ご縁がありましたらよろしくお願いいたします。

【35731】再びすみません。
質問  青たん  - 06/3/11(土) 12:20 -

引用なし
パスワード
   C3だけでなく、他のセルでも結果が出せるように増やしてみましたが、動作がうまくいきませんでした。ちなみにリストボックスの内容はA1とB1が一緒でA2とB2が一緒でA3とB3が一緒です。C4を使って下記のように記述したのですが、エラーにはなりませんが、動作させると、C3と、C4の両方に同時に答えが出てきたりしておかしいです。
どうしてでしょうか?

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim x As Long, y As Long
  Dim St As String

  If Intersect(Target, Range("A1:A3")) Is _
  Nothing Then Exit Sub
  If Target.Count > 1 Then Exit Sub
  x = Range("C1").Value
  St = Range("A1").Text & Range("A2").Text & _
  Range("A3").Text
  Select Case St
   Case "ピーマン東京3月10日": y = x * ? '?は定数

   以下、全てのパターンを書き出す
  End Select
  With Application
   .EnableEvents = False
   Range("C3").Value = y
   .EnableEvents = True
  End With
If Intersect(Target, Range("B1:B3")) Is _
  Nothing Then Exit Sub
  If Target.Count > 1 Then Exit Sub
  x = Range("C1").Value
  St = Range("B1").Text & Range("B2").Text & _
  Range("B3").Text
  Select Case St
   Case "ピーマン東京3月10日": y = x * ? '?は定数

   以下、全てのパターンを書き出す
  End Select
  With Application
   .EnableEvents = False
   Range("C4").Value = y
   .EnableEvents = True
  End WithEnd Sub

【35732】Re:再びすみません。
回答  Kein  - 06/3/11(土) 15:13 -

引用なし
パスワード
   何をどうしたいのか、ますます分からなくなってますが、コードの意味は理解して
いるのでしょーか ? 知らない語句があったらそこへカーソルを当てて、F1キーを
押してヘルプを出して調べる、という基本的な解析をしていれば、最初のIntersectで
"A1:A3以外のセルが変化しても中止される"ということが分かるはずだから、
>If Intersect(Target, Range("B1:B3")) Is Nothing Then Exit Sub
などというコードを途中に入れても、意味がないことも分かるはずです。
とにかく、提示されたコードをよく理解することが第一歩です。それが出来ないうちは
改造などできるはずがありません。自分で改造する自信がないなら、初めから希望する
処理内容を、正確かつ具体的に説明するような質問にするべきです。
よって今回で最後のレスとします。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim x As Long, y As Long
  Dim St As String
  Dim RetR As Range

  If Intersect(Target, Range("A1:B3")) Is _
  Nothing Then Exit Sub
  If Target.Count > 1 Then Exit Sub
  x = Range("C1").Value
  If Target.Column = 1 Then
   St = Range("A1").Text & Range("A2").Text & _
   Range("A3").Text
  Else
   St = Range("B1").Text & Range("B2").Text & _
   Range("B3").Text
  End If
  Select Case St
   Case "ピーマン東京3月10日": y = x * ? '?は定数

   以下、全てのパターンを書き出す
  End Select
  Select Case Target.Row
   Case 1: Set RetR = Range("C3")
   Case 2: Set RetR = Range("C4")
   Case 3: Set RetR = Range("C5")
  End Select
  With Application
   .EnableEvents = False
   RetR.Value = y
   .EnableEvents = True
  End With
  Set RetR = Nothing
End Sub

【35736】Re:再びすみません。
お礼  青たん  - 06/3/11(土) 16:27 -

引用なし
パスワード
   ▼Kein さん:
この度はありがとうございました。
もう少し勉強してまた来ようと思います。

7981 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free