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
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.5
- 回答日時:
No.1~3です。
補足の
>(下代含め)
を見逃していました。
「在庫表」Sheetに「下代」も表示させたい!という意味でしょうか?
そうであれば表示させたい列が判れば、少し手を加えれば対応できます。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.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.2
- 回答日時:
No.1です。
補足に色々書いてありますが、おそらくVBAで可能だと思います。
ただ、具体的にどんな配置でどんなデータが入っているのか判らないので
今すぐに的確なアドバイスはできません。
VBAの場合(関数でも同様ですが)1列・1行違っただけで全く意図しない動きになってしまいます。
少しのサンプルでも判れば少しはお役に立てると思います。
>コードもA~E行にわかれて入力し・・・
>コードはA143-C118S1Sのような形です。
云々とありますが、知りたいのはどのようなデータがどんな配置になっているか?
というコトです。
直接の回答ではありませんが、
まずはこの程度でごめんなさい。m(_ _)m
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
今まで文字化けなく開けていたc...
-
スプレッドシートで指定された...
-
ExcelでASCを使って全角を半角...
-
マクロの処理が遅くなった
-
Excel関数について教えてくださ...
-
作成した数式を値として表示し...
-
エクセルの質問です。 F列からL...
-
エクセルでファイルの最終更新...
-
EXCELの散布図で日付が1900年に...
-
【マクロ】VLOOKUPにて参照元に...
-
エクセルのセル内に分数などの...
-
Excelの警告について
-
Microsoft 365Excelの見開きペ...
-
Excel関数について教えてくださ...
-
シートの情報を別のシートへま...
-
Excelマクロで空白セルを詰めて...
-
【マクロ】フォルダ内にあるPDF...
-
index関数の説明をお願いします。
-
重複しない値を取り出したい
-
エクセルの数式バーのフォント...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelの警告について
-
Excelで数値を時間数に変換する...
-
エクセルの数式バーのフォント...
-
エクセルで数字の組み合わせを...
-
エクセルを使用して、円周率を...
-
Excelで特定の文字列が含まれて...
-
Excel 対象のセルに入力が無い...
-
任意の値が存在する行に名前を...
-
エクセルでファイルの最終更新...
-
index関数の説明をお願いします。
-
条件付き書式でやりたいのですが
-
重複しない値を取り出したい
-
【ExcelVBA】UTF-8(BOM無)でC...
-
【マクロ】マクロが割当てされ...
-
エクセル IF計算式?でしょうか?
-
エクセルで曜日を入れたい
-
表中の指定した条件の文字列を...
-
【Excel】版が同じ事を示す番号...
-
EXCELの散布図で日付が1900年に...
-
Excelについて。Excelに縦1列に...
おすすめ情報
ありがとうございます!VBAは全くの素人なのですが、もしこれで出来たら嬉しいです。
わざわざ作って頂きありがとうございます。
ただ、こちらの例は分かりやすいように作成したもので実際の仕入表はもっと複雑になります。
コードもA~E行にわかれて入力し(途中計算式も入ってます)別シートに最終的なコードがのる形になってます。コードはA143-C118S1Sのような形です。
別シートに集計されているコード、商品名、色、入荷数は全て数値データです。
商品コード~入荷数の間に金額が入っていたり、日付が入っています。
そのような状態でVBAはできますでしょうか?
早速有り難うございます。
具体的に書かないとできるものも出来ないですね。申し訳ございません。
仕入表、最終的な形がこちらになります。これを在庫表に転記させたいです。(下代含め)
色は最大10色あります。
ちなみに在庫表は隣のタブでないとVBAは無理ですか?元々は別のシートで、もし無理なら隣のタブに在庫表を置く形でも構いません。
また、最初のご回答でリピート商品は考慮されてないとおっしゃってましたが、こちらはリピート対応は可能でしょうか??
おふたりともありがとうございます。わざわざ時間を割いて考えて下さりありがとうございます。
今回はVBAで試してみたいと思います。0を非表示にする方法を教えて下さりありがとうございました!試してみますね。
VBAの補足ですが、画像のようにエラー表示が出ます。この意味はなんでしょうか。。。
度々ありがとうございます。在庫表のC列に下代を入れたいです。よろしくお願いします。
すみません!!大事なことを伝え忘れてしまいました。在庫表に転記された商品名は全て入力することは可能ですか?鉛筆の赤、黄色、青があれば全ての行の商品名に鉛筆を入力させるという感じです。
何度も申し訳ございません。データの数が膨大なのですが何行まで自動転記可能ですか?
またエラー表示がでたものの、転記されてました!!!ただ途中でコード、商品名はなく前のコードの色と今回のコードの色が交互に出てきました。
ありがとうございました!!
出来ました!!
ご丁寧に説明とともにコードも書いていただき感謝です!これで業務が今の3分の1になりそうです!
最後のお願いと質問なのですが、早速マクロを実行して気付いたのですが、コードを検索かけるときにコードが全部入ってないと検索が厳しそうです(最初にわかることですね。。。)申し訳ございませんがコードも全部表示させるようにしていただくことは可能ですか??
また、在庫表のA列B列C列を空白(こちらで手入力用)、D列に日付を追加したいのです・・・。なのでE列からコードが始まる感じです。本当に申し訳ございません。ちなみにD列の日付はマクロで入力させることは出来ますか?仕入表のA列に日付が入ってるものとします。お忙しいところ申し訳ございませんが教えて頂けると嬉しいです。