アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルVBAについてです。
画像右側のCVSファイルのM列の回答納期を、左側ExcelファイルのK列に転記させたいです。
条件があり、エクセルファイル側のJ列の注文番号とCSVファイルのD列の注文番号がマッチした場合にのみ転記させたいです。
マクロの起動方法ですが、Excelファイルにマクロ起動ボタンをつくり、指定のCVSファイルを選択後転記させるという感じです。
現在は、ファイルを見比べながら手打ちで入力しています。
時間がかかるのと、入力ミスが多発するので、どなたか知恵を貸して頂きたいです。
よろしくお願いします。

「エクセルVBA」の質問画像

A 回答 (4件)

No2です。


補足ありがとうございました。
以下のマクロを標準モジュールに登録してください。

Option Explicit
Public Sub 回答納期転記()
Dim myFile As Variant
Dim ans As Integer
Dim dicT As Object
Dim wb As Workbook
Dim ws As Worksheet
Dim ms As Worksheet
Dim maxrow1 As Long
Dim maxrow2 As Long
Dim row1 As Long
Dim row2 As Long
Dim key As String
Set ms = Worksheets("データリスト")
myFile = Application.GetOpenFilename("CSVファイル(*.csv),*.csv")
If myFile = False Then Exit Sub
Set wb = Workbooks.Open(myFile)
ans = MsgBox(myFile & "を読み込みました。" & vbLf & "このファイルを処理しますか", vbOKCancel)
If ans <> vbOK Then Exit Sub
Set ws = wb.Worksheets(1)
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
maxrow1 = ws.Cells(Rows.count, "D").End(xlUp).Row 'D列の最大行取得
maxrow2 = ms.Cells(Rows.count, "J").End(xlUp).Row 'J列の最大行取得
For row1 = 2 To maxrow1
key = ws.Cells(row1, "D").Value
dicT(key) = ws.Cells(row1, "M").Value
Next
For row2 = 2 To maxrow2
key = ms.Cells(row2, "J").Value
If dicT.exists(key) = True Then
ms.Cells(row2, "K").Value = dicT(key)
Else
ms.Cells(row2, "K").Value = ""
End If
Next
wb.Close
MsgBox ("完了")
End Sub
    • good
    • 0
この回答へのお礼

すみません。
こちらの勘違いでした。
親切にありがとうございました。
感謝します。

お礼日時:2022/05/15 01:28

No3です。


ボタンでマクロを起動する方法については、下記URLを参考にしてください。
https://www.239-programing.com/excel-vba/basic/b …
まずは、マクロを直接起動して、正しく動作することを確認してください。
そのあとで、ボタンクリックでマクロを起動するようにすれば良いかと。
不明点があれば、補足してください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
思う通りにできました。
1点だけ補足させて下さい。
こちらは連絡していなかったこちらのミスなのですが、エクセルファイルの方の注文番号は入っていない場合があります。理由としては注文番号は、エクセルファイルに最近付け加えたからです。ご提示頂いたコードだと注文番号が入っていない場合でも、CSVの方に回答納期があれば日付けが入力されてしまいます。この場合は空白になるようにしたいです。
ちなみにCSVの方は必ず注文番号は入っています。
よろしくお願いします。

お礼日時:2022/05/15 00:01

補足要求です。


1.左側の図のExcelのシート名は何でしょうか。
2.CSVファイルのファイル名の拡張子は、.CSVで間違いないでしょうか。
3.J列の注文番号が、CSVファイルのD列に存在しない場合、
K列の回答納期は、何を設定すれば良いのでしょうか。
1案:なにも設定しない。
2案:空白
3案:「該当なし」などのエラーを表現する文字
が考えられます。

通常、上記のケースが発生しないのであれば、2案又は3案が妥当かと思います。
運用上、CSVファイルには一部の注文番号のみが記載されていて、それを日々、Excelのシートに取り込むのであれば、1案になるかと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
以下、回答します。

1.エクセルのシート名 データリスト
2.CSVの拡張子 .CSV
3.2案の空白
よろしくお願いします。

お礼日時:2022/05/14 10:26

こんにちは



>エクセルVBAについてです
というご質問ですが、ご質問文の雰囲気からして、質問者様は作成したり修正したりできそうにはないように感じましたので・・・
仮に、どなたかが作成してくださったとしても、何かあった際に何の修正も変更もできなくて、お手上げ状態になることが目に見えています。

以下は、ご希望のVBAではありませんが、
>ファイルを見比べながら手打ちで入力しています。
>時間がかかるのと、入力ミスが多発するので、どなたか知恵を貸して頂きたいです。
に対してなら、多少なりとも効果がありそうな方法です。

0)予め、エクセルブックにデータ用のシートを用意しておきます。
 (仮に、「データシート」というシート名とします)
1)CSVファイルはエクセルで開けるようですので、一旦、エクセルで開きます。
2)上記のシート全体をコピーし(Ctrl+A, Ctrl+C)、データシートにペーストします。
3)ご提示のエクセルのK2セルに、
  =IFERROR(VLOOKUP(J2,データシート!D:M,10,0),"")
 を入力し、右下のフィルハンドルをダブルクリックします。
 (これで、式が下までフィルコピーされます)
4)K列全体を選択して、「コピー」-「値をペースト」で式を値に変換します。

※ 3)までで目的の表示はできているはずですが、データシートと連動してしまっているので、4)の操作をすることで、値として固定できます。


どうしても、VBA化したいのであれば、上記の3~4( 2~でも良いですが )の操作を「マクロの記録」を利用して記録することで、再利用が可能なマクロを得られるものと思います。
記録の際のコツとしては、無駄な操作を一切行わないということでしょうか。

ご参考にでもなれば。
    • good
    • 2

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