• ベストアンサー

Excelマクロプログラム解りません。*初心者です

fumufumu_2006の回答

  • ベストアンサー
回答No.1

本職ではありませんが、時々excelのvbaやるんで、よくマクロ記録して書き直します。 で、プログラム見て、「マクロ記録したんだなー、それを書き直して繰り返してるんだなー」って思ってます。 でも、動かない時って、直せば直すほど泥沼に入っていくんですよね。 で、さっきまで文句を言わなかったのに突然、Forが無いなんて「Forあるじゃん」と言いたくなるんですよね。 勝手な想像で、違ったらすみません。 >・現行ではNextに対するForがないと言われる if文がendifで終わってないため、Nextが ElseIf Cells(5, i) = "" Thenブロック内で突然出てきたので、forが無いと言われた。 もちろん全部のエラーを出せば、forに対するnextも無いし、ifに対するendifも無いと思われている。 全部エラー出してくれれば気づくのに・・・って思いませんか。 それと、どうせ入力が無いときは何もしないのなら、ElseIf文いらないので、そこをendifにする。 >・発注書出力に打ち込んだ商品に対する個数をコピペしたい。 ちなみに、xlPasteValuesは、形式を選択して貼り付け(PasteSpecial)の、値のみ貼り付ける時の定数ですので、ただの-4163と言う数値です。 と言うわけで、 If Cells(5, i) = xlPasteValues Then の方を If Cells(5, i)<>"" Then にする。 以上で、 For i = 24 To 43 If Cells(5, i) <>"" Then   [発注履歴シートにコピー&ペースト処理] End If Next の形になれば、まずひと段落。 で、多分マクロを記録してfor、nextを付けたからだろうけど、 Worksheets("発注書出力").Activate For i = 24 To 43 [処理1] Sheets("発注履歴").Select [処理2] Worksheets("発注書出力").Select Next の形になってますが、対象シートの選択は各処理の前で指定した方が良いと思います。 逆に、貼付行は、最初に取得すれば、1行づづしか増やさないので、forの前に設定しておけば、あとは+1でいいと思います。 それと、.Activateは、シート自体を表示するため、場合によっては画面がちらつくので、必要なければ.selectの方がいいと思います。 貼付行=初期値 For i = 24 To 43 sheets("発注書出力").Select [処理1] Sheets("発注履歴").Select [処理2] 貼付行=貼付行+1 Next の形がいいと思います。 以上はエラーが出るのと、マクロを記録して直してるんで、気になった点です。 で、致命的な事なんですが、Cells(??, 貼付行)とありますが、cells(行,列)で指定する物なので、すべて逆です。 で、致命的な事2なんですが、貼付行 = Range("C65536").End(xlUp).Row + 1は、C列の最後から探して・・・なので、5番目の列(E)を基準にしないと、いつも上書きされてしまいます。 貼付行 = Range("E65536").End(xlUp).Row + 1です。 以上気になった点と致命的な点です。 で、正しく書き換える・・・んじゃなく、記録したマクロを直すより、以下の方が良いんじゃないかと思います。 Sub Macro1() Dim 貼付行 As Integer Dim i As Integer 貼付行 = Sheets("発注履歴").Range("E65536").End(xlUp).Row + 1 For i = 24 To 43 If Sheets("発注書出力").Cells(i, 5) <> "" Then Sheets("発注履歴").Cells(貼付行, 4) = Sheets("発注書出力").Cells(i, 4) Sheets("発注履歴").Cells(貼付行, 5) = Sheets("発注書出力").Cells(i, 5) 貼付行 = 貼付行 + 1 End If Next End Sub こんなのでどうでしょう。

menkatame
質問者

お礼

御回答有難う御座いました。 >「マクロ記録したんだなー、それを書き直して繰り返してるんだなー」って思ってます。 ・おっしゃる通りです。Excelのマクロ機能に魅せられて、記録し使える文をコピペしていました。だから面倒な文に成ってるのかも知れません。 >突然、Forが無いなんて「Forあるじゃん」と言いたくなるんですよね。 ・そうなんです。さすが機械です。「なんで?ここにあるじゃん」と画面を指差す感じです・・・・。 >致命的な事なんですが、Cells(??, 貼付行)とありますが、cells(行,列)で指定する物なので、すべて逆です。 ・致命的ですね。セルを指す場合”A5”なので、1番目の5番目なんて思い、そのまま書いてました。 >.Activateは、シート自体を表示するため、場合によっては画面がちらつくので、必要なければ.selectの方がいいと思います。 ・これは私的にウロコです。他の動くマクロもパラパラ画面が切り替わり、その分遅くなっていました。マクロ記録のためですね。 現在の構文をfumufumu_2006さんの指摘通りに書き直しを試みましたが、改めて書いて頂いた構文の美しさ、解りやすさに、そちらを使わせて頂きたいと思います。 Dim とか Integer とか解らない文字も次第に覚えていきたいと思います。有難う御座いました。 ちなみにもう少しVBAレベルを上げていきたいのですが、どのような方法が効果的でしょうか?参考になる書籍等御座いましたら、ご紹介下さい。宜しくお願いします。

関連するQ&A

  • EXCELマクロについて

    条件 シート名提供データE列の3行目からデータが入っています。    ブランク以外のデータをコピーしてシート名WorkのC列の2行目から貼り付けたいので下記のマクロを書いていますがおかしい所 はないのでしょうか。教えてください。 いまいちCellsの使い方がわかりません。 出来たら下記の意味を教えてください。 brank = Worksheets("提供データ").Cells(gyo, 5).Text Range(Cells(3, 5), Cells(gyo, 5)).Select Sub 貼付() Dim gyo, brank Sheets("提供データ").Select Range("e3").Select gyo = 2 Do gyo = gyo + 1 brank = Worksheets("提供データ").Cells(gyo, 5).Text Loop While brank <> "" Range(Cells(3, 5), Cells(gyo, 5)).Select Selection.Copy Sheets("work").Select Range("c2").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False End Sub

  • エクセルのマクロで繰り返し処理

    当方マクロ初心者ですが下記のマクロをCheckBox0~CheckBox23についてコピーするセルを変化させながら繰り返し処理を行いたいのですが、簡単なループ処理で行えますか? 教えていただければ幸いです。 If CheckBox0.Value = True Then Worksheets("sheets1").Activate  行 = Worksheets("sheets1").Range("e7")   行 = 行   Worksheets("sheets1").Range("g7:t7").Copy Windows("Books1.xls").Activate Sheets("sheets1").Select Range(Cells(行, 15), Cells(行, 15)).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End If

  • Excel 繰り返しマクロ

    下記のようなマクロを使ってn個あるシートの内容を「集計」シートにコピーさせるようにしました。 (自動マクロとの組合せなので、スマートではないかもしれませんが) でも、これだと「集計」シートもコピー作業を行ってしまうので、 「集計」シートはコピー作業をしないように除外したいのですが、どうしたら良いのでしょう? 実際にはシート数は30程度、コピペ項目は1シートあたり30項目程度あります。 よろしくお願いします。 ------------------------- Sub テスト2() ' For i = 1 To Worksheets.Count '案件番号等コピー ' Sheets(i).Select Range("D3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("A4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '案件名 Sheets(i).Select Range("F3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("B4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '国名 Sheets(i).Select Range("E3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("C4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '選択セルの解放 Application.CutCopyMode = False '行挿入 ' Sheets("集計").Select Rows("4:4").Select Selection.Insert Shift:=xlDown Next i End Sub

  • マクロ編集プリントアウト

    Sheets("Sheet1").Select Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet4").Select Application.CutCopyMode = False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Sheets("Sheet1").Select Range("A9").Select Sheets("Sheet1").Select Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet4").Select Application.CutCopyMode = False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Sheets("Sheet1").Select Range("A15").Select これで2回プリントアウトされていることになります。 6行ずつ下方にデータが続いています。 データ行数は常に変化します。 dim i as long  for i = 3 to 99 step 6   if worksheets("Sheet1").cells(i, "A") = "" then    worksheets("Sheet2").range("A3:H8").value = worksheets("Sheet1").cells(i - 6, "A").resize(6, 8).value       end if  next i を使用してうまくまとめることはできるでしょうか?

  • 簡単マクロ編集

    Sheets("Sheet1").Select  ←Range("A3:H8") Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet4").Select Application.CutCopyMode = False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 下方にこの操作を繰り返ししたいのですが Dim i As Long Worksheets("Sheet1").Select For i = 3 To 100 Step 6 If Cells(i, "A") = "" Then Exit Sub End If Cells(i, "A").Resize(6, 8).Copy Destination:=Worksheets("Sheet2").Range("A3:H8") Next i 貼付けは値で貼り付けたいと思います。 どう組み合わせればよいですか?

  • エクセルマクロ 繰り返して、別のシートへコピーしたい

    エクセルマクロ 繰り返して、別のシートへコピーしたい マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、 どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 1行目から10行目まで繰り返したくて、 1行目から2行目のセルの移動の差は10行目までかわりません。 '1行目 Sheets("Sheet1").Select Range("B14:C14").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B15:C17").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False '2行目 Sheets("Sheet1").Select Range("B18:C18").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B19:C21").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B2").Select Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False

  • 複数のエクセルブックを統合し集計するマクロ

    各担当者の月毎の実績を集計するマクロを作ろうとしています。 *販売月、顧客名、金額などの見出しが各ブックの7行目まで、  8行目以降の行数は各担当者によって異なります。  (50行くらいの担当者もいれば300行くらいになる担当者も) *"E1"に販売月を入力し、4月から翌年3月までの実績、予算を入れるのですが、  担当者によっては空白の行を挿入しているため、  空白以降の行がカウントされず、うまく集計できません。 *各ブックの実績データの下で集計しているため、値の入っているセルを選択するのではなく、  実績データ部分だけコピーするにはどうしたら良いのでしょうか?  範囲に名前を付ければ良いのでしょうか?  マクロのことがよく分かっておらず、ネットや本を見て 使えそうなマクロを組み合わせて作ってみたのですが、 何か良い方法があれば教えて頂けると大変助かります。 説明も下手で恐縮ですが宜しくお願い致します。 ************************************ Workbooks.Open Filename:= _ "担当者A" _ , ReadOnly:=True '"貼付シート"にコピー、ファイルを閉じる Sheets(1).Select Cells.Select Selection.Copy Range("A8").Select Windows("貼り付けシートのあるブック").Activate Sheets("貼付シート").Select Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False Range("A1").Select Windows(2).Activate ActiveWorkbook.Close SaveChanges:=False '貼付シートの各担当者の見出し行を削除 Rows("1:7").Select Range("A1").Activate Selection.Delete Shift:=xlUp "統合シート"シートを新しいシート(Sheet1)として追加 Sheets("統合シート").Copy Before:=Sheets("統合シート") Sheets("統合シート (2)").Name = "Sheet1" '行数取得 Dim 件数 As Integer Dim 行数 As Integer '前回までの行数用 Dim 行数_Total As Integer '最終行用 Sheets("貼付シート").Select 販売月セルで入力行数をカウント(必須入力項目の為) Range("E1").Select Selection.CurrentRegion.Select 件数 = Selection.Rows.Count 行数 = 件数 + 8 'Headder分(7行)の次の担当者のスタート行数を足す '貼付シートからデータをコピーして貼り付け Sheets("貼付シート").Select Range(Cells(1, 2), Cells(件数, 49)).Select Selection.Copy Sheets("Sheet1").Select Range("B8").Select '元ファイルから値と書式を貼付 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False '最終行を前回最終行エリアへ移動 行数_Total = 行数 '貼付シートをクリア Windows("統合シート").Activate Sheets("貼付シート").Select Cells.Select Selection.Delete Shift:=xlUp Range("A1").Select

  • エクセル2000マクロエラー

    下記のマクロを実行すると、Sheets(M_KAKOBA(count)).Selectのロジックでインデック スが有効範囲にありません。というエラーメッセージがでます。 エクセルのツール→オプション→全般→新しいシートの数を2から3に変更すると エラーは発生しないのですが、エクセルのツール→オプション→全般→新しいシートの数を2 のままでエラーを出さないようにするには、ロジックを変更すればできるのでしょうか? ロジックの追加方法を教えてください。 Sub 送信() '変数の設定 Dim work, hensu, i, j Windows("加工品.xls").Activate work = Sheets("masta").Cells(3, 6).Text 'シート名の変更 Windows(F_NAME).Activate Sheets(M_KAKOBA(count)).Select ActiveSheet.Name = work Windows("加工品.xls").Activate Sheets(work).Select i = 5 Do i = i + 1 hensu = Cells(i, 5) Loop While hensu <> "" Range(Cells(1, 1), Cells(i + 1, 33)).Select Selection.Copy Windows(F_NAME).Activate Sheets(work).Select Range("a1").Select Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A2").Select End With Selection.BorderAround Weight:=xlThin, ColorIndex:=xlAutomatic ' '行の高さ If Worksheets(work).AutoFilterMode = False Then Range(Cells(5, 1), Cells(i + 1, 31)).Select Selection.AutoFilter End If End Sub

  • マクロの意味について

    下記の様なマクロがあります。意味が理解できていません。 教えてもらえないでしょうか。 Windows("aaa.XLS").Activate Dim tbl, gyo, burank Range("i4").Select Set tbl = ActiveCell.CurrentRegion tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count).Select Stop Selection.Copy Windows("bbb.XLS").Activate Sheets("ccc").Select Range("B2").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False Range("A2").Select Application.CutCopyMode = False ActiveCell.Formula = "=B2&C2&D2" Range("A2").Select Selection.Copy gyo = 0 Do gyo = gyo + 1 burank = Worksheets("ccc").Cells(gyo, 2).Text Loop While burank <> "" Range(Cells(3, 1), Cells(gyo - 1, 1)).Select    ActiveSheet.Paste Application.CutCopyMode = False Range("A2").Select

  • マクロが起動しない

    For k = 1 To 1 For i = 10 To 25 Cells(i, 21).GoalSeek Goal:=750, ChangingCell:=Cells(i, 18) ' Range("Z10:AA25").Select Selection.Copy Range("N10:O25").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Next Next ' End Sub というマクロで For i = 10 To 25 Range("Z10:AA25").Select Range("N10:O25").Select の3箇所の25という数字を26に書き換えると Cells(i, 21).GoalSeek Goal:=750, ChangingCell:=Cells(i, 18) の箇所がデバックを起こしてしまうのですが考えられる原因、または改善方法があったら教えてください。