Excel VBA質問箱 IV

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

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


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

【65005】Vlookupの結果がゼロになってしまいます komo 10/4/1(木) 17:00 質問[未読]
【65006】Re:Vlookupの結果がゼロになってしまいます Jaka 10/4/1(木) 17:25 発言[未読]
【65008】おまけ。 Jaka 10/4/1(木) 17:29 発言[未読]
【65011】Re:おまけ。 komo 10/4/1(木) 17:46 発言[未読]
【65018】Re:おまけ。 Jaka 10/4/2(金) 9:49 発言[未読]
【65020】Re:おまけ。 komo 10/4/2(金) 10:22 発言[未読]
【65021】Re:おまけ。 Jaka 10/4/2(金) 10:32 発言[未読]
【65022】Re:おまけ。 komo 10/4/2(金) 20:13 発言[未読]
【65036】Re:おまけ。 Jaka 10/4/6(火) 9:34 発言[未読]
【65037】Re:おまけ。 komo 10/4/6(火) 9:40 発言[未読]

【65005】Vlookupの結果がゼロになってしまいます
質問  komo  - 10/4/1(木) 17:00 -

引用なし
パスワード
   エクセルVBAを勉強しはじめて間もない者です。
セミナーを受講して、自分でプログラムをしていますが、
エラーで困っています。

過去の書き込みも見てみたのですが、よく分からなかったので新規投稿させて頂きます。

どうぞよろしくお願い致します。


開発環境
Windows XP
Excel 2007

別のブックのデータをvlookupを使って引っ張ってきたいのですが、
すべてのセルで「0」が表示されてしまいます。

売上の実績データファイルがあります。
商品コード毎に売上の実績が記載されています。
そのデータに、プロダクトマスターから商品コードをキーにして定価の情報を紐づけたいと言うのがゴールです。

実績ファイルの3番目のシートのD列に商品コードが記載されています。
F列に数量が既に記載済
H列に定価を転記して、最終的にI列に数量×定価で定価での売上金額を記載したいのです。


On Error Resume Nextを使わないと「型が一致しません」というコンパイルエラーになります。

参照するプロダクトマスターの行数は増えていきますので、変数を使っています。
この変数はうまく機能しているようです。

どうぞ宜しくお願い致します。


  'ファイルパス
  Dim filePath As String
  filePath = ThisWorkbook.Path & "\pm.xls"
  
  'Excelブックオブジェクト
  Dim book As Workbook
  Set book = Workbooks.Open(filePath) '他Excelブックを開く
  
  'レコードの行数を取得する pm側
  Dim rowCountpm As Long
  rowCountpm = book.Sheets(1).Range("A2").End(xlDown).Row
  
  'レコードの行数を取得する Main側
  Dim rowCountmain As Long
  rowCountmain = ThisWorkbook.Sheets(3).Range("A2").End(xlDown).Row
  
  '1レコードずつ読み込む
  Dim loopCount As Long
  For loopCount = 2 To rowCountmain
    
  '各フィールド
  Dim TEIKAJISSEKI As Long
  Dim UNIT As Long
  Dim TEIKA As Long
   
  ‘定価を紐づける
  With ThisWorkbook.Sheets(3)
  
On Error Resume Next
  
  TEIKA = Application.WorksheetFunction.VLookup(.Cells("D",loopCount), book.Sheets(1).Range(book.Sheets(1).Cells("A2"), book.Sheets(1).Cells("V", rowCountpm)), 22, False)

On Error GoTo 0

  .Range("H" & loopCount).Value = TEIKA

  ‘定価実績の計算
  UNIT = .Range("F" & loopCount).Value
  
  TEIKAJISSEKI = UNIT * TEIKA

  .Range("I" & loopCount).Value = TEIKAJISSEKI

  End With
      
  Next
  
  'Excelブックを閉じる
  book.Close

【65006】Re:Vlookupの結果がゼロになってしまいま...
発言  Jaka  - 10/4/1(木) 17:25 -

引用なし
パスワード
   もう帰るので簡単ですが、

エラートラップして、Vlookupの返り値を受ける変数が、Long型ですよね。
要するに見つからないってことです。

on error を外すと、
TEIKA = Application.WorksheetFunction.VLookup・・・・
で、見つからない場合、実行エラーになります。

【65008】おまけ。
発言  Jaka  - 10/4/1(木) 17:29 -

引用なし
パスワード
   エクセル関数は、文字か数値化を厳密に区別します。
その辺りで、見つからない結果になることも。

【65011】Re:おまけ。
発言  komo  - 10/4/1(木) 17:46 -

引用なし
パスワード
   ▼Jaka さん:
>エクセル関数は、文字か数値化を厳密に区別します。
>その辺りで、見つからない結果になることも。

Jakaさん、ありがとうございます。

試しにVariant型にして実行してみたのですが、
今度はセルが空欄になりました。

プロダクトマスター側の定価データは、数値型で、これは
TYPE関数を使って確認済なので、Longで大丈夫かと
思ったのですが。。。

【65018】Re:おまけ。
発言  Jaka  - 10/4/2(金) 9:49 -

引用なし
パスワード
   なんて説明したら良いのか解らないので、簡単に

>Application.WorksheetFunction.VLookup
       ^^^^^^^^^^^^^^^^^
VBAでエクセル関数を使う場合、シート上でエラー値が返るはずのものは、
ans = WorksheetFunction.○○○・・・・
(Application.WorksheetFunction. は、上と同じこと。)
とすると、エラー値を返せず実行エラーになります。

エラートラップで実行エラーをスキップするから、変数ansの中は、初期値のままです。

dim ans variant
ans = Application.VLookup
上のように5(たぶん)〜95時代の書き方をすれば、エラー値が返ります。

使用例は、
Application.VLookup
Application.Match
で、検索すれば、かなりの数がひっかるとおもいます。

【65020】Re:おまけ。
発言  komo  - 10/4/2(金) 10:22 -

引用なし
パスワード
   なるほど!
ありがとうございます。

これで、何でゼロになっているのかは理解できました。

あとは、何でエラーになっているのかです。

95時代の書き方をすれば、何でエラーになっているのかがわかるという理解で宜しいでしょうか?検索してみます。


▼Jaka さん:
>なんて説明したら良いのか解らないので、簡単に
>
>>Application.WorksheetFunction.VLookup
>       ^^^^^^^^^^^^^^^^^
>VBAでエクセル関数を使う場合、シート上でエラー値が返るはずのものは、
>ans = WorksheetFunction.○○○・・・・
>(Application.WorksheetFunction. は、上と同じこと。)
>とすると、エラー値を返せず実行エラーになります。
>
>エラートラップで実行エラーをスキップするから、変数ansの中は、初期値のままです。
>
>dim ans variant
>ans = Application.VLookup
>上のように5(たぶん)〜95時代の書き方をすれば、エラー値が返ります。
>
>使用例は、
>Application.VLookup
>Application.Match
>で、検索すれば、かなりの数がひっかるとおもいます。

【65021】Re:おまけ。
発言  Jaka  - 10/4/2(金) 10:32 -

引用なし
パスワード
   ▼komo さん:
>95時代の書き方をすれば、何でエラーになっているのかがわかるという理解で宜しいでしょうか?検索してみます。
違います。
対象セルが見つからない時、
変数にエラーだよ。と返せるか、そのまま実行エラーになるかの違いだけです。

【65022】Re:おまけ。
発言  komo  - 10/4/2(金) 20:13 -

引用なし
パスワード
   ありがとうございます。
検索しまして、ご教示の内容を入れて、下記のような別のプロシージャーを組んでみたところ、なんとなく分かってきました。

相変わらずエラーになるのですが、第一引数の

.Cells("D2")

には、マクロを実行しているメインのブックを参照させたいのですが、
プロダクトマスターのブックを参照していまいた。
そうしますと、データは「文字列」になりますので、型が合わない
というエラーも納得です。
恐らくこの辺が怪しいかなと思います。

第一引数と、第二、第三引数の参照ブックが違う場合に
どのように記載すればいいのかということを少し研究してみます。

取り急ぎ、ご報告させて頂きます。


Dim Results As Variant
 
  'ファイルパス
  Dim filePath As String
  filePath = ThisWorkbook.Path & "\pm.xls"
  
  'Excelブックオブジェクト
  Dim book As Workbook
  Set book = Workbooks.Open(filePath) '他Excelブックを開く
  
  'レコードの行数を取得する pm側
  Dim rowCountpm As Long
  rowCountpm = book.Sheets(1).Range("A2").End(xlDown).Row
  
  'レコードの行数を取得する Main側
  Dim rowCountmain As Long
  rowCountmain = ThisWorkbook.Sheets(3).Range("A2").End(xlDown).Row
 
 
Results = Application.WorksheetFunction.VLookup(.Cells("D2"), _
book.Sheets(1).Range(book.Sheets(1).Cells("A2"), book.Sheets(1).Cells("V", rowCountpm)), 22, False)

  
If Not IsError(Results) Then
  MsgBox Range("D2").Value & " was found, results: " _
   & Results
   
Else

  MsgBox "Not found"
 
End If

【65036】Re:おまけ。
発言  Jaka  - 10/4/6(火) 9:34 -

引用なし
パスワード
   >Results = Application.WorksheetFunction.VLookup(.Cells("D2"), _
>book.Sheets(1).Range(book.Sheets(1).Cells("A2"), book.Sheets(1).Cells("V", rowCountpm)), 22, False)

Application.WorksheetFunction.VLookup
       ^^^^^^^^^^^^^^^^^
        ↑
 これをつけると、実行エラーになり、エラー値を返してくれない。

dim ans variant
ans = Application.VLookup
上のように5(たぶん)〜95時代の書き方をすれば、エラー値が返ります。

【65037】Re:おまけ。
発言  komo  - 10/4/6(火) 9:40 -

引用なし
パスワード
   ありがとうございます!
把握です。

昨日は仕事が忙しくて動けませんでした。。。
木曜日に時間ができるので、検証作業すすめたいと思います!

ありがとうございます!

▼Jaka さん:
>>Results = Application.WorksheetFunction.VLookup(.Cells("D2"), _
>>book.Sheets(1).Range(book.Sheets(1).Cells("A2"), book.Sheets(1).Cells("V", rowCountpm)), 22, False)
>
>Application.WorksheetFunction.VLookup
>       ^^^^^^^^^^^^^^^^^
>        ↑
> これをつけると、実行エラーになり、エラー値を返してくれない。
>
>dim ans variant
>ans = Application.VLookup
>上のように5(たぶん)〜95時代の書き方をすれば、エラー値が返ります。

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