No.1
- 回答日時:
こんにちは!
何とか関数で!とやりかけてみましたが結構面倒そうなので、
手っ取り早くお望みでないVBAでの一例です。
元データのSheet名が「仕入表」、表示させたいSheet名が「在庫表」となっていて
配置は↓の画像のようになっているとします。
Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト → Excel画面に戻り(VBE画面を閉じて)マクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)
Sub Sample1() '//この行から
Dim i As Long, j As Long, cnt As Long, lastRow As Long
Dim c As Range, r As Range, wS As Worksheet
Set wS = Worksheets("仕入表")
With Worksheets("在庫表")
lastRow = .Cells(Rows.Count, "C").End(xlUp).Row
If lastRow > 1 Then
Range(.Cells(2, "A"), .Cells(lastRow, "D")).ClearContents
End If
cnt = 1
For i = 3 To wS.Cells(Rows.Count, "A").End(xlUp).Row
For j = 3 To wS.Cells(i, Columns.Count).End(xlToLeft).Column Step 2
cnt = cnt + 1
Set c = .Range("A:A").Find(what:=wS.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
.Cells(cnt, "A") = wS.Cells(i, "A")
End If
Set r = .Range("B:B").Find(what:=wS.Cells(i, "B"), LookIn:=xlValues, lookat:=xlWhole)
If r Is Nothing Then
.Cells(cnt, "B") = wS.Cells(i, "B")
End If
.Cells(cnt, "C") = wS.Cells(i, j)
.Cells(cnt, "D") = wS.Cells(i, j + 1)
Next j
Next i
End With
End Sub '//この行まで
※ 関数でないのでデータ変更があるたびにマクロを実行する必要があります。
一つ気になるのが、「在庫表」というコトですので
元々在庫があるものも仕入れることがあるはずです。
その場合は「在庫数」+「仕入数」と考えるのが普通だと思いますが
その辺は考慮していません。m(_ _)m
No.2
- 回答日時:
No.1です。
補足に色々書いてありますが、おそらくVBAで可能だと思います。
ただ、具体的にどんな配置でどんなデータが入っているのか判らないので
今すぐに的確なアドバイスはできません。
VBAの場合(関数でも同様ですが)1列・1行違っただけで全く意図しない動きになってしまいます。
少しのサンプルでも判れば少しはお役に立てると思います。
>コードもA~E行にわかれて入力し・・・
>コードはA143-C118S1Sのような形です。
云々とありますが、知りたいのはどのようなデータがどんな配置になっているか?
というコトです。
直接の回答ではありませんが、
まずはこの程度でごめんなさい。m(_ _)m
No.3
- 回答日時:
続けてお邪魔します。
>ちなみに在庫表は隣のタブでないとVBAは無理ですか
コード内にSheet名を指定していますので、「仕入表」Sheetも「在庫表」SheetもSheet見出しのどの位置にあっても構いません。
>コードはA143-C118S1Sのような形です。
とありますが、ハイフンまでがひとまとまりのコードという意味ではないですよね?
コード全体が一つのまとまりとすると、前回のコードに少し手を加えるだけで大丈夫です。
↓のコードに変更してマクロを実行してみてください。
(操作方法はNo.1で書いた通りです)
Sub Sample2() '//この行から
Dim i As Long, j As Long, cnt As Long, lastRow As Long
Dim c As Range, r As Range, wS As Worksheet
Set wS = Worksheets("仕入表")
With Worksheets("在庫表")
lastRow = .Cells(Rows.Count, "C").End(xlUp).Row
If lastRow > 1 Then
Range(.Cells(2, "A"), .Cells(lastRow, "D")).ClearContents
End If
cnt = 1
For i = 3 To wS.Cells(Rows.Count, "A").End(xlUp).Row '//「仕入表」Sheetの3行目~A列最終行まで
For j = 4 To wS.Cells(i, Columns.Count).End(xlToLeft).Column Step 2 '//D列~i行最終列まで2行毎★
If wS.Cells(i, j) <> 0 Then '//画像で「0」が表示されているので「0」以外を追加★
cnt = cnt + 1
Set c = .Range("A:A").Find(what:=wS.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
.Cells(cnt, "A") = wS.Cells(i, "A")
End If
Set r = .Range("B:B").Find(what:=wS.Cells(i, "B"), LookIn:=xlValues, lookat:=xlWhole)
If r Is Nothing Then
.Cells(cnt, "B") = wS.Cells(i, "B")
End If
.Cells(cnt, "C") = wS.Cells(i, j)
.Cells(cnt, "D") = wS.Cells(i, j + 1)
End If '//★
Next j
Next i
End With
End Sub '//この行まで
※ 変更部分に「★」のマークを入れています。
こんなんではどうでしょうか?m(_ _)m
No.4
- 回答日時:
Excel の使い方がいろいろ違います。
添付図の数式は次のとおり。Sheet2
I4 =vlookup($H4,sheet1!$A:$D,2,)
J4 =vlookup($H4,sheet1!$A:$D,3,)
K4 =vlookup($H4,sheet1!$A:$D,4,)
Sheet3
P4 =index(sheet1!b:b,match(o4,sheet1!$D:$D,))
R4 =sumifs(sheet2!$L:$L,sheet2!$G:$G,$O$1,sheet2!$I:$I,$P4,sheet2!$J:$J,q4)
ゼロを見せたくない場合は、セルの書式「#,##0;;」などでゼロのみ非表示にしてください。
質問文にある「在庫表」が欲しい場合は、Sheet2 から、「ピボットテーブル」の機能により類似の書式の表を作ってください。
それでも満足できない場合は、No.1 さんのように VBA で力ずくで処理するため、時間をかけてコードを書かざるを得ません。Word のような使い方をしていると、独特な表の書式に合わせるのがたいへんで、コードを書くのも苦労します。
No.5
- 回答日時:
No.1~3です。
補足の
>(下代含め)
を見逃していました。
「在庫表」Sheetに「下代」も表示させたい!という意味でしょうか?
そうであれば表示させたい列が判れば、少し手を加えれば対応できます。m(_ _)m
No.6
- 回答日時:
続けてお邪魔します。
>在庫表のC列に下代を入れたいです
と
>在庫表に転記された商品名は全て入力することは可能ですか
というコトですので・・・
これならもっと簡単なコードで済みます。
↓の画像のように左側が「仕入表」Sheet・右側が「在庫表」Sheetとします。
今までのコードはすべて消去し、↓のコードに変更してみてください。
Sub Sample3() '//この行から
Dim i As Long, j As Long, cnt As Long, lastRow As Long, wS As Worksheet
Set wS = Worksheets("仕入表")
With Worksheets("在庫表")
lastRow = .Cells(Rows.Count, "B").End(xlUp).Row
If lastRow > 1 Then
Range(.Cells(2, "A"), .Cells(lastRow, "D")).ClearContents
End If
cnt = 1
For i = 3 To wS.Cells(Rows.Count, "A").End(xlUp).Row '//「仕入表」Sheetの3行目~A列最終行まで
For j = 4 To wS.Cells(i, Columns.Count).End(xlToLeft).Column Step 2 '//D列~i行最終列まで2行毎★
If wS.Cells(i, j) <> 0 Then '//画像で「0」が表示されているので「0」以外を追加★
cnt = cnt + 1
If j = 4 Then
.Cells(cnt, "A") = wS.Cells(i, "A")
End If
.Cells(cnt, "B") = wS.Cells(i, "B")
.Cells(cnt, "C") = wS.Cells(i, "C")
.Cells(cnt, "D") = wS.Cells(i, j)
.Cells(cnt, "E") = wS.Cells(i, j + 1)
End If '//★
Next j
Next i
End With
End Sub '//この行まで
これではどうでしょうか?m(_ _)m
No.7ベストアンサー
- 回答日時:
>在庫表のA列B列C列を空白(こちらで手入力用)、D列に日付を追加したいのです・・・
↓のような配置になっているという前提です。
① 「仕入表」SheetのA列はシリアル値ですべての行に日付が入っている
② 「在庫表」SheetのA~C列には手を付けない
③ 「在庫表」SheetのD列(日付列)は「仕入表」Sheetの1行分だけの日付しか表示させない。
Sub Sample4() '//この行から
Dim i As Long, j As Long, cnt As Long, lastRow As Long, wS As Worksheet
Set wS = Worksheets("仕入表")
With Worksheets("在庫表")
'//E列で「在庫表」Sheetの最終行取得★
lastRow = .Cells(Rows.Count, "E").End(xlUp).Row
'//「在庫表」SheetにデータがあればD列2行目~I列最終行データを一旦消去
If lastRow > 1 Then
Range(.Cells(2, "D"), .Cells(lastRow, "I")).ClearContents
End If
cnt = 1
For i = 3 To wS.Cells(Rows.Count, "A").End(xlUp).Row '//「仕入表」Sheetの3行目~A列最終行まで
For j = 5 To wS.Cells(i, Columns.Count).End(xlToLeft).Column Step 2 '//E列~i行最終列まで2行毎★
If wS.Cells(i, j) <> 0 Then '//画像で「0」が表示されているので「0」以外を追加★
cnt = cnt + 1
'//最初のデータ行のみ「仕入表」Sheetの日付をD列に表示★
If j = 5 Then
.Cells(cnt, "D") = wS.Cells(i, "A")
End If
.Cells(cnt, "E") = wS.Cells(i, "B") '//B列に「コード」を表示
.Cells(cnt, "F") = wS.Cells(i, "C") '//F列に「商品名」を表示
.Cells(cnt, "G") = wS.Cells(i, "D") '//G列に「下代」を表示
.Cells(cnt, "H") = wS.Cells(i, j) '//H列に「色」を表示
.Cells(cnt, "I") = wS.Cells(i, j + 1) '//I列に「数」を表示
End If
Next j
Next i
'//最後にD列の表示形式(日付)を「在庫表」SheetのA3セルの書式に設定★
.Range("D:D").NumberFormatLocal = wS.Range("A3").NumberFormatLocal
End With
End Sub '//この行まで
※ 「日付」もすべての行に表示したい場合は、コード内の
> If j = 5 Then
>.Cells(cnt, "D") = wS.Cells(i, "A")
>End If
の3行を
>.Cells(cnt, "D") = wS.Cells(i, "A")
の1行だけに変更してください。
今度はどうでしょうか?m(_ _)m
本当にありがとうございました!!完璧な在庫表ができ、大大満足です!自分だけでやってたら一生終わらなかったと思います。わかりづらくコロコロ変わる質問にご丁寧にお答え下さり感謝の気持ちでいっぱいです!こんな凄いこと出来たら会社のエクセルいじりまくっちゃいそうです。
本当にありがとうございました。また何かありましたらよろしくお願いします。
No.8
- 回答日時:
何度もごめんなさい。
前回のコードのコメントで間違いがありました。
(コードそのものは問題ないと思います)
>'//B列に「コード」を表示
は
>E列に・・・
が正解です。m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) Excelで総数量を変動させたい 2 2022/11/04 23:49
- その他(Microsoft Office) Excelで該当しない項目(#N/Aの商品名)を簡単に表示・抽出させる方法についてです 1 2022/08/25 22:12
- Excel(エクセル) Excel 関数 vlookupなどの使い方について質問です。 シート1に品番、商品名、単価、発注条 6 2022/06/15 19:16
- Excel(エクセル) excelで検索した商品の画像(ネットワーク上の)を表示させたい。 3 2023/06/28 00:32
- Excel(エクセル) 【条件付き書式】countifsで複数条件を満たしたセルを赤くする方法 2 2023/02/09 23:53
- Visual Basic(VBA) 【VBA】複数行あるカンマ区切りのデータを全て縦に一列に並べたい 5 2022/04/13 17:03
- Excel(エクセル) エクセル count関数で出てきた数だけの行数をリンクで参照する 3 2022/08/10 12:02
- Visual Basic(VBA) VBAでのループ順序について 3 2023/03/13 10:55
- Visual Basic(VBA) EXCEL関数LOOKUPとFILTERについての質問です 1 2022/12/21 05:53
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでの作業計算方法について
-
はがきについて。
-
エクセル 文字を増やしたい。
-
セルの内容表示が邪魔になる
-
Microsoft365に変えたのですが...
-
エクセルの計算
-
Microsoft1Officeの互換ソフト...
-
【マクロ】その時、その時で変...
-
【マクロ】読取専用のファイル...
-
エクセル初心者です 関数の入れ...
-
Excel ピボットテーブルで日付...
-
【関数】適切な文字数の数字を...
-
LOOKUP関数を使えばいいのでし...
-
Aというブックの1というシート...
-
エクセル関数を教えてください
-
Excelのチェックボックスの使い...
-
エクセル 白黒印刷で白線を印刷...
-
時間によってファイル名が変わ...
-
WPS OFFICEでの縦書きについて
-
エクセルの条件付き書式につい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
[関数得意な方]教えて下さい・...
-
Excelにてある膨大なデータを管...
-
[関数について]わかる方教えて...
-
Excel初心者です。 詳しい方、...
-
excelの不要な行の削除ができな...
-
エクセル関数に詳しい方教えて...
-
INDIRECTを使わず excelで複数...
-
[オートフィルタ]で抽出された...
-
エクセルの神よ、ご回答を! エ...
-
エクセル関数に詳しい方、教え...
-
各ページの1番上の表示について
-
Excelで写真のような表を作った...
-
エクセルで不等号記号(≠)が上に...
-
数学 Tan(θ)-1/Cos(θ)について...
-
Excel 2019 は、SPILL機能があ...
-
Excelで全角を半角にしたいので...
-
条件付き書式を教えてください
-
Excel フィルターを掛けた状態...
-
[オートフィルタ]の適用範囲の...
おすすめ情報
ありがとうございます!VBAは全くの素人なのですが、もしこれで出来たら嬉しいです。
わざわざ作って頂きありがとうございます。
ただ、こちらの例は分かりやすいように作成したもので実際の仕入表はもっと複雑になります。
コードもA~E行にわかれて入力し(途中計算式も入ってます)別シートに最終的なコードがのる形になってます。コードはA143-C118S1Sのような形です。
別シートに集計されているコード、商品名、色、入荷数は全て数値データです。
商品コード~入荷数の間に金額が入っていたり、日付が入っています。
そのような状態でVBAはできますでしょうか?
早速有り難うございます。
具体的に書かないとできるものも出来ないですね。申し訳ございません。
仕入表、最終的な形がこちらになります。これを在庫表に転記させたいです。(下代含め)
色は最大10色あります。
ちなみに在庫表は隣のタブでないとVBAは無理ですか?元々は別のシートで、もし無理なら隣のタブに在庫表を置く形でも構いません。
また、最初のご回答でリピート商品は考慮されてないとおっしゃってましたが、こちらはリピート対応は可能でしょうか??
おふたりともありがとうございます。わざわざ時間を割いて考えて下さりありがとうございます。
今回はVBAで試してみたいと思います。0を非表示にする方法を教えて下さりありがとうございました!試してみますね。
VBAの補足ですが、画像のようにエラー表示が出ます。この意味はなんでしょうか。。。
度々ありがとうございます。在庫表のC列に下代を入れたいです。よろしくお願いします。
すみません!!大事なことを伝え忘れてしまいました。在庫表に転記された商品名は全て入力することは可能ですか?鉛筆の赤、黄色、青があれば全ての行の商品名に鉛筆を入力させるという感じです。
何度も申し訳ございません。データの数が膨大なのですが何行まで自動転記可能ですか?
またエラー表示がでたものの、転記されてました!!!ただ途中でコード、商品名はなく前のコードの色と今回のコードの色が交互に出てきました。
ありがとうございました!!
出来ました!!
ご丁寧に説明とともにコードも書いていただき感謝です!これで業務が今の3分の1になりそうです!
最後のお願いと質問なのですが、早速マクロを実行して気付いたのですが、コードを検索かけるときにコードが全部入ってないと検索が厳しそうです(最初にわかることですね。。。)申し訳ございませんがコードも全部表示させるようにしていただくことは可能ですか??
また、在庫表のA列B列C列を空白(こちらで手入力用)、D列に日付を追加したいのです・・・。なのでE列からコードが始まる感じです。本当に申し訳ございません。ちなみにD列の日付はマクロで入力させることは出来ますか?仕入表のA列に日付が入ってるものとします。お忙しいところ申し訳ございませんが教えて頂けると嬉しいです。