[[20200203003331]] 『VlookUpとオートフィル』(みず) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VlookUpとオートフィル』(みず)

こんばんは。
データベースから
VLOOKUPで金額、状態、ステータスと3項目を転記しています。
マクロの記録を使ってプログラムを作って使用しています。
「一覧 - 購買オーダ明細」と言うファイルは毎回名前が変わるのですが
プログラムを走らせるとファイル選択のダイアログが出てくるので
取りあえず3回転記元ファイルを選択し4回目をキャンセルする事で
何とか使えています。
これを1回選択するだけで、最後ま処理できるようにしたいのですが
どなたかご教授お願いできますでしょうか?

Sub VlookUpとオートフィル()

    '最終行の取得
    LstRow = Cells(Rows.Count, 1).End(xlUp).Row

    Range("FT2").Select
    Application.CutCopyMode = False
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(RC[-171],'一覧 - 購買オーダ明細'!C5:C13,9,0)"
    Range("FU2").Select
    Application.CutCopyMode = False
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(RC[-172],'一覧 - 購買オーダ明細'!C5:C17,13,0)"
    Range("FV2").Select
    Application.CutCopyMode = False
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(RC[-173],'一覧 - 購買オーダ明細'!C5:C22,18,0)"

    'オートフィル
    Range("FT2:FV2").AutoFill Destination:=Range("FT2:FV" & LstRow)

    '#N/N 削除
    ActiveSheet.Range("$A$1:$FV$340").AutoFilter Field:=177, Criteria1:="#N/A"
    Columns("FT:FV").Select
    Application.CutCopyMode = False
    Selection.ClearContents
    ActiveSheet.Range("$A$1:$FV$340").AutoFilter Field:=177

    '数式削除
        Columns("FT:FV").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

End Sub

'最終行の取得の次に

Dim strPath As String
With Application.FileDialog(msoFileDialogFilePicker)

  .Show
  strPath = .SelectedItems(1)
End With

    MsgBox strPath

を入れて
VLOOKUPの引数を変更して走らせてみたのですが
キャンセルするまで何回もフォイルを聞いてくし
転記がうまくいきません。(引数の設定が悪いのかもしれませんが)

'#N/N 削除の所も無駄というか
もっとスマートな処理があれば教えて頂けると助かります。

< 使用 Excel:Office365、使用 OS:Windows10 >


寝付けなかったので、提示されたコードを整理してみましたがこんな感じですかね
未テストですが、コンパイルは通りましたので構文はOKだとおもいます。

  Sub VlookUpとオートフィル整理()
      Dim LstRow As Long

      With ActiveSheet

        '最終行の取得
        LstRow = .Cells(.Rows.Count, 1).End(xlUp).Row

        .Range("FT2").Formula = "=VLOOKUP(E2,'一覧 - 購買オーダ明細'!E2,$E:$M,9,0)"
        .Range("FU2").Formula = "=VLOOKUP(E2,'一覧 - 購買オーダ明細'!E2,$E:$Q,13,0)"
        .Range("FV2").Formula = "=VLOOKUP(E2,'一覧 - 購買オーダ明細'!E2,$E:$V,18,0)"

        'オートフィル
        .Range("FT2:FV2").AutoFill Destination:=.Range("FT2:FV" & LstRow)

        '#N/N 削除
        .Range("$A$1:$FV$340").AutoFilter Field:=177, Criteria1:="#N/A"
        .Columns("FT:FV").ClearContents
        .AutoFilterMode = False

        '数式削除
        With .Columns("FT:FV")
           .Value = .Value
        End With
      End With

   End Sub

おそらく、質問の答えとしては「一覧 - 購買オーダ明細」というシートが見つからず、それはどこなのさ?と聞かれている状態なので、本当にシート名がまちがってないか再確認が必要という感じじゃないでしょうか?

とりあえず、半角スペース含めて一致しないとダメなので、その辺を確認されてみては如何でしょうか?

(もこな2) 2020/02/03(月) 06:13


かなりスッキリしました。
ありがとうございました。

ファイルを選択をさせた後
VLOOKUPのある行でまたファイルを聞いてきます。

なぜなんでしょうか?
取得したファイルのパスの引数の使い方が悪いのでしょうか?

Sub VlookUpとオートフィル整理()

      Dim LstRow As Long
      Dim dlg As FileDialog
      Dim strPath As String

With Application.FileDialog(msoFileDialogFilePicker)

  .Show
  strPath = .SelectedItems(1)
  MsgBox strPath
End With

    With ActiveSheet

       '最終行の取得
        LstRow = .Cells(.Rows.Count, 1).End(xlUp).Row

        MsgBox LstRow

        .Range("FT2").Formula = "=VLOOKUP(E2,'strPath'!$E:$M,9,0)"
        .Range("FU2").Formula = "=VLOOKUP(E2,'strPath'!$E:$Q,13,0)"
        .Range("FV2").Formula = "=VLOOKUP(E2,'strPath'!$E:$V,18,0)"

        'オートフィル
        .Range("FT2:FV2").AutoFill Destination:=.Range("FT2:FV" & LstRow)

        '#N/N 削除
        .Range("$A$1:$FV$340").AutoFilter Field:=177, Criteria1:="#N/A"
        .Columns("FT:FV").ClearContents
        .AutoFilterMode = False

        '数式削除
        With .Columns("FT:FV")
           .Value = .Value
        End With
      End With

   End Sub

(みず) 2020/02/03(月) 10:11


 MsgBox strPath
 で表示されたものは何ですか?
 説明できますか?
 シート情報も入っているんですか?

 MsgBox strPath
 の後に、
 MsgBox  "=VLOOKUP(E2,'strPath'!$E:$M,9,0)"
 として、その内容を確認して下さい。
 どうなっていますか?

 ""の中に入れた変数名は、
 変数のつもりでも、単なるstrPathという文字列だと思いますよ。

 また、手作業で別のブックの表をVLOOKUPで参照するとき、
 どのような式になるか、確認していますか?

 更に言えば、手を入れて頂いたコードをご覧になって、
 どこが悪かったのか、把握していますか?

 以上の事柄は、かなり重要な考え方で、それを学ぶ良いチャンスです。
 ご自分で確認することが大切です。

(γ) 2020/02/03(月) 11:42


Range("FT2").Formula = "=VLOOKUP(E2,'一覧 - 購買オーダ明細'!E2,$E:$M,9,0)"の
"ファイル名"!E2 のところで 範囲を指定する時
変数での指定の仕方がわかりません。
数時間ネットで検索しましたが、検索ワードがあまり思いつかず
理解できる記述が引っ掛かりませんでした。

検索は VLOOKUP 変数、VLOOKUP 範囲指定、VLOOKUP 式
    VLOOKUP ファイル名 範囲指定、など 

>MsgBox "=VLOOKUP(E2,'strPath'!$E:$M,9,0)"
は""で囲っているので文字として認識していると思います。
=VLOOKUP(E2,'strPath'!$E:$M,9,0)と表示しています。

'strPath'の表記が正しいか(接続記号はあっているかなど)は
MsgBox "=VLOOKUP(E2,'strPath'!$E:$M,9,0)"ではわからない様に思います。

フルパスからファイル名のみをとりだせる様になりましたが
取り出せても記述の仕方がわからないので先に進めない状態です。

(みず) 2020/02/03(月) 21:19


出発点は、
「別のブックにある表から、VLOOKUPで値を取得する」ということですね。

手作業で、一例を作って見て下さい。
どんな式になっていますか?それをこちらにアップして下さい。
それが分からないということはないですよね。

VBAというのは、なんらかの動作を自動化するものですが、
その「なんらか」というところは、しっかり認識しないと、前に進みません。

(γ) 2020/02/03(月) 21:31


Sub VlookUpとオートフィル()

    '最終行の取得
    LstRow = Cells(Rows.Count, 1).End(xlUp).Row

    Range("FT2").Select
    Application.CutCopyMode = False
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(RC[-171],'オーダー明細'!C5:C13,9,0)"

'オートフィル

    Range("FT2:FV2").AutoFill Destination:=Range("FT2:FV" & LstRow)

End Sub

です。

"見積一覧"というファイルに"オーダー明細"ファイルの金額を転記します。

検索値は"見積一覧"の"E2"
範囲は"オーダー明細"のC5からC13
列番号は9

転記先のセルは"FT2"です。

"オーダー明細"と言うファイル名は毎回変わるので
ファイルを開くダイアログで転記元のファイルを選択して
処理したいのです。
(みず) 2020/02/04(火) 01:09


えっと・・・もっと問題を切り分けてみてはどうですか?
FT2、FU2、FV2に【手作業で】Vlookup関数を使った数式を記入してみて、マクロの記録でコード化

↑ができたら、必要な命令はどの部分なのか【ステップ実行】してしらべてみて、無駄な部分を削除するなど整形してみる。

↑ができたらR1C1参照形式を【A1参照形式】で記述してみる。

↑ができたら、対象シートを変えるにはどの部分を変えればよいか【考えてみる】

↑ができたら、実際にコードを変えてみる

↑ができたら、ステップ実行して問題ないか試してみる

↑ができたら、エラー値の削除や、数式→値へ変換 の部分と組み合わせる

としてみてはどうですか?

(もこな2) 2020/02/04(火) 06:46


もともと、手作業で行っていました。
自動化したかったので、マクロの記録をしました。

そのマクロを使っていますが
ファイル名が毎回違うので、
毎回プログラムを書き換えるのも手間がかかるので
そのまま使っても、対象のファイルがないと言う事で
ダイアログが開きくので、そこで希望のファイルを選択して使用しています

対象のファイルをかえるのは、どこを変えればよいかはわかります。
先に書きましたが毎回そこを書き換えるのは手間です。

自分のみが行う作業ならそれでも良いですが
プログラムをさわる事に抵抗がある人に
どこの、どの場所をどう変えるかというのを
理解してもらうのは大変です。
(みず) 2020/02/04(火) 08:06



 要するに
 FT2にセットする数式としては
 >=VLOOKUP(RC[-171],'一覧 - 購買オーダ明細'!C5:C13,9,0)
 は(ブック名の指定がないので)不完全だということです。

 まずは正しく機能する数式を得る(※)事です。
 ※ フォルダパス・ブック名・シート名・セル範囲のすべてが必要です。

 〜〜〜〜〜〜 γさんへ
 "=VLOOKUP(RC[-171],'オーダー明細'!C5:C13,9,0)"
 ↑は R1C1形式の表現で問題ありません。A1形式と混在してはいません。
 ちょっと気になったので。
(チオチモリン) 2020/02/04(火) 10:03


 |  自分のみが行う作業ならそれでも良いですが
 |  プログラムをさわる事に抵抗がある人に
 |  どこの、どの場所をどう変えるかというのを
 |  理解してもらうのは大変です。

 他人のせいにされるなら、今までどおり手作業でやったほうがよいと思います。
 パス名だけ取得しても、シート名を指定させたり、セル範囲を指定したり、
 それは結局、手作業でやるのと殆ど変わりありません。
 今まで手作業でやってきたというなら、それを継続した方がよいかもしれません。

 パス名を式に反映するコードも書きましたが、やめましょう。
 今までとおり、慣れた手作業でやったほうがよいでしょう。
 私はここまでとさせていただきます。  

チオチモリンさん、ご指摘ありがとうございました。その部分、勘違いしていました。失礼しました。

(γ) 2020/02/04(火) 10:23


 >"見積一覧"というファイルに"オーダー明細"ファイルの金額を転記します。 
 >検索値は"見積一覧"の"E2" 
 >範囲は"オーダー明細"のC5からC13 
 >列番号は9 
 >転記先のセルは"FT2"です。 
 >"オーダー明細"と言うファイル名は毎回変わるので 
 >ファイルを開くダイアログで転記元のファイルを選択し処理したいのです。 

 やりたいことは大体わかりましたが、仕様はキッチリ書いてください。

 ブック名とシート名が分からないと的確に処理できません。

 上の記述だと、
 1.ブック名は "見積一覧" と "オーダー明細" ですね?
   拡張子は何ですか?(xlsm,xlsx?)

 2.シート名は(紛らわしくて、ホントと思うんですが)
   「見積一覧」  
   「オーダー明細」

   なのですか?

 あと、当初こんな記述がありましたが、「ダ」で止まっていて、混乱の元ですよ。
         ↓  
 >「一覧 - 購買オーダ明細'!C5:C13,9,0)"

(半平太) 2020/02/04(火) 10:53


 >拡張子は何ですか?(xlsm,xlsx?)

 すみません。

 拡張子はStrPathに入ってくるので不要でした。m(__)m

 その質問は無視してください。

(半平太) 2020/02/04(火) 11:39


チオチモリン様

不完全な部分の解説ありがとうございました。
少し先に進めました。

パス名やファイル名を式に反映させようと
色々試しているところです。

Sub VlookUpとオートフィル()

      Dim LstRow As Long
      Dim OpenFileName As String
      Dim FileName As String
      Dim strFormula As String
      Dim strVlook As String

'// ダイアログでファイルを選択
'With Application.FileDialog(msoFileDialogFilePicker)
' .Show
' OpenFileName = .SelectedItems(1)
' MsgBox OpenFileName '// 検証の為表示して確認

        '// ダイアログでファイルを選択した状態を仮定
        OpenFileName = "C:\Users\abc3\OneDrive\ドキュメント\VBA 練習\VBA プログラム\データ 191227-170935.xlsx"
        MsgBox "OpenFileName" & vbNewLine & OpenFileName '// 検証の為表示して確認

        FileName = Dir(OpenFileName)
        MsgBox "FileName" & vbNewLine & FileName '// 検証の為表示して確認

        Path = Replace(OpenFileName, FileName, "")
        MsgBox "Path" & vbNewLine & Path     '// 検証の為表示して確認

        strFormula = Path & FileName
        MsgBox "strFormula" & vbNewLine & strFormula '// 検証の為表示して確認

        strVlook = ("E2,'" & Path & "[" & FileName & "]" & "Sheet(1)'!$E:$M,9,0")
        MsgBox "strVlook" & vbNewLine & strVlook  '// 検証の為表示して確認
'End With

    With ActiveSheet

       '最終行の取得
        LstRow = .Cells(.Rows.Count, 1).End(xlUp).Row

'.Range("FT2").Formula = "=VLOOKUP(E2,'C:\Users\abc3\OneDrive\ドキュメント\VBA 練習\VBA プログラム\[データ 191227-170935]Sheet(1)'!$E:$M,9,0)"
'// 結果:正常に処理

'.Range("FT2").Formula = "=VLOOKUP(strVlook)"
'// 結果:実行時エラー、アプリケーション定義またはオブジェクト定義エラー

'.Range("FT2").Formula = "=VLOOKUP(E2,'& Path & "[" & FileName & "]" & Sheet(1)'!$E:$M,9,0)"
'// 結果:コンパイルエラー、構文エラー

'.Range("FT2").Formula = "=VLOOKUP(E2,'& Path &[データ 191227-170935]Sheet(1)'!$E:$M,9,0)"
'// 結果:ダイアログボックスが出てファイルの選択を促す
'// 指定したパスにファイルがない?

'.Range("FT2").Formula = "=VLOOKUP(E2,'C:\Users\abc3\OneDrive\ドキュメント\VBA 練習\VBA プログラム\ & "[" & FileName & "]" & Sheet(1)'!$E:$M,9,0)"
'// 結果:コンパイルエラー、修正候補、ステートメントの最後、[" & FileName & "]反転

End Sub

(みず) 2020/02/04(火) 23:55


半平太 様

ファイル名など実ファイルや検証用のファイルなど
混同してしまい、ややこしくなりました。

保存先変更や違いファイルでの検証しながらで一貫性が無いようになりましたが
ご容赦下さい。
(みず) 2020/02/05(水) 00:01


おしいです。 お試しください。

 '.Range("FT2").Formula = "=VLOOKUP(E2,'& Path & "[" & FileName & "]" & Sheet(1)'!$E:$M,9,0)"
                          "=VLOOKUP(E2,'" & Path & "[" & Filename & "]" & "Sheet(1)'!$E:$M,9,0)"

※ ブックの拡張子の表示が気になりますが。
(チオチモリン) 2020/02/05(水) 00:58


 >'.Range("FT2").Formula = "=VLOOKUP(strVlook)"

   ↓ 正

  .Range("FT2").Formula = "=VLOOKUP(" & strVlook & ")"

  なお、下の様にエラー処理も入れてしまえば、「#N/A 削除」に掛かるコードは不要化します。

  .Range("FT2").Formula = "=IFERROR(VLOOKUP(" & strVlook & "),"""")"

(半平太) 2020/02/05(水) 08:18


チオチモリン様
教えて頂いた式に変えると
思った通りの結果がでました。
ありがとうございました。

半平太様
エラー処理も教えて頂き有難うございました。
式も入れ替えましたら問題なく処理できました。

チオチモリン様
半平太様
式の””で囲むという部分を理解して応用できる様頑張ります。

有難うございました。

(みず) 2020/02/05(水) 10:09


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.