品名を変える表で在庫数を計算する方法

このQ&Aのポイント
  • CSVファイルには品名、数量などのデータが入っています。エクセルで開き、品名と日付の優先順位で昇順に並べ替えます。品名が変わるときに空白行を挿入します。
  • A列の値が2の場合、D列の値を切り取り、E列に貼り付けます。これにより入荷数と出荷数を表現します。
  • F列の全ての行に、D列とE列の結果から計算した残数を入れたいです。ただし、D列とE列が空白の行は計算しないようにします。
回答を見る
  • ベストアンサー

品名が変わる所で空白行がある表で在庫数を品名単位で計算したい

品名が変わる所で空白行がある表で在庫数を品名単位で計算したい 1.CSVファイルがあります。   (データはでたらめに入っています。)画像(1)   A列→半角の1か2   B列→日付   C列→品名   D列→数量 2.これをエクセルで開いて   C列、B列の優先順位で昇順で並べ替えます。画像(2) 3.C列の値が変わった所で空白行を入れます。画像(2)   (品名単位で区分けされました。) 4.A列の値が2の場合D列の値を切取りE列に貼付けます。   画像(3)   D列が(入)   E列が(出)   になります  ここまでのマクロは完成しています。 5.F列の全ての行にD列、E列の結果から計算結果で出た残数を   入れたい。(D,E列が空白の行は不要)画像(4)   D列は上の行のF列の値に加算しその値をFへ   E列は上の行のF列の値から減算しその値をFへ   例:F3=F2+D3-E3    みかんはみかんだけで入出後の残数を、   りんごはりんごだけで入出後の残数を行ごとに入れたい。   かつ計算式は残したくない。 さらに、 CSVファイルは毎日行数が増え1週間で約50,000行になるので このマクロを使い画像3の状態にして毎週金曜日に保存してます。 元のCSVファイルは削除します。 翌週にはまた新たなCSVファイルに翌週のデータがたまります。 先週の分の品名単位の最終行だけをコピーして 翌週のCSVファイルを編集するさいに合流させ、 NO.2の並べ変えの時に品名単位で一番上の行に挿入したいです。 で同じようにNO.5を行いたいです。 画像(4)の場合6,9,14行目を翌週のCSVファイルに合流させる。 (合流だけできればNO.2の作業で品名単位で  必ず一番上になりますので抜取りと合流だけしたい) 品名は1週のファイル内で約5,000種類です。 よって50,0000行が編集で55,000行に増加し その中の5,000行は空白行(品名が変わるたびに挿入されている。) (1)NO.5の画像(3)から画像(4)にするマクロ(計算式の入れ方?)    (空白行には入れない) (2)完成したファイルの品名単位の最終行を抜き出し    次のファイルを作成する時に合流させるマクロ(画像(6)) を教えてください。 

  • gx9wx
  • お礼率95% (440/460)

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.42

おはよう、gx9wxさん。 昨夜はお座敷の時間が迫っていて説明できませんでしたが、TEST03とTEST02 の違いはもうおわかりですね? > G1→G2 > C1→C2 > にしたのですがERRになりました。 > 「書式が相違して貼付できません」 「書式」じゃなく、「コピー領域と張り付け領域の形が違うため」とでたんでしょ? 多分、素直でかわいいgx9wxさんは、ご丁寧に .Columns("G:G").Copy .Range("G1").PasteSpecial Paste:=xlPasteValues 'G列を値に変換 の部分まで、G2に直したんじゃないのかな? そうだとすれば、エラーの理由は簡単です。 コピーしたのがG列の全部(65536行)なのに、張り付け先はG2以降の65535行になっちゃうので「形が違うぞぉ!ヾ( ̄□ ̄; )ノ!」とエクセルに叱られわけです。 1行目が項目行なら、ここは数式じゃなく文字列ですよね? ならば、ここは .Columns("G:G").Copy .Range("G1").PasteSpecial Paste:=xlPasteValues のままで何の問題もなかったわけです。 以上、蛇足ですがご参考のため。

gx9wx
質問者

お礼

>Columns("G:G").Copy >.Range("G1").PasteSpecial Paste:=xlPasteValues 'G列を値に変換 >の部分まで、G2に直したんじゃないのかな? はい。そのとうりです。 記述にコメント入れておきました。 どうもありがとうございます。

その他の回答 (42)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.43

> ・データ元を別の値に変換してから転記できるならこっちも >  そうしてよ > と言われてしまいました。 さすがにこれだけじゃ何がしたいのかぜんぜんわかりませ~ん。 さて、今夜もお座敷が待っているのです。 では、さらばガンダム少年。

gx9wx
質問者

お礼

すいません。 文章が下手で誤解を与えました。 > ・データ元を別の値に変換してから転記できるならこっちも >  そうしてよ > と言われてしまいました。 今回、教えていただいた Sub 名前変換03 を別スレッドで教えてもらったマクロに流用する事になったいきさつを 説明しました。 よって Sub TEST03 で達成できましたので、そちらも完成です。 どうもありがとうございました。

gx9wx
質問者

補足

どれをベストアンサーにしたらいいのか分かりません。 全てベストアンサーなので、 一番最後をベストアンサーにします。 本当は、もう一個質問を補足で追加して、 回答をもらえばこのカテゴリ内の 「回答の件数が多いスレッド」1位の44件に並ぶのですが.... でもそんなのは目的ではないので。 別スレッドで質問します。 いろいろとありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.41

おや、2行目からでしたか。 では、 Sub TEST03()   With Sheets("Sheet2")     .Columns("G:G").NumberFormatLocal = "G/標準" 'G列の書式を標準に     .Range("G2").Formula = _     "=IF(ISNA(VLOOKUP(C2,Sheet3!$A:$B,2,FALSE)),""不明"",VLOOKUP(C2,Sheet3!$A:$B,2,FALSE))" '数式入力     .Range("G2").Copy .Range("G2:G" & .Range("C" & .Rows.Count).End(xlUp).Row) 'データ最終行までコピー     .Columns("G:G").Copy     .Range("G1").PasteSpecial Paste:=xlPasteValues 'G列を値に変換     Application.CutCopyMode = False   End With End Sub それでは、夜の町へ今夜もご出勤! 行ってまいります。

gx9wx
質問者

お礼

もうベストアンサーを登録して締めようとした時に このスレッドの前の教えていただいた完成したマクロの変更依頼が来ました。 あのマクロは、教えていただいた後に、メンテを考慮して 自分で修正しmerlionXXさんに見てもらって(たしかお酒がはいっていた時(^_^.)) 「大丈夫ですよ」と言われて、その後順調でした。 転記元の対象部分が変わっても、転記先が変わっても 対応できるようにしておいたのですが、 今回このスレッドで名前変換を使った物ですから それを見て、 ・データ元を別の値に変換してから転記できるならこっちも  そうしてよ と言われてしまいました。 今度こそ、自分だけでと思いましたが駄目でした。(T_T) このスレッドを閉じていなくて良かったです。 Sub TEST03() は完璧でした。 ありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.40

> これだとやばくてHITしない場合は空白で行きたいです。 > もしくは「不明」という文字を転記(代入?)させる事は可能でしょうか? そうですか、ヤバいですか。 では、これでいかがでしょう? Sub TEST02()   With Sheets("Sheet2")     .Columns("G:G").NumberFormatLocal = "G/標準" 'G列の書式を標準に     .Range("G1").Formula = _     "=IF(ISNA(VLOOKUP(C1,Sheet3!$A:$B,2,FALSE)),""不明"",VLOOKUP(C1,Sheet3!$A:$B,2,FALSE))" '数式入力     .Range("G1").Copy .Range("G1:G" & .Range("C" & .Rows.Count).End(xlUp).Row) 'データ最終行までコピー     .Columns("G:G").Copy     .Range("G1").PasteSpecial Paste:=xlPasteValues 'G列を値に変換     Application.CutCopyMode = False   End With End Sub 空白にしたい場合は、""不明"" を """" にしてください。 > もしかして私のPCを覗いているのかなと思う時あります。 あはは、それが出来たらほんと回答が楽なんですけどねえ。 せめて画像だけではなく、ファイルもアップできればいいのですが・・・。

gx9wx
質問者

お礼

ありがとうございます。 Sub TEST 02 すでに報告済みですが データが2行目からの為 当たり前ですが G1に 「不明」が入ってしまいました。 もう Sub TEST03 をリリースしてくださいましたね。 すぐ試します。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.39

> シート2のC列の値を検索値としてシート3のA列をVLOOKUPで検索し > HITしたらシート3の該当行のB列の値をシート2のG列に転記し ヒットしないときはC列の値をそのまま表示でしたよね? ということは、ワークシート関数式でSheet2のG1セルなら =IF(ISNA(VLOOKUP(C1,Sheet3!$A:$B,2,FALSE)),C1,VLOOKUP(C1,Sheet3!$A:$B,2,FALSE)) という式が入ればいいのですね?(もちろん最後は式ではなく値に変換しますが) ならば前回と同じようにしたいなら Sub TEST01()   With Sheets("Sheet2")   .Columns("G:G").NumberFormatLocal = "G/標準" 'G列の書式を標準に   .Range("G1").Formula = _   "=IF(ISNA(VLOOKUP(C1,Sheet3!$A:$B,2,FALSE)),C1,VLOOKUP(C1,Sheet3!$A:$B,2,FALSE))" '数式入力   .Range("G1").Copy .Range("G1:G" & .Range("C" & .Rows.Count).End(xlUp).Row) 'データ最終行までコピー   .Columns("G:G").Copy 'G列を値に変換   .Range("G1").PasteSpecial Paste:=xlPasteValues   Application.CutCopyMode = False   End With End Sub > ファイル名を変更されてもメンテしなくていいように 同じBOOK内ですから、式の中にファイル名は存在しません。 だから名前を変えられても無関係です。 > それはmerlionXXさんと私にしかわかりませんのでm(__)m) ん?二人だけの秘密?(笑) それって、ファイル名変更に対応したということ? それとも何か別にありましたっけ?

gx9wx
質問者

お礼

ありがとうございます。 Sub TEST01()   With Sheets("Sheet2")   .Columns("G:G").NumberFormatLocal = "G/標準" 'G列の書式を標準に   .Range("G1").Formula = _   "=IF(ISNA(VLOOKUP(C1,Sheet3!$A:$B,2,FALSE)),C1,VLOOKUP(C1,Sheet3!$A:$B,2,FALSE))" '数式入力   .Range("G1").Copy .Range("G1:G" & .Range("C" & .Rows.Count).End(xlUp).Row) 'データ最終行までコピー   .Columns("G:G").Copy 'G列を値に変換   .Range("G1").PasteSpecial Paste:=xlPasteValues   Application.CutCopyMode = False   End With End Sub ですが、こちらは条件が違ってまして、 シーと2もシート3もデータが2行目からでした。 (これは基幹システムデータなのでマクロで編集したとかで  なっているわけではないのでデータ2行目からというのは  変更できません。) 1行名には項目が入っています。 よって G1→G2 C1→C2 にしたのですがERRになりました。 「書式が相違して貼付できません」 .Columns("G:G").Copy 'G列を値に変換 この部分はG列全部を選択ですから ここも修正が必要なのでしょうか? それとも G1→G2 C1→C2 は不要な行為なのでしょうか? 申し訳ありません。m(__)m

gx9wx
質問者

補足

すいません。 大事な事を書き忘れました。 流用版では、 >ヒットしないときはC列の値をそのまま表示でしたよね? こちらは、これだとやばくてHITしない場合は空白で行きたいです。 もしくは「不明」という文字を転記(代入?)させる事は可能でしょうか?   申し訳ないです。 >ん?二人だけの秘密?(笑) ここでかなりの質問をしています。 いろいろな考えの方がいらっしゃいます。 記述をコピペして、今回やりたい事を質問すると、 なぜこういう記述なのか? という質問がくるかもしれません。 それを説明しなくてはいけなくなるからです。 merlionXXさんは、私の誤記も説明不足も全て察知 (しかも正しい内容で→これ本当にびっくりしてます。  もしかして私のPCを覗いているのかなと思う時あります。) 初めての出会い。  QNo.6084303 の ANo.2 2010-08-17 09:07:32 次に初の複数回答 QNo.6145802 2010-08-30 10:43:15 エクセルのマクロ、Modulu、プロシージャ及び記録したマクロの名称 ANo.1 ANo.3 ANo.4 ANo.5 この時も凄く丁寧に説明してくださいましたよね。 あの頃はわからない事がわからい状態でしたので 凄く嬉しかったです。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.38

さて、さきほどの回答をご覧いただいてもうお分かりとは思いますが、この際ですから(笑)簡単に説明すると With Sheets("集計") '(1) は、最後のEnd With '(1)と対になっているわけですから全部にかかっていますよね。 つまり、その下の With .Range("A1") '(2)  With .Range("A2:O2") '(3) With .PageSetup '(4) のドットの前は たとえば、With Sheets("集計").Range("A1") '(2) のようにSheets("集計") が略されているわけです。 そして、(2)から(4)のWith~End Withのなかではドットの前に それぞれ、 Sheets("集計").Range("A1") Sheets("集計").Range("A2:O2") Sheets("集計").PageSetup が略されています。 ですから、ご希望のところで二つにわけるには以下のようになります。 Sub ページ設定前編()   With Sheets("集計")     .Range("A:O").EntireColumn.AutoFit '項目名行の幅をオートフィット     .Range("A:K").HorizontalAlignment = xlCenter '各列の値を中央に     With .UsedRange.Borders 'データ部分を罫線で囲む       .LineStyle = xlContinuous       .Weight = xlThin       .ColorIndex = xlAutomatic     End With     .Rows(1).Insert Shift:=xlDown '1行目にタイトル用の空白行を作成する。・・     With .Range("A1") '表のタイトルをつける       .Value = "実績一覧表" & Format(Date, "yyyy/mm/dd")       .HorizontalAlignment = xlLeft       .VerticalAlignment = xlCenter     End With     With .Range("A2:O2")       .HorizontalAlignment = xlCenter '項目名行をセルの中央へ       .Interior.ColorIndex = 15 '項目欄を灰色で塗る     End With   End With   ActiveWindow.Zoom = 75 '画面表示を75%に End Sub 'ここで分割(別プロシージャーに) Sub ページ設定後編()   With Sheets("集計")     With .PageSetup '印刷用ページ設定       .PrintTitleRows = "$1:$2"       .CenterFooter = "&P / &N ページ"       .LeftMargin = Application.InchesToPoints(0.78740157480315)       .RightMargin = Application.InchesToPoints(0.393700787401575)       .TopMargin = Application.InchesToPoints(0.78740157480315)       .BottomMargin = Application.InchesToPoints(0.393700787401575)       .HeaderMargin = Application.InchesToPoints(0.511811023622047)       .FooterMargin = Application.InchesToPoints(0.196850393700787)       .CenterHorizontally = True '水平方向の中央寄せ       .Orientation = xlPortrait '縦向き       .PaperSize = xlPaperA4 'A4にあわせて       .Zoom = False '自動       .FitToPagesWide = 1 '横を1ページ内に       .FitToPagesTall = False '縦方向は制限なし     End With   End With End Sub これでほんとの完了かな?

gx9wx
質問者

お礼

ありがとうございます。 プロシージャー2個にして うまくいきました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.37

こんにちはガンダムさん。 > 今回教えていただいた記述でも > WithとEnd Withだけにすると > 以下の順番ですがどうしてこうなのか自分で理解ができません。 どのWithとEnd Withがセットなのか、同じ番号を振りました。 よく見てください。 Sub ページ設定02()   With Sheets("集計") '(1)     With .Range("A1") '(2)     End With '(2)     With .Range("A2:O2") '(3)     End With '(3)     With .PageSetup '(4)     End With '(4)   End With '(1) End Sub

gx9wx
質問者

お礼

ありがとうございました。大変わかりやすかったです。 別件ですが(^_^.)教えていただいたSub名前変換03ですが Sub 名前変換03() Dim myBk As String myBk = ThisWorkbook.Name With Sheets("集計") .Columns("F:F").NumberFormatLocal = "G/標準" .Range("F1").Formula = _ "=IF(ISNA(VLOOKUP(E1,[" & myBk & "]従業員名簿!$A:$B,2,FALSE)),E1,VLOOKUP(E1,[" & myBk & "]従業員名簿!$A:$B,2,FALSE))" .Range("F1").Copy .Range("F1:F" & .Range("E" & .Rows.Count).End(xlUp).Row) .Columns("F:F").Copy .Range("F1").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End With End Sub 全然別のエクセルファイルで(今度は同じBOOK内です。) シート2のC列の値を検索値としてシート3のA列をVLOOKUPで検索し HITしたらシート3の該当行のB列の値をシート2のG列に転記し シート2のC列の値があるまで繰り返すというのに 流用できますでしょうか?(したいです。) ファイル名を変更されてもメンテしなくていいように これを流用したいのですが。 集計→シート2 従業員名簿→シート3 記述内のすべての列指定部分のF→G (F1→G1) 記述内のすべての列指定部分のE→C (E1→C1) にしましたが動きません。 やはり流用しない方がいいのでしょうか。 シート3のB列は書式が標準で M01、M02~M19、M20という20種類しか存在しません。 A列は4,500行で書式が標準です。 別スレッドで質問すべきですが merlionXXさんの記述をそっくりコピペで質問になってしまうので それはmerlionXXさんに失礼になってしまいますし、 他の回答者さんに「なぜこの方法ですか?」ときっと言われますので。 (このSub 名前変換03はある理由があってこの記述であり  それはmerlionXXさんと私にしかわかりませんのでm(__)m) (なお別のエクセルとはQNo.6251880でmerlionXXさんに教えていただいた  マクロでそれに合流させるつもりです。) 本当にすいません。 LOOP文とエクセルファイル名指定でなら自分でも作成できますが、 この記述を変更する事によってこの記述の意味が理解出きる物ですから。 (本当かな????) 私は今は記述1行ごとにその文が何をするのかコメントを入れています。 (実は名前変換03はまったく意味がわからずコメントが入れられないのです。)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.36

おはようございます、ガンダムさん。 Sub test07() '2000-2003共用 うまくいってよかった! 今日も東京は快晴です。 GX9901ってなんだろうとおもったら・・・・・・。 gx9wxさんは、幼少期はSFアニメ大好き少年だったのかな。 わたしもカラオケでは「科学忍者隊ガチャマンの歌」好きです。 ヾ(=^▽^=)ノ さて、本日の日課(?) ページ設定のコード、不要部分と思われるものを削ったり、少しいじってみました。 Zoomはプリンターに影響を受けるので、決めうちではなく横を1ページにおさめるようにしてみました。 Sub ページ設定02()   With Sheets("集計")     .Range("A:O").EntireColumn.AutoFit '項目名行の幅をオートフィット     .Range("A:K").HorizontalAlignment = xlCenter '各列の値を中央に     .Rows(1).Insert Shift:=xlDown '1行目にタイトル用の空白行を作成する。・・     With .Range("A1") '表のタイトルをつける       .Value = "実績一覧表" & Format(Date, "yyyy/mm/dd")       .HorizontalAlignment = xlLeft       .VerticalAlignment = xlCenter     End With     With .Range("A2:O2")       .HorizontalAlignment = xlCenter '項目名行をセルの中央へ       .Interior.ColorIndex = 15 '項目欄を灰色で塗る     End With     With .PageSetup '印刷用ページ設定       .PrintTitleRows = "$1:$2"       .CenterFooter = "&P / &N ページ"       .LeftMargin = Application.InchesToPoints(0.78740157480315)       .RightMargin = Application.InchesToPoints(0.393700787401575)       .TopMargin = Application.InchesToPoints(0.78740157480315)       .BottomMargin = Application.InchesToPoints(0.393700787401575)       .HeaderMargin = Application.InchesToPoints(0.511811023622047)       .FooterMargin = Application.InchesToPoints(0.196850393700787)       .CenterHorizontally = True '水平方向の中央寄せ       .Orientation = xlPortrait '縦向き       .PaperSize = xlPaperA4 'A4にあわせて       .Zoom = False '自動       .FitToPagesWide = 1 '横を1ページ内に       .FitToPagesTall = False '縦方向は制限なし     End With   End With End Sub

gx9wx
質問者

お礼

ありがとうございます。 ちょうどいい事例なので教えてください。 参考書には ・With を使用したら必ずEnd Withを とは載っていますがそれ以上の事は載っていません。 今回のようにWithがたくさんある場合にいつも疑問です。 私が記述をすると  「End Withがありません」   「End Withに対するWithがありません」 とよくエラーになります。 で適当に入れたり削除で、エラーがでなくなったら OKといい加減にやっています。 今回教えていただいた記述でも WithとEnd Withだけにすると 以下の順番ですがどうしてこうなのか自分で理解ができません。 With With End With With End With With End With End With また ページ設定 は2個のプロシージャーにしようと思って 教えていただいた物に付け足した上で分割しようと思いましたが さらにWithが増加でよくわかりません。 いつもの手で回避できますがそれでは覚えないので 教えてください。お願いします。 Sub ページ設定02() With Sheets("集計") .Range("A:O").EntireColumn.AutoFit '項目名行の幅をオートフィット .Range("A:K").HorizontalAlignment = xlCenter '各列の値を中央に -----ここに以下の記述を付け足し  'データ部分を罫線で囲む   With ActiveSheet.UsedRange.Borders   .LineStyle = xlContinuous    .Weight = xlThin   .ColorIndex = xlAutomatic   End With ------- .Rows(1).Insert Shift:=xlDown '1行目にタイトル用の空白行を作成する。・・ With .Range("A1") '表のタイトルをつける .Value = "実績一覧表" & Format(Date, "yyyy/mm/dd") .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter End With With .Range("A2:O2") .HorizontalAlignment = xlCenter '項目名行をセルの中央へ .Interior.ColorIndex = 15 '項目欄を灰色で塗る End With ----ここに以下の記述をつけたす    '画面表示を75%に  ActiveWindow.Zoom = 75 ----ここで分割(別プロシージャーに)したい With .PageSetup '印刷用ページ設定 .PrintTitleRows = "$1:$2" .CenterFooter = "&P / &N ページ" .LeftMargin = Application.InchesToPoints(0.78740157480315) .RightMargin = Application.InchesToPoints(0.393700787401575) .TopMargin = Application.InchesToPoints(0.78740157480315) .BottomMargin = Application.InchesToPoints(0.393700787401575) .HeaderMargin = Application.InchesToPoints(0.511811023622047) .FooterMargin = Application.InchesToPoints(0.196850393700787) .CenterHorizontally = True '水平方向の中央寄せ .Orientation = xlPortrait '縦向き .PaperSize = xlPaperA4 'A4にあわせて .Zoom = False '自動 .FitToPagesWide = 1 '横を1ページ内に .FitToPagesTall = False '縦方向は制限なし End With End With End Sub

gx9wx
質問者

補足

すいません。 昨日はPCで作業している暇がありませんでした。 よくわかりましたね。 (WEB検索でHITしますね。) ガンダムファンでも知らない人がいるマイナーシリーズなんですが。 >幼少期はSFアニメ大好き少年 すいません。大人になってはまってます。 あのストーリーは子供では理解できません。 >「科学忍者隊ガチャマンの歌」 私も大好きです。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.35

ごめん、わたしのミスです。 わたしが2000で試せるように修正したときに記述を誤りました。 (///▽///) 赤面 これなら大丈夫だと思います。 Sub test07() '2000-2003共用   Dim myRng As Range   Dim x As Long, y As Long, z As Long, n As Long, i As Long   Dim myAr, myNm()   With Sheets("集計")     Set myRng = .Range(.Range("H1"), .Range("H1").End(xlDown)) 'H列データ     x = .Range("A1").SpecialCells(xlLastCell).Column + 1 'シート使用範囲の一つ右の列番号     y = x - myRng.Column 'H列と上記の列の差     Application.ScreenUpdating = False '画面更新停止     .Cells(1, x).Value = 1 'x番目列の1行目セルに1を入力     With myRng.Offset(1, y).Resize(myRng.Count - 1, 1) 'その下に数式入力       .FormulaR1C1 = "=R[-1]C+1+(R[-1]C[-" & y & "]<>RC[-" & y & "])" '連番(+1)設定(区切位置では+2)       .Copy 'コピー       .PasteSpecial Paste:=xlPasteValues '値張り付け(数式を値にした)       Application.CutCopyMode = False       myAr = .Offset(-1).Resize(.Count + 1, 1).Value '配列myArに値を代入(Offsetをもどして)       For i = LBound(myAr, 1) To UBound(myAr, 1) - 1 '配列内で         If myAr(i + 1, 1) - myAr(i, 1) = 2 Then '差が2の場合           ReDim Preserve myNm(n) '配列添字追加           myNm(n) = myAr(i, 1) + 1 '配列myNmに+1の値を代入           n = n + 1 'カウント         End If       Next i '繰り返し       .Cells(.Count).Offset(1).Resize(UBound(myNm) + 1, 1).Value = Application.Transpose(myNm) '連番の下に配列myNmを入力     End With     .Range(.Cells(1), .Cells(1, x).End(xlDown)).Sort Key1:=.Cells(1, x), Order1:=xlAscending, Header:=xlNo 'x番目列基準で昇順に並び替え     .Columns(x).Clear 'x番目列の内容削除     z = .Range("H" & .Rows.Count).End(xlUp).Row 'H列最終行取得     Application.ScreenUpdating = True '画面更新停止解除     ActiveWorkbook.Names.Add Name:="ExternalData_1", RefersTo:="=" & .Name & "!" & .Range(.Cells(1, "A"), .Cells(z, x - 1)).Address'ExternalData_1拡大   End With End Sub あしたは定休日ですか。 ゆっくりおやすみください。

gx9wx
質問者

お礼

Sub test07() '2000-2003共用 完璧です。 test05の時と同じになりました。 エラーチェックも出ていません。 O列の計算もOKです。 データーは3行目になりました。 どうもありがとうございました。 ほぼ完成かな、です。 無事解決で安心して休暇に入れます。 いろいろありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.34

こんにちは。(^o^)/ 投稿日時 - 2010-11-04 13:52:32のお礼を見逃してました。 Sub 名前変換03()はうまくいったようですね。 Sub test06() も思ったようになってくれたらよいのですが会社の2000では試せません。 さて、以前の > もうこのさいですので聞いてしまいます。 が、まだいくつか残ってましたね。 並べ替えは違うでしょうが、その他の作業は、もしこれらの作業を続けてやっているなら、以下ようにしたほうがすっきりすると思います。 Sub このさい聞いちゃった()   With Sheets("集計")     .Range("A:O").EntireColumn.AutoFit '項目名行の幅をオートフィット     .Range("A:K").HorizontalAlignment = xlCenter '各列の値を中央に     .Rows(1).Insert Shift:=xlDown '1行目にタイトル用の空白行を作成する。     With .Range("A1") '表のタイトルをつける       .Value = "実績一覧表" & Format(Date, "yyyy/mm/dd")       .HorizontalAlignment = xlLeft       .VerticalAlignment = xlCenter     End With     With .Range("A2:O2")       .HorizontalAlignment = xlCenter '項目名行をセルの中央へ       .Interior.ColorIndex = 15 '項目欄を灰色で塗る     End With   End With End Sub ・作業の対象を明示する。 ・やむを得ない場合以外はSelectしない。 ・まとめられるものはまとめて書く。 これらが基本じゃないかなと思います。 わたしもこの際、聞いちゃおうかな。 gx9wxさんのID、gx9wxってどんな意味なんでしょう?

gx9wx
質問者

お礼

ありがとうございます。 表の編集が全て終了後に表の装飾として行っています。 Callに分けた部分は A4用紙に印刷する時の為でしたが別に画面で見ても 影響しないので一纏めでもかまわないです。 特にSub ページ設定内の「ページ設定」より前の部分は 印刷するしないに限らず 装飾なので一纏めがいいです。 (5万行のデーターを印刷する人はいないと思います。  ページ指定で印刷する人の為です。) '項目名行の幅をオートフィット Range("A:A:O:O").EntireColumn.AutoFit '項目名行をセルの中央へ Range("A1:O1").HorizontalAlignment = xlCenter '各列の値を中央に Range("A:A:K:K").HorizontalAlignment = xlCenter 'データ部分を罫線で囲む With ActiveSheet.UsedRange.Borders .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With '画面表示を75%に ActiveWindow.Zoom = 75 '印刷用にページ設定をします。 Call ページ設定 ------ Sub ページ設定() '2010年10月6日 'A4にあわせてページ設定を行います。 '1行目にタイトル用の空白行を作成する。 Rows("1:1").Select Selection.Insert Shift:=xlDown '項目欄を灰色で塗る Range("A2:O2").Select With Selection.Interior .ColorIndex = 15 .Pattern = xlSolid '表のタイトルをつける Range("A1").Value = "実績一覧表" & Date Range("A1").Select With Selection .HorizontalAlignment = xlLeft .VerticalAlignment = xlCenter End With '印刷用ページ設定 With ActiveSheet.PageSetup .PrintTitleRows = "$1:$2" .PrintTitleColumns = "" End With ActiveSheet.PageSetup.PrintArea = "" With ActiveSheet.PageSetup .LeftHeader = "" .CenterHeader = "" .RightHeader = "" .LeftFooter = "" .CenterFooter = "&P / &N ページ" .RightFooter = "" .LeftMargin = Application.InchesToPoints(0.78740157480315) .RightMargin = Application.InchesToPoints(0.393700787401575) .TopMargin = Application.InchesToPoints(0.78740157480315) .BottomMargin = Application.InchesToPoints(0.393700787401575) .HeaderMargin = Application.InchesToPoints(0.511811023622047) .FooterMargin = Application.InchesToPoints(0.196850393700787) .PrintHeadings = False .PrintGridlines = False .PrintComments = xlPrintNoComments .PrintQuality = 600 .CenterHorizontally = False .CenterVertically = False .Orientation = xlPortrait .Draft = False .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic .Order = xlDownThenOver .BlackAndWhite = False .Zoom = 60 .PrintErrors = xlPrintErrorsDisplayed End With End With End Sub

gx9wx
質問者

補足

こんにちは。 >gx9wxさんのID、gx9wxってどんな意味なんでしょう? 形式番号 GX-9901 機体名 WX ↓ GX9901WXのつもりが 得意の誤記で gx9wx になりました。(-_-;)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.33

こんばんは。遅くなりました。 今日は久々に快晴だったので出かけていました。 数値がテキスト形式云々の警告が表示されるのはセル内の数字が文字列として保存されてるか、アポストロフィで始まる場合です。エラーじゃないです。 でも、それが表示されることで何か問題でも? これ2000では出ないんです。今日は自宅だったので2003でこれを再現できました。 でも、なぜ途中からでるのか? テストの結果、取り込みデータが1万行、空白行を挿入して1万1千行の場合、増えた1千行にその表示がでるようですね。当初の1万行範囲は「外部データの取り込み」でテキストで取り込んだためその範囲は表示がでないのかも。 試行錯誤の結果、当初取り込んだ行以外にも表示させないためには以下のコードにしてみてくだい。 Sub test06() 'Office2000併用   Dim myRng As Range   Dim x As Long, y As Long, z As Long, n As Long, i As Long   Dim myAr, myNm()   With Sheets("集計")     Set myRng = .Range(.Range("H1"), .Range("H1").End(xlDown)) 'H列データ     x = .Range("A1").SpecialCells(xlLastCell).Column + 1 'シート使用範囲の一つ右の列番号     y = x - myRng.Column 'H列と上記の列の差     Application.ScreenUpdating = False '画面更新停止     .Cells(1, x).Value = 1 'x番目列の1行目セルに1を入力     With myRng.Offset(1, y).Resize(myRng.Count - 1, 1) 'その下に数式入力       .FormulaR1C1 = "=R[-1]C+1+(R[-1]C[-" & y & "]<>RC[-" & y & "])" '連番(+1)設定(区切位置では+2)       .Copy 'コピー       .PasteSpecial Paste:=xlPasteValues '値張り付け(数式を値にした)       Application.CutCopyMode = False       myAr = .Value '配列myArに値を代入       For i = LBound(myAr, 1) To UBound(myAr, 1) - 1 '配列内で         If myAr(i + 1, 1) - myAr(i, 1) = 2 Then '差が2の場合           ReDim Preserve myNm(n) '配列添字追加           myNm(n) = myAr(i, 1) + 1 '配列myNmに+1の値を代入           n = n + 1 'カウント         End If       Next i '繰り返し       .Cells(.Count).Offset(1).Resize(UBound(myNm) + 1, 1).Value = Application.Transpose(myNm) '連番の下に配列myNmを入力     End With     .Range(.Cells(1), .Cells(1, x).End(xlDown)).Sort Key1:=.Cells(1, x), Order1:=xlAscending, Header:=xlNo 'x番目列基準で昇順に並び替え     .Columns(x).Clear 'x番目列の内容削除     z = .Range("H" & .Rows.Count).End(xlUp).Row 'H列最終行取得     Application.ScreenUpdating = True '画面更新停止解除     ActiveWorkbook.Names.Add Name:="ExternalData_1", RefersTo:="=" & .Name & "!" & .Range(.Cells(1, "A"), .Cells(z, x - 1)).Address   End With End Sub 取り込んだ外部データ(ExternalData_1)の範囲を拡張してみました。 こんなこと今までしたことないので、何か他に問題が起きるかどうかなんともいえませんが。 ではまた明日!

gx9wx
質問者

お礼

ありがとうございます。 うまく説明できないのですが、 こんな感じです。 【test06をもらう前】 1.CSVインポート後 行 1 データー行みかん 2 データー行いちご 3 データー行りんご 4 データー行みかん 5 データー行いちご 2.項目行挿入 行 1 項目行 2 データー行みかん 3 データー行いちご 4 データー行りんご 5 データー行みかん 6 データー行いちご 3.testO5が動作後 行 1 項目行 2 空白行(必ず) 3 データー行みかん 4 データー行みかん 5 空白行 6 データー行いちご 7 データー行いちご 4.品別集計05が動作 行 1 項目行 2 空白行 3 データー行みかん→セルO3に値 4 データー行みかん→セルO4に値 5 空白行 6 データー行いちご→セル06に値 7 データー行いちご→セル07に値 ↓↓↓ 【test06を使用した場合】 1.CSVインポート後 行 1 データー行みかん 2 データー行いちご 3 データー行りんご 4 データー行みかん 5 データー行いちご 2.項目行挿入 行 1 項目行 2 データー行みかん 3 データー行いちご 4 データー行りんご 5 データー行みかん 6 データー行いちご 3.testO6が動作後 行 1 項目行 2 データー行みかん 3 データー行みかん 4 空白行 5 データー行いちご 6 データー行いちご 4.品別集計05が動作 行 1 項目行 2 データー行みかん→セルO2に値がない場合がある 3 データー行みかん→セルO3に値 4 空白行 5 データー行いちご→セルO5に値 6 データー行いちご→セルO6に値 明日5日は会社自体がなぜか定休日です。m(__)m

gx9wx
質問者

補足

ありがとうございます。 >でも、それが表示されることで何か問題でも? セルの書式設定が列の全行が「文字列」なのに、 エラーチェックマークがある行と無い行が あって気持ち悪かったので。 あとこれは実績データとして保存していきます。 エラーチェックマークがあるセルは!をクリックして 「数値にする」をクリックすると 0010 → 10 になってしまうので、そういう作業はさせたくないので エラーチェックマークははずしたいと思いました。  エクセルのツール→オプション→エラーチェック→  →ルール→文字列として保存されている数値 のチェックをはずす手段も考えましたが 本当のエラーが発見されないのでやめました。 Sub test06 を試しました。 全行エラーチェックマークは消えました。\(^o^)/ ですが一つ疑問が。 この空白行を入れるマクロはバージョン05以前は 動作終了後は必ずデータ開始行は3行目になります。 それは以下の処理順だからです。↓  1.CSVインポート時→データ開始1行目  2.1行目に項目名を入れる行を挿入  3.データ開始は2行目になる  4.空白行を入れるマクロで   項目行である1行目とデータ開始行の2行目は   当然違う値だから1行目と2行目の間に空白行が入ります。 結果データは開始行は3行目になっています。 そこで例のO列の計算マクロが走ります。  5.Sub 残数計算3(Sub 品別集計05です)   ↓↓ '2010年10月26日 '残数計算 M列を入庫、N列を出庫としO列に残数を転記する 'L列に値がある場合は計算しないで上の行をそのまま転記 '計算対象データは3行目から Dim i As Long i = Cells(Rows.Count, "A").End(xlUp).Row With Range("O3:O" & i) With .SpecialCells(xlCellTypeBlanks) .FormulaR1C1 = "=IF(ISBLANK(RC[-4]),FALSE,SUM(R[-1]C,RC[-2])-RC[-1])" End With .Copy .PasteSpecial Paste:=xlValues Application.CutCopyMode = False .SpecialCells(xlCellTypeConstants, xlLogical).ClearContents End With End Sub ですがSub test06で空白行を入れた場合はなぜか 項目行の1行目とデーター開始後の行の間には空白が入らない為、 データ開始は2行目からとなります。 となりますと、  Sub 残数計算3(Sub 品別集計05)は   With Range("O3:O" & i) という記述なので不安です。 ちなみにCSVの取込データによってですが データ開始行のO列に計算値が入る場合、入らない場合が有りました。 (該当セルはO2になります。) そもそもは上記NO.1~NO.4の状態を説明をして Sub 残数計算3(Sub 品別集計05)を作成していただきました。 よって回答A-NO.14で >データは3行目からとお書きだったじゃないですか。 >2行目からがデータならほんのちょっとの手直しでいいですが、 >1行目からデータでは >数式"=IF(ISBLANK(RC[-4]),FALSE,SUM(R[-1]C,RC[-2])-RC[-1])" >が成り立たず、エラーになるはずです。 >これを、1行目にもっていけないのはわかりますよね、 >O1セルより上にセルはないんですから。 という指摘もいただきまして現在もNO.1~NO.5の順番の記述です。 (その後データ開始1行目からのバージョン Sub 品別集計06   も作成していただきました。) このSub 品別集計06が存在しますので私の記述の順番を  1.CSVデータ取込→データ開始1行目  2.空白行挿入Sub test06→データ開始1行目のまま  3.Sub 品別集計06(05→06 データ1行目バージョンに変更)    →データ開始は1行目のまま  4.1行目に項目欄挿入←これは2,3終了後に行う様に変更 に変更が可能です。こうした方が無難なのでしょうか?

関連するQ&A

  • エクセル 2つの表を1つの表に空白行を詰めて表示

    B列~D列に表AがありF列~H列に表Bがあります。 2つの表をJ列~L列に空白行を詰めて表示される方法を教えてください。 サンプル表を添付します。 よろしくお願いします。

  • エクセルマクロ、空白行(セル)の挿入

    データがA、B、C、D、E列100行まであります。 このうちD、E列を除き、エクセルのマクロで1行ごとに空白で10行挿入したいです。 (A、B、C、D列のデータに空白セルを10行分挿入し、下にシフトするイメージ。D、E列はそのまま。) ご教授頂きたく、お願いします。

  • 複数CSVファイルからデータ抽出

    CSVファイルのA列(行は問いません)の文字が転記シートのA列(行は問いません)と一致していたら、転記シートのA列が一致した行の空白に、左から順にCSVファイルのA列が一致した行のF列の値を書き込む。CSVファイルの1行A列を転記シートのF列の値を書き込んだ列の1行目に書き込む。 できれば、書き込んだ値はCSVファイルから消したいです。 コピペでやっていたのですが、ずれていてどうしようもなくなりました。 CSVファイル一つ当たり、4000行ほどあり、ファイルは200弱あります。 プログラムを組んでくださると、ありがたいのですが。 質問というよりお願いになってしまいますが、よろしくお願いします。

  • エクセルマクロ:空白行を除いてコピー

    マクロで次の作業を処理したいのですが、どのようなコードを書けばよいのでしょうか?教えてください。よろしくお願いします。 ○sheet1 ☆左側 列B~Hをワンセットとしたものが、計51行ある。先頭はタイトル行で9行目である。 D列には固定の文字列が与えられており、E列はブランクで、D・Eともに非表示にしておきたい。 B10~B59には、固定で1~50の数字が順番に与えられている。 C10~C59、G10~G59、H10~H59には数値が、F10~F59には文字列が入力される。 空白の場合もあり、どの行に入力されるかは不明。 ☆右側 列J~Pをワンセットとしたものが、計51行ある。先頭はタイトル行で9行目である。 J10~J59には、固定で51~100の数字が順番に与えられている。 K10~K59、M10~M59、O10~O59、P10~P59には数値が、L10~L59、N10~N59には文字列が入力される。 空白の場合もあり、どの行に入力されるかは不明。 ○sheet2 sheet1のボタンをクリックし、sheet2を表示させ、 sheet1の値を次のようにsheet2に貼付けたい。 sheet2のB8~H107の範囲内で上から、sheet1の左側B10~H59と右側J10~P59の空白を含む行を除いた セット(列B~H、列J~P)のみをコピーし、左側と右側を連続して、値のみ貼付けたい。 ※C列とK列の空白を判定すれば良い ※並べ替えなどのために別シートを置きたくない ※非表示列の扱い方

  • Excelで空白行を削除したい

    2500行位使用しているシートのなかに、どのセルも空白になっている不要な行が300行くらい混ざっています。 この行を自動的に削除するにはどうすれば良いでしょうか。 ただ、その行のA~Eセルは空白でもFセルに値が入っているなど完全に空白でない行は削除できません。 メニュー、関数、VBAなど有れば教えてください。

  • Excelvba表に空白行があれば上に詰める重い

    いつもお世話になっております。 列がD列からK列で、行が4行目から23行までの表があります。 その表で1行まるまる空白の時(4行目にには数式が入っていますがそれは除く) 上の行に詰めるようにしてあります。行はそのまま空白のまま残して、値のみ上に詰めるようにしています。 このような表が同じ列に4か所×3=12か所あるので、今はそれぞれ下のコードの行、列を変更して処理しています。 上の表と下のの表の間隔は、上が4~23行までで、下は30~49、と6行間隔です。結合セルも間にあるため5行空きがあります。 列と列の間隔は、左側から、D列~K列、続いて、N列~U列と続きます。2列空きがあります。 家で試した時は一応問題なく動いたのですが、 会社でした時フリーズしてしまい、うまくいきませんでした。 その後、家でしてもなぜかうまく動作しなくなりました。 12の表は多いのかと思い、1つで試してもだめになりました。 同じような作りの別のファイルは動いています。 念のため、新しいファイルにコピーし直してやりましたが、駄目でした。 コードもあまり良くないのかもしれません。 一応家ではVISTAの2007で試し、会社は7(32ビット)の2013です。 もう少し負担が少なくなるようなやり方があればと思っています。 もう少し、いいやり方があればお手数ですが、ご教授ください。 よろしくお願いいたします。 Sub 表の空白行は上に詰める() Dim i As Integer, x As Integer, y As Integer, CSUM As Integer Dim flag As Boolean Application.ScreenUpdating = False flag = 0 '1回だけの処理で使うフラグ For x = 22 To 4 Step -1 '23行→4行まで処理をします。 CSUM = 0 '列の文字数を数える変数CSUMを用意し、初期値0とします。 For y = 4 To 11 'D列→K列まで処理をします。 CSUM = CSUM + Len(Cells(x, y)) 'CSUMにセル(x,y)の文字数を足します。 Next '列処理繰り返し If CSUM = 0 Then Range(Cells(x + 1, 4), Cells(23, 11)).Copy '空白行の1行下から23行目までをコピー Cells(x, 4).PasteSpecial '空白行の1列目のセルを基点として貼り付け If flag = 0 Then '23行目の値クリア処理 1回だけの処理 Cells(23, 5) = 1 '23行目がすっからかんのときエラーになるので、暫定入力 Range(Cells(23, 4), Cells(23, 11)).SpecialCells(xlCellTypeConstants).ClearContents End If '1回だけの処理 ここまで flag = 1 '1回だけの処理させないためフラグ値変更 End If Application.CutCopyMode = False Next '行処理繰り返し End Sub

  • 空白セルのある場合の計算

      A  B  C  D   E  F  G  H 1 (2)     (2)     空     (3) わかりづらいかもしれませんが、 =A1+C1+E1+G1 で、数字の合計を出したいのですが、###のエラーが出ます。 E1の空白セルに数字が入るとエラーはなくなります。 どうしたら空白を0とみなして計算できますか? (空白セルはどうしても空白じゃなきゃなりません) (B列D列F列は計算対象外の数字が入力されてます)

  • エクセルの質問です。列単位で空白のセルを詰めて表示したいのですが・・・

    教えてください(>_<) 下記のようなデータがあります。 空白のセルを詰めて表示したいのです。 行全体を削除していくのではなく、列単位で上に詰めての表示です。 昇順などの並び替えはせず、単純に上に詰めていく感じです。 エクセルを扱えない人も利用していくのでできれば、コマンドボタン等で一度に表示できればうれしいです。 ■データ(C3からデータが入力されています)   AB  C  D  E  F・・・ 1 2 3     あ     あ 4     い  う  う  え 5              お 6     う  あ  え  え 7     え  い  お  あ ■結果   AB  C  D  E  F・・・ 1 2 3     あ  う  あ  え 4     い  あ  う  お 5     う  い  え  え 6     え     お  あ 7 よろしくお願いします。

  • エクセル 在庫数を求める計算式

    エクセル2013を使用しています。 型番毎にシート管理していた在庫表を、 以下の内容で1シートにまためた形に変更したいと考えています。 型番毎の在庫数を求める計算式をお教え下さい。 A列:在庫管理する型番(34種類) B列:日付 C列:入荷 D列:出荷 E列:在庫 <例> 以下の場合3行目のE列(在庫:7)が1行目の同型番の、 E列(在庫:10)から算出される計算式。      A列   B列  C列  D列  E列 1行目 ABC型  11/20  0   5   10 2行目 DEF型  11/23  5   0   20 3行目 ABC型  11/24  0   3   7 ※A列に入る型番は注文次第なのでどの型番がいつくるかは未定となっています。 何卒よろしくお願い致します。

  • エクセルの空白の行を印刷しない方法

    A1からE101までの表があります。 E列には数式が入っていて、100行まで数値が入っています。 101行は縦計が入ってます。 この表は50行しか入力しない時や100行全部入力する場合もあり、少ない行しか入力のなかった時にも空白の行(E列には必ず数値が入ってます)が印刷されて困っています。 AからDが空白の時にその行から下が印刷されずに、縦計の101行が持ち上がって印刷される方法はないでしょうか?

専門家に質問してみよう