🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

2回答

244閲覧

エクセルから対象を検索して値を設定

underworld

総合スコア4

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/09/19 00:32

①テキストファイルを読み込み
②テキストファイルの項目を分割(日付,商品コード,商品名,数量,単位)

※テキストファイル中身(商品コード順不同)
20190831,00001,商品-A,100,100
20190831,00003,商品-C,20,300
20190831,00002,商品-B,15,200
20190831,00006,商品-E,30,600
20190831,00010,商品-I,1,1000
20190831,00001,商品-A,1,100
20190831,00020,商品-X,10,2000

③②で分割した項目の各列を取得&配列に格納

④③を別のプロシージャに渡す

⑤②で分割した項目の商品コードを、エクセルファイルで検索

※エクセルファイル
商品コード 商品名 数量 単価 合計
00001 商品-A 0 \100 \0
00002 商品-B 0 \200 \0
00003 商品-C 0 \300 \0
00004 商品-D 0 \400 \0
00005 商品-E 0 \500 \0
00006 商品-E 0 \600 \0
00007 商品-F 0 \700 \0
00008 商品-G 0 \800 \0
00009 商品-H 0 \900 \0
00010 商品-I 0 \1,000 \0

⑥商品コードが一致した場合は、対象行の数量に値を設定

⑦商品コードが一致しない場合は、エクセルの最終行に各項目の値を設定(商品コード,商品名,数量,単価)

■問題点
⑥で対象の商品コードで検索して一致した際に思っている動きになりません。
例えば、商品コード「00001」で検索した際は、数量の「100」が
C2に入ってくれるのですが、
商品コード「0000X」(00001以外)で検索した際は数量の値が対象のCXセルではなくC2に値が入ってしまいます。

VBA

1Function 売上ファイル処理(ByVal p売上ファイル As String, ByVal p新規シート As Worksheet) As Boolean 2 3 Dim 売上ファイル As String 4 Dim 新規シート As Worksheet 5 Dim レコード As String 6 Dim 商品コード As String 7 Dim 商品名 As String 8 Dim 数量 As Long 9 Dim 単価 As Long 10 11 '①テキストファイルを読み込み 12 Open p売上ファイル For Input As #1 13 14 Dim aryRec As Variant 15 16 Do Until EOF(1) 17 Line Input #1, レコード 18 MsgBox レコード 19 20 '②テキストファイルの項目を分割(日付,商品コード,商品名,数量,単位) 21 '③②で分割した項目の各列を取得&配列に格納 22 aryRec = Split(レコード, ",") 23 24 MsgBox "日付:" & aryRec(0) 25 26 MsgBox "商品コード:" & aryRec(1) 27 商品コード = aryRec(1) 28 29 MsgBox "商品名:" & aryRec(2) 30 商品名 = aryRec(2) 31 32 MsgBox "数量:" & aryRec(3) 33 数量 = aryRec(3) 34 35 MsgBox "単位:" & aryRec(4) 36 単価 = aryRec(4) 37 38 '④③を別のプロシージャに渡す 39 Call 売上設定処理(p新規シート, 商品コード, 商品名, 数量, 単価) 40 41 Loop 42 Close #1 43 44 45Function 売上設定処理(ByRef p新規シート As Worksheet, ByVal p商品コード As String, ByVal p商品名 As 46String, ByVal p数量 As Long, ByVal p単価 As Long) 47 48 49 Dim i As Integer 50 Dim myRange As Range 51 Dim myObj As Variant 52 53 i = 1 54 Set myRange = p新規シート.Range("A" & i) 55 56 If myRange Is Nothing Then 57 MsgBox "みつかりませんでした。" 58 '⑦未実施 59 Else 60 Set myObj = myRange.Find(p商品コード) 61 '⑥商品コードが一致した場合は、対象行の数量に値を設定 62 i = i + 1 63 p新規シート.Range("C" & i) = p数量 64 65 66 End If 67 68End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんな感じの処理になるのではと思いますがどうでしょうか。

VBA

1Function 売上設定処理(ByRef p新規シート As Worksheet, ByVal p商品コード As String, ByVal p商品名 As String, ByVal p数量 As Long, ByVal p単価 As Long) 2 3 Dim myObj As Variant 4 5 Set myObj = p新規シート.Range("A:A").Find(p商品コード) 6 If Not myObj Is Nothing Then 7 p新規シート.Range("C" & myObj.Row) = p数量 8 End If 9 10End Function 11

投稿2019/09/19 01:07

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

underworld

2019/09/19 07:53

回答ありがとうございます。 回答いただいたものを参考にしてElseの場合の⑦の処理を下記の記述で最終行に追加することができました。 また、聞き方が悪かったので申し訳ありませんが、 『⑥商品コードが一致した場合は、対象行の数量に値を設定』は元々入っている数字の0に足していく処理が正しかったです。 例えば商品コード00001が複数いた場合は、最後に検索した商品コードの数量を入れるのではなく、どんどん数量を足していくようなイメージです。 ```VBA(抜粋) Set myObj2 = p新規シート.Range("A1").End(xlDown) Set myObj3 = p新規シート.Range("B1").End(xlDown) Set myObj4 = p新規シート.Range("C1").End(xlDown) Set myObj5 = p新規シート.Range("D1").End(xlDown) Else p新規シート.Range("A" & myObj2.Row + 1) = p商品コード p新規シート.Range("B" & myObj3.Row + 1) = p商品名 p新規シート.Range("C" & myObj4.Row + 1) = p数量 p新規シート.Range("D" & myObj5.Row + 1) = p単価 ```
ttyp03

2019/09/19 08:00

足しこんでいくのであればこんな感じでしょう。 p新規シート.Range("C" & myObj.Row) = p新規シート.Range("C" & myObj.Row) + p数量
guest

0

i = 1 Set myRange = p新規シート.Range("A" & i)

↑とりあえずA1セルが入る

If myRange Is Nothing Then
MsgBox "みつかりませんでした。"

↑必ずA1セルが入るからNothingにはならない。

'⑦未実施
Else
Set myObj = myRange.Find(p商品コード)
'⑥商品コードが一致した場合は、対象行の数量に値を設定
i = i + 1
p新規シート.Range("C" & i) = p数量

↑検索結果に関わらず、変数「i」には1+1の結果が入る

ように見えます。

な~んか難しく考えすぎなような気がします。。。

1)テキストファイルをエクセルで開く
2)当初から開いているブック(マクロのあるブックの)、
各シートのA1の値のあるデータを新しく開いたファイルから抽出して、
各シートに記入する

ということをしたらいいと思いますが。。。

投稿2019/09/19 01:06

編集2019/09/19 01:09
mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問