「みんな教えて! 選手権!!」開催のお知らせ

空白でない場合はネットでお見掛けするのですが、逆はどうしたら良いのか独学歴も浅く自力では最早解決出来そうになく、皆様の知恵をお借りしたいです。

表のとある列に空白が所々空いており、それを埋める様な形をFor NextでWorksheetFunction.Vlookup を回して別ブックの表から値を持って来れたらと思っています。
色々ネットを見ながら組んだのですが、最後のWorksheetFunctionの辺りでコードが上手くいきません。
エラー回避を入れると最後までコードは動く様になるのですが、欲しい結果は得られません。
イミディエイトを見ていると何やら転送先ファイルの範囲を上手く選択出来ていない様なのですが、どうしたら良いのか分からず自分ではお手上げです。
どうか、ご教授お願いします。

Dim Nd As String
Nd = Worksheets(“Meinmenu”).Range(“F19”).Value’年の値が入っています

Dim Nd2 As String
Nd2 = Worksheets(“Meinmenu”).Range(“E21”).Value’月の値が入っています

Dim NewFN As String
NewFN = (“転記先” & Nd & “年” & Nd2 & “月.xlsx”)

Call コール用5‘転記先をアクティブ

Worksheets(Nd & “年上期”).Select

Dim i As Long
For i = 13 To Cells(Rows.Count,3).End(xlUp).Row

Dim x As Range
x = Worksheets(Nd & “年上期”).Cells(i,”A”)

If Cells(i,”C”) = “” Then

Cells(i,”C”).Value _
= WorksheetFunction.Vlookup(x,Workbooks (“転記元.xlsm”).Worksheet(“転記用”).Range(“A2: 130”),2,False)

End If

Next i

宜しくお願いします。

質問者からの補足コメント

  • どう思う?

    回答頂きありがとうございます。
    転記元はセル値に今日から今年度や今月などの数値が計算されているMeinmenuシートと転記用の値の有る表がある転記用シートが有ります。
    転記先には今年度上期のシートが有り、B列に4、5、6、7、8、9月と月が入力されており、A列に店番、C列に月の値を入力する様になっています。
    先月のC列は空白で今月も同じく空白ですが、こちらは行ごと非表示になっています。
    この先月の空白のC列に転記用シートから店番を元にVlookupして値を埋めたいと思っています。

    >2)検索範囲として指定されている、「Range(“A2: 130”)」がおかしくありませんか?
    少なくとも2列分の範囲になるはずなので、「Range(“A2: B130”)」とかではないのでしょうか?

    これに関しては、その通りです。
    直打ちしていたら、確認したつもりですが抜け落ちていた様です。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/10/18 22:12

A 回答 (2件)

No1です。



No1にも書きましたが、「セル範囲が正しく選別できている」という前提での回答です。
範囲や選別ができていないのであれば、そこから見直してください。
関数そのものに関しては、こちらでは書式程度しか確認できませんので、実質的な内容がご希望と異なっていれば、当然ながら求める結果は得られません。

また、
>エラー回避を入れると最後までコードは動く様になるのですが
とのことなので、基本的にはエラーが発生したままの状態であると推測します。
勝手に想像すると、意図的なエラー回避ではなく、「エラーをなかったことにする」ためだけの回避になっていたりしませんか?
(臭いものに蓋をするだけなので、何も得られない)

一方で、VlookupをWorksheetFunctionで使用する場合、シート関数でエラー値を返すような設定で実行すると、VBAではエラーが発生します。
ちなみに、No1の後半でご紹介した方法であれば、シートには関数式を設定しているだけなので、関数でのエラーはエラー値として表示され、VBAのエラーにはなりません。


※ 実質的な内容がほとんど不明な状態なので、こちらではこれ以上はわかりかねます。
 ステップ実行を行ったり、ウォッチウィンドウやイミディエイトウィンドウを利用して変数等の内容を確認するなどして、まずは「何が思っている内容と違うのか」を確認してください。
原因がわかれば、おのずと解決法も見えてくるのではないかと思います。
    • good
    • 0
この回答へのお礼

遅くなりましたが、再びのご回答ありがとうございます。

> Dim i As Long
For i = 13 To Cells(Rows.Count,3).End(xlUp).Row

見直して書き直していた所、此処の指定の仕方を変え、変数NdとNd2の値の指定時にworkbook から指定した結果動く様になりました。
何度も見直す事を勧めて下さったおかげで気付けました。
ありがとうございました。

お礼日時:2023/10/21 14:20

こんばんは



ブックやシートの構成が不明なので、何がどうなっているのかよくわかりませんけれど・・

>何やら転送先ファイルの範囲を上手く選択出来ていない様なのですが、
>どうしたら良いのか分からず自分ではお手上げです。
処理対象のセルの選別は上手くいっているのなら、値を計算する部分がおかしいということが推測できます。

多分、以下の部分で計算していると想像しますが、2点おかしなところがあります。
>WorksheetFunction.Vlookup(x,Workbooks (“転記元.xlsm”).Worksheet(“転記用”).Range(“A2: 130”),2,False)

1)変数xは検索値に当たるものと思いますが、その前の変数宣言ではRange型に宣言されています。(Variantなどではないでしょうか?)

2)検索範囲として指定されている、「Range(“A2: 130”)」がおかしくありませんか?
少なくとも2列分の範囲になるはずなので、「Range(“A2: B130”)」とかではないのでしょうか?



ちなみに、ご提示のようにループで1セルずつ判断して、値を設定してゆく方法もありますが、別法として対象セルをまとめて処理する方法も考えられます。
(大量にある場合は、個別に処理するよりも速い可能性があります)

With 対象セル範囲.SpecialCells(xlCellTypeBlanks)
 .FormulaR1C1 = "Vlookupを用いた計算式" ' セルに計算式を設定
 .Value = .Value ' セルの計算式を固定値化(式のままでよければ不要)
End With

※ 上記の方法の場合、実際に対象になるセルの位置が前もってはわからないので、入力する計算式はR1C1形式にしておくのが便利です。
(これによって、同じ式を設定すればよくなる)
検索値のセル値も式の中で参照指定できるので、変数xは不要になります。
この回答への補足あり
    • good
    • 0
この回答へのお礼

遅くなりましたが、回答頂きありがとうございます。
情報の追記はしてみましたが、未だ足りない様でしたら申し訳有りません。

> 1)変数xは検索値に当たるものと思いますが、その前の変数宣言ではRange型に宣言されています。(Variantなどではないでしょうか?)

Variant に変えてみました。

> 2)検索範囲として指定されている、「Range(“A2: 130”)」がおかしくありませんか?
少なくとも2列分の範囲になるはずなので、「Range(“A2: B130”)」とかではないのでしょうか?

こちらはその通りで、直打ちしていたら抜け落ちていた様です。
お手数お掛けしました。

> With 対象セル範囲.SpecialCells(xlCellTypeBlanks)
 .FormulaR1C1 = "Vlookupを用いた計算式" ' セルに計算式を設定
 .Value = .Value ' セルの計算式を固定値化(式のままでよければ不要)
End With

はまだ試していなかったので試してみたいと思います。

お礼日時:2023/10/19 12:44

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


おすすめ情報