|
▼かみちゃん さん:
>こんにちは。かみちゃん です。
>
>>>>VBAの大先輩の皆さん
>>>
>>>まず、はじめにこういうことを書かれると、コメントが書きにくくなります。
>>>ここの掲示板では、先輩や後輩など上下関係はないと思います。
>>>私を含めて、多くの方は、みんな勉強するためにコメントを書いていると思いますので・・・
>>また気分を害するようなことを書きましてすみません。
>
>別に気分を害したとかでは全然なく、むしろ、そういうこと書かれると「大先輩ではない」人が書きにくくなって、もらえるコメントももらいづらくなりますよという意味でした。
>まぁ、私も、変なところに拘らなくてもいいわけですし、藁をもつかみたい気持ちは、よ〜くわかっているつもりですので。
敬意を表する意味合いで書いているのですが。
あまり気になさらないでください。
>>>>sheet5に"商品マスター"を作成し、sheet3の"内訳明細"の
>>>>A列とB列の2つの条件が一致したら
>>>>C列とE列に呼称・単価を記入したい
>>>
>>>Findメソッドを使います。
>>>まず、A列に一致するセル位置を検索し、一致したらB列と一致しているかチェックし、
>>>一致していたら、そこで検索終了し、
>>>一致していなかったら、次のセル位置を検索する
>>>という考え方になります。
>>>詳しくは、Findメソッドのヘルプの使用例にコードが載っていますので、
>>>確認してみてください。
>>イメージだけですが↓こんな感じ?・・・・・
>
>内訳明細シートが複数あるのですか?
>初めて聞いたような気がします。
いえいえ内訳明細は1シートのみです。
そんな書込ありましたか?
>B列に入力があれば、単価の検索ができるように修正してみました。
>[#41501]および[#41634]で解決したコードに加えてみると、以下のような感じになります。
>動作確認していただけるよう全体のコードを再度提示させていただきます。
>現在、お手元のコードと異なるところがあれば、ご指摘ください。
>
>Private Sub Worksheet_Change(ByVal Target As Range)
> Dim hinmei As String, keijyou As String
> Dim myRange As Range
> Dim endRow As Long
> Dim a As Variant
> Dim i As Variant
>
> Dim c As Range '★
> Dim FirstAddress As String '★
> Dim rngFind As Range '★
> Dim blnDataSet As Boolean '★
>
> With Target
>' On Error GoTo errEnd
> If .Column <= 1 Or .Column >= 4 Or _
> .Row = 1 Then End
>
> Select Case .Column
>' Case 1
>' If .Offset(, 1).Value = "" Then Exit Sub
>' hinmei = .Value
>' keijyou = .Offset(, 1).Value
>' GoTo kakuninEvent
> Case 2
> If .Offset(, -1).Value = "" Then Exit Sub
> hinmei = .Offset(, -1).Value
> keijyou = .Value
> GoTo kakuninEvent
> Case 3
> If .Value = "式" Then
> Application.EnableEvents = False
> .Offset(, 1).Value = 1
> .Offset(0, 2).Select
> Application.EnableEvents = True
> End If
> End Select
>
> Exit Sub
>
>kakuninEvent:
> Set myRange = Range("A2", Cells(Cells.Rows.Count, 1).End(xlUp).Offset(-1)).Resize(, 5)
> a = myRange.Value
> Application.EnableEvents = False
> Range("C" & .Row).ClearContents
> Range("E" & .Row).ClearContents
> Application.EnableEvents = True
> For i = 1 To myRange.Rows.Count
> If hinmei = a(i, 1) And keijyou = a(i, 2) Then
> Application.EnableEvents = False
> Range("C" & .Row).Value = a(i, 3)
> Range("E" & .Row).Value = a(i, 5)
> Application.EnableEvents = True
> Exit For
> End If
> Next i
> '単価を検索し設定 '★
> Set rngFind = Sheets("Sheet2").Range("A1", Sheets("Sheet2").Range("A65536").End(xlUp))
> Set c = rngFind.Find(Target.Offset(, -1).Value, LookIn:=xlValues, LookAt:=xlWhole)
> blnDataSet = False
> If Not c Is Nothing Then
> FirstAddress = c.Address
> Do
> If .Value = c.Offset(, 1).Value Then
> blnDataSet = True
> Application.EnableEvents = False
> Select Case Range("L1").Value
> Case "一般"
> .Offset(, 3).Value = c.Offset(, 3).Value
> Case "同業"
> .Offset(, 3).Value = c.Offset(, 4).Value
> Case "特別"
> .Offset(, 3).Value = c.Offset(, 5).Value
> Case Else
> MsgBox "単価種別が違います [" & Range("L1").Value & "]"
> End Select
> Application.EnableEvents = True
> Exit Do
> End If
> Set c = rngFind.FindNext(c)
> Loop While Not c Is Nothing And c.Address <> FirstAddress
> End If
> If Not blnDataSet Then
> MsgBox "単価が見つかりません"
> End If
> '----ここまで単価検索 '★
>
> 'C列に値が入ったかどうかのチェック
> With Cells(Target.Row, 3)
> If .Value <> "" Then
> .Offset(, 1).Activate
> Else
> .Activate
> End If
> End With
> End With
>'errEnd:
>
>End Sub
コード動作確認の結果をお伝えいたします。
まず
> Set rngFind = Sheets("Sheet2").Range("A1", Sheets("Sheet2").Range("A65536").End(xlUp))
ここで実行時エラー9でインデックスが有効範囲にありませんと出ました。
これについてはsheet2の部分を"商品マスター"に変更し解決しました。
次に"L1"に"一般"と書込帳票作成実施・結果はE列の単価のみ表示されます
sheet5の商品マスターD列の値です。
(C列は表示されずです呼称の部分です)
相談ですが機能的に前の仕様が原因で問題(C列に入らない)だとすれば
機能を残していただきたいのは単純に"式"と入れたらセル1つ飛びと
一番最後のコードの部分↓ココだけでよいのです
'C列に値が入ったかどうかのチェック
With Cells(Target.Row, 3)
If .Value <> "" Then
.Offset(, 1).Activate
Else
.Activate
End If
End With
End With
★これだけが機能として残したいだけです。
追記:やはり前の仕様が原因ではないかと思う動作をします。
一度入力済みのA,B列記入したものは"m"or"個"など表示されます
A,B列が新規入力の場合C列"m"等入力されません。
呼称についてもsheet5商品マスターから引っ張ってくる方がよいかと
思いますので、いかがでしょうか。
>>>>1.最初にinputboxで単価設定(1.一般チャンネル・2.同業チャンネル・
>>>> 3.特別チャンネル)を実行したい。
>>>
>>>ちょっとわからないのですが、
>>>InputBoxで
>>>"1"を入力したら、一般チャンネルということで「単価一般」の単価を、
>>>Sheet5のD列から取得する
>>>"2"を入力したら、同業チャンネルということで「同業単価」の単価を、
>>>Sheet5のE列から取得する
>>>"3"を入力したら、特別チャンネルということで「特別価格」の単価を、
>>>Sheet5のF列から取得する
>>>ということでしょうか?
>
>今回は、InputBoxや、UserFormを使わずに、
>L1セルに「一般」「同業」「特別」という文字列を入力しておくことによって分岐するようにしてあります。
>これで動作確認ができれば、
>InputBoxや、UserFormの条件でL1セルを書き換えることだけを考えればいいことになります。
上記説明は了解しました動作確認が先ですね。(-_-;)
|
|