Excel VBA質問箱 IV

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

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


741 / 13645 ツリー ←次へ | 前へ→

【78592】VLOOKUPを使いたい もよもと 16/11/23(水) 22:00 質問[未読]
【78593】Re:VLOOKUPを使いたい γ 16/11/23(水) 22:06 発言[未読]
【78594】Re:VLOOKUPを使いたい もよもと 16/11/24(木) 5:57 発言[未読]
【78595】Re:VLOOKUPを使いたい γ 16/11/24(木) 7:17 発言[未読]
【78596】Re:VLOOKUPを使いたい もよもと 16/11/24(木) 7:35 お礼[未読]
【78597】Re:VLOOKUPを使いたい β 16/11/24(木) 10:43 発言[未読]
【78598】Re:VLOOKUPを使いたい もよもと 16/11/24(木) 12:33 発言[未読]
【78599】Re:VLOOKUPを使いたい 16/11/24(木) 13:54 発言[未読]
【78600】Re:VLOOKUPを使いたい もよもと 16/11/24(木) 15:05 お礼[未読]
【78604】Re:VLOOKUPを使いたい もよもと 16/11/28(月) 0:57 質問[未読]
【78605】Re:VLOOKUPを使いたい γ 16/11/28(月) 7:35 発言[未読]
【78607】Re:VLOOKUPを使いたい もよもと 16/11/28(月) 10:10 お礼[未読]
【78608】Re:VLOOKUPを使いたい β 16/11/28(月) 12:51 発言[未読]
【78609】Re:VLOOKUPを使いたい もよもと 16/11/28(月) 15:29 お礼[未読]

【78592】VLOOKUPを使いたい
質問  もよもと  - 16/11/23(水) 22:00 -

引用なし
パスワード
   Sheet1とSheet2があり、Sheet1のB1に入れた値
とSheet2のB1:B10にある値の中から一致した行と
C列〜E列の各交差するセル値をSheet1のC1:E1に各々入れたいです。
一致する値がない場合は、「該当なし」と表示したいです。

Sheet1のB2以降も上記と同様です。

よろしくお願いします。

【78593】Re:VLOOKUPを使いたい
発言  γ  - 16/11/23(水) 22:06 -

引用なし
パスワード
   ここはVBA(マクロ)の質問板なのですが、
それを承知で、マクロで実現したいということですか?
VLOOKUP式を普通にシートに書くのでは、なにかまずいことがあるのですか?

【78594】Re:VLOOKUPを使いたい
発言  もよもと  - 16/11/24(木) 5:57 -

引用なし
パスワード
   はい、VBAでやりたいです。
B列に必ず値を入れるわけではなく、
入れないで他の列に手動で入れる場合も
あり、予め全てのセルに関数を入れるのは
手間が掛かるからです。

【78595】Re:VLOOKUPを使いたい
発言  γ  - 16/11/24(木) 7:17 -

引用なし
パスワード
   ▼もよもと さん:
>予め全てのセルに関数を入れるのは
>手間が掛かるからです。
=IF(B1="","",IFERROR(VLOOKUP(・・・・),"該当なし"))
などとしておけば、一括してコピーペイストが可能。
手動入力の場合は式に上書きする、
ということでよいと思いますが、いかがですか?

どうしてもVBAということなら、具体的に詰まっている点はどこですか?

ワークシート関数をVBA内で使用する方法ですか?
WorksheetFunction.VLookupのように頭にWorksheetFunctionをつければいいです。

B列に入力した瞬間に計算させたいということなら
Changeイベントプロシージャを使います。
www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html#change
を参考にして下さい。
(頭のht・・・を省略しています。この質問掲示板のセキュリティ対策上の関係です)

以上の情報をもとにご自分でトライしてみてください。
詰まったらまた質問して下さい。
(私は日中はこちらに来ませんが、ほかのかたから支援があるはずです。)
 

【78596】Re:VLOOKUPを使いたい
お礼  もよもと  - 16/11/24(木) 7:35 -

引用なし
パスワード
   ▼γ さん:
>▼もよもと さん:
>>予め全てのセルに関数を入れるのは
>>手間が掛かるからです。
>=IF(B1="","",IFERROR(VLOOKUP(・・・・),"該当なし"))
>などとしておけば、一括してコピーペイストが可能。
>手動入力の場合は式に上書きする、
>ということでよいと思いますが、いかがですか?
>
>どうしてもVBAということなら、具体的に詰まっている点はどこですか?
>
>ワークシート関数をVBA内で使用する方法ですか?
>WorksheetFunction.VLookupのように頭にWorksheetFunctionをつければいいです。
>
>B列に入力した瞬間に計算させたいということなら
>Changeイベントプロシージャを使います。
>www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html#change
>を参考にして下さい。
>(頭のht・・・を省略しています。この質問掲示板のセキュリティ対策上の関係です)
>
>以上の情報をもとにご自分でトライしてみてください。
>詰まったらまた質問して下さい。
>(私は日中はこちらに来ませんが、ほかのかたから支援があるはずです。)
> 
γさん

早速、ご回答頂き有難うございます。
VBAにこだわるのは、作業者に関数をいじられたくない
からです。管理上、コピペ禁止しており、万一手動入力後に取り消ししようとして、関数を消されるとマズイので。また、動作も遅くなることも懸念してます。
まずは教えて頂いた方法でトライしてみます。

【78597】Re:VLOOKUPを使いたい
発言  β  - 16/11/24(木) 10:43 -

引用なし
パスワード
   ▼もよもと さん:

横から失礼します。

>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。

変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
エクセル利用の常道だと思いますが?

(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
 あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)

【78598】Re:VLOOKUPを使いたい
発言  もよもと  - 16/11/24(木) 12:33 -

引用なし
パスワード
   ▼β さん:
>▼もよもと さん:
>
>横から失礼します。
>
>>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。
>
>変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
>エクセル利用の常道だと思いますが?
>
>(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
> あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)


βさん

関数は変更されたくないのですが、そのセルに手動で値は入れたいのです。
また、入力セルは200×10程度あり、その全てに関数を入れると重くなるので。

【78599】Re:VLOOKUPを使いたい
発言    - 16/11/24(木) 13:54 -

引用なし
パスワード
   こんにちは。

なんか、あぶなっかしいですね。
VBAを使っても、想定外の使い方をされて 誤ったデータが完成・流通
してしまいそうな不安があります。

入力用のシート(B列とC〜E列に入力)と、出力用のシート(関数を仕込み、
保護を掛けてある)を別にするのはどうですか。


▼もよもと さん:
>▼β さん:
>>▼もよもと さん:
>>
>>横から失礼します。
>>
>>>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。
>>
>>変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
>>エクセル利用の常道だと思いますが?
>>
>>(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
>> あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)
>
>
>βさん
>
>関数は変更されたくないのですが、そのセルに手動で値は入れたいのです。
>また、入力セルは200×10程度あり、その全てに関数を入れると重くなるので。

【78600】Re:VLOOKUPを使いたい
お礼  もよもと  - 16/11/24(木) 15:05 -

引用なし
パスワード
   ▼佳 さん:
>こんにちは。
>
>なんか、あぶなっかしいですね。
>VBAを使っても、想定外の使い方をされて 誤ったデータが完成・流通
>してしまいそうな不安があります。
>
>入力用のシート(B列とC〜E列に入力)と、出力用のシート(関数を仕込み、
>保護を掛けてある)を別にするのはどうですか。
>
>
>▼もよもと さん:
>>▼β さん:
>>>▼もよもと さん:
>>>
>>>横から失礼します。
>>>
>>>>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。
>>>
>>>変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
>>>エクセル利用の常道だと思いますが?
>>>
>>>(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
>>> あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)
>>
>>
>>βさん
>>
>>関数は変更されたくないのですが、そのセルに手動で値は入れたいのです。
>>また、入力セルは200×10程度あり、その全てに関数を入れると重くなるので。

佳さん

その手もアリですね。
トライしてみます。

【78604】Re:VLOOKUPを使いたい
質問  もよもと  - 16/11/28(月) 0:57 -

引用なし
パスワード
   ▼もよもと さん:
>▼佳 さん:
>>こんにちは。
>>
>>なんか、あぶなっかしいですね。
>>VBAを使っても、想定外の使い方をされて 誤ったデータが完成・流通
>>してしまいそうな不安があります。
>>
>>入力用のシート(B列とC〜E列に入力)と、出力用のシート(関数を仕込み、
>>保護を掛けてある)を別にするのはどうですか。
>>
>>
>>▼もよもと さん:
>>>▼β さん:
>>>>▼もよもと さん:
>>>>
>>>>横から失礼します。
>>>>
>>>>>万一手動入力後に取り消ししようとして、関数を消されるとマズイので。
>>>>
>>>>変更されたくないセルに対しては、セルに保護をかけでシートを保護しておくのが
>>>>エクセル利用の常道だと思いますが?
>>>>
>>>>(セル保護は初期値すべてかかっていますので、実際には、全セルの保護を解除して
>>>> あらためて、変更禁止せルに保護を設定した上でシート保護になりますが)
>>>
>>>
>>>βさん
>>>
>>>関数は変更されたくないのですが、そのセルに手動で値は入れたいのです。
>>>また、入力セルは200×10程度あり、その全てに関数を入れると重くなるので。
>
>佳さん
>
>その手もアリですね。
>トライしてみます。

下記のコードでなんとかイメージ通りに出来ましたが、
エラー回避のためにOn Error Gotoを入れると、エラーで
ないものまでエラー判定されてしまい、困っています。
どうしたら、よろしいでしょうか。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rng As Range
  Dim r  As Range
  Set rng = Intersect(Target, Range("$E$8:$E$200"))
  If Not rng Is Nothing Then
  Application.EnableEvents = False
    For Each r In rng
      If r.Value <> "" Then
        r.Offset(, 2).Value = Application.WorksheetFunction.VLookup(r, Sheets("Sheet2").Range("$B$3:$I$200"), 2, False)
        r.Offset(, 3).Value = Application.WorksheetFunction.VLookup(r, Sheets("Sheet2").Range("$B$3:$I$200"), 3, False)
        r.Offset(, 4).Value = Application.WorksheetFunction.VLookup(r, Sheets("Sheet2").Range("$B$3:$I$200"), 4, False)
      Else
        r.Offset(, 2).ClearContents
        r.Offset(, 3).ClearContents
        r.Offset(, 4).ClearContents
      End If
    Next
    Application.EnableEvents = True
    Set rng = Nothing
  End If
End Sub

【78605】Re:VLOOKUPを使いたい
発言  γ  - 16/11/28(月) 7:35 -

引用なし
パスワード
   Application.WorksheetFunction.Lookup と On Error Go To を組み合わせても可能ですが、
Application.Lookupとすると、エラーにならず、エラー値だけが返されます。
これを利用するとよいでしょう。

↓を参照してください。
ht tps://www.moug.net/tech/exvba/0100035.html

なお、この場合、なんどもVLOOKUPで検索するのは無駄になりますので、
一度だけMatch関数で位置を調べ、
あとはIndex関数を使うか、直接、行番号を使ってセルの値を取り出すのが
効率的でしょう。

なお、そのつど全文引用するのはやめてください。
無駄に長くなります。          

【78607】Re:VLOOKUPを使いたい
お礼  もよもと  - 16/11/28(月) 10:10 -

引用なし
パスワード
   ▼γ さん:
>Application.WorksheetFunction.Lookup と On Error Go To を組み合わせても可能ですが、
>Application.Lookupとすると、エラーにならず、エラー値だけが返されます。
>これを利用するとよいでしょう。
>
>↓を参照してください。
>ht tps://www.moug.net/tech/exvba/0100035.html
>
>なお、この場合、なんどもVLOOKUPで検索するのは無駄になりますので、
>一度だけMatch関数で位置を調べ、
>あとはIndex関数を使うか、直接、行番号を使ってセルの値を取り出すのが
>効率的でしょう。
>
>なお、そのつど全文引用するのはやめてください。
>無駄に長くなります。 

γさん:
エラー値を表示せずに、メッセージ表示してTargetを消すような動作は
できないでしょうか。
また、MatchとIndexを組み合わせる方法がいまいちよく分からないので
併せて教えて頂けると幸いです。

【78608】Re:VLOOKUPを使いたい
発言  β  - 16/11/28(月) 12:51 -

引用なし
パスワード
   ▼もよもと さん:

γさんから

>>なお、そのつど全文引用するのはやめてください。
>>無駄に長くなります。 

というアドバイスがあるのに、それでも全文引用 ?

まぁ、それはさておき

>エラー値を表示せずに、メッセージ表示してTargetを消すような動作は
>できないでしょうか。

最初のApplication.VLookUp の結果を セル直接 ではなく Variant型の変数で受けます。

で、

If IsError(その変数) Then
  MsgBox "該当値がありません。" & vblf & "入力を元に戻します"
  Application.Undo
  Application.EnableEvents = True
  Exit Sub
Else
  その変数を目的のセルにセット
 2番目以降のVLookUp 等 現在のコード
End If

といったようにされるといいと思います。
ただ、一括複数入力時、ループ処理をされていますよね。
そうした場合、仮に、マッチする入力があって、そのあとにマッチしないものがあった場合は
UnDo で不具合が発生します。

ですから、ちょっとコード的には悩ましいところがありますね。
(手当て方法はありますが)

>MatchとIndexを組み合わせる方法がいまいちよく分からない

シート関数のMATCHの使い方はおわかりですよね。

Variant型変数 = Application.Match(・・・・)
If IsError(その変数) Then
  MsgBox "該当値がありません。" & vblf & "入力を元に戻します"
  Application.Undo
  Application.EnableEvents = True
  Exit Sub
Else
  3行目から200行目の領域の中の 変数が示す位置(変数+2 行目), の
  C,D,E列の値を目的のセルにセット
End If

こんな感じです。
ただし、一括複数入力時の課題は同じものがありますが。

【78609】Re:VLOOKUPを使いたい
お礼  もよもと  - 16/11/28(月) 15:29 -

引用なし
パスワード
   βさん:
ご丁寧にありがとうございます。
早速、トライしてみます。

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