• 締切済み

エクセル2010でマクロが動きません

こんにちは。 マクロ超初心者です。 頑張ってエクセル2016でマクロ作成しましたが、エクセル2010で途中から動かず…。 何が悪いんでしょうか… ここから動きません…と書いたところから動きません(涙) Private Sub シート編集_Click() Application.ScreenUpdating = False Dim i Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim Sh4 As Worksheet Set Sh1 = Worksheets("あ") Set Sh2 = Worksheets("い") Set Sh4 = Worksheets("う") Dim dayCutoff As Date dayCutoff = Application.InputBox("年月日を入力してください", "お支払期限 年月日を入力", Format(Date, "yyyy/mm/dd")) Sh4.Range("D12").Value = DateSerial(Year(dayCutoff), Month(dayCutoff) + 2, 0) 'お支払期限 dayCutoff = Application.InputBox("年月日を入力してください", "請求書発行 日を入力", Format(Date, "yyyy/mm/dd")) Sh4.Range("AC3").Value = Format(Date, "yyyy/mm/dd") '発行日 Sh1.Cells.Clear With Sh1 'edit .Range("A2") = "番号" .Range("B2") = "会社名" .Range("C2") = "判定" .Range("D2") = "契約番号" .Range("E2") = "拠点" .Range("F2") = "税率" .Range("G2") = "月額(税抜)" .Range("H2") = "消費税" .Range("I2") = "月額(税込)" .Range("J2") = "今回" .Range("K2") = "全回" .Range("L2") = "店番" ここから動きません………… For i = 3 To Sh2.Cells(.Rows.Count, 1).End(xlUp).Row .Cells(i, 1) = Sh2.Cells(i, 2) .Cells(i, 2) = Sh2.Cells(i, 4) .Cells(i, 4) = Sh2.Cells(i, 3) .Cells(i, 5) = Sh2.Cells(i, 4) & "(" & Sh2.Cells(i, 6) & ")" .Cells(i, 6) = Sh2.Cells(i, 9) & "%課税" .Cells(i, 7) = Sh2.Cells(i, 8) .Cells(i, 8) = Sh2.Cells(i, 10) .Cells(i, 9) = Sh2.Cells(i, 11) .Cells(i, 10) = Sh2.Cells(i, 12) .Cells(i, 11) = Sh2.Cells(i, 7) .Cells(i, 12) = Sh2.Cells(i, 2) If Sh1.Cells(i, 10) > Sh1.Cells(i, 11) Then .Cells(i, 3) = "×" Else .Cells(i, 3) = "〇" End If If Sh1.Cells(i, 3) = "×" Then .Cells(i, 2) = "" End If Next i End With '空白行を削除 Dim j As Integer, myFlag As Boolean Dim c As Range With Worksheets("edit").Range("A2").CurrentRegion For j = .Rows.Count To 2 Step -1 myFlag = False For Each c In .Cells(j, 2) If c.Value <> "" Then myFlag = True Exit For End If Next If myFlag = False Then .Rows(j).Delete End If Next End With MsgBox "データの転記が終わりました" End Sub

みんなの回答

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.5

>i=3となったのですが デバッグの方法はそれであっていると思います。 ただ、今回のポイントはそこではなく、 >Sh2.Cells(.Rows.Count, 1).End(xlUp).Row この値が正しく表の最終行となっているか、 >Sh2.Cells(i, 2) この値で正しく表の値をとれているかです。 ステップ実行でどこに誤りがあるのかを確認することで 修正ポイントがわかると思います。

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.4

For i = 3 To Sh2.Cells(Sh2.Rows.Count, 1).End(xlUp).Row ここにブレークポイントを設定して、 .Rows.Countが想定した値が入っているか 次の行へ移動して Sh2.Cells(i, 2)に値が入っているか ステップ実行でデバッグすることをお勧めします。

belltheelmo0615
質問者

お礼

アドバイスありがとうございます! 2016のほうも2010のほうもi=3となったのですが…ブレークポイントが初めてでネットで調べながらやってみたのですが、合っていますでしょうか…?

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.3

With Sh1 'edit (中略) For i = 3 To Sh2.Cells(.Rows.Count, 1).End(xlUp).Row (中略) End With Sh2.Cells(.Rows.Count, 1) の .Rows.Countの取り扱いが Excel2016と2010で違うのかも知れませんね。私の環境に 2016がないので確認できませんが… Rows.Countはワークシートの全行数です。その前に . がありますから、Sh2.Cells(.Rows.Count, 1)は、 Sh2.Cells(Sh1.Rows.Count, 1) です。 Sh2の1列目全部を指定するのに Sh1の全行数を使用するのは、個人的には違和感があります。 Excel2016は、その違和感を許すが 2010は許さないということでしょうか。

belltheelmo0615
質問者

お礼

ありがとうございます。 とりあえず毎回行数がかわるシートの内容を別シートに貼り付けられればありがたいんですが… なんでできないのか、謎です

belltheelmo0615
質問者

補足

ありがとうございます! 試してみたのですが、変わらずでした… 最後にメッセージは表示されるので、シートの内容のコピーができないみたいです。

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.2

Sh2.Cells(.Rows.Count, 1).End(xlUp).Row Sh2.Rows.Count では?

belltheelmo0615
質問者

お礼

ありがとうございます! 内容を単にコピペだけのマクロにしてみたんですが、それでもデータが空欄のままでした。 何が原因なんでしょう…

belltheelmo0615
質問者

補足

ありがとうございます! 試してみたのですが、こちらも変わらずでした… 最後にメッセージは表示されるので、シートの内容のコピーができないみたいです。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

エラーなく動きましたよ Private Sub CommandButton1_Click()   Application.ScreenUpdating = False   Dim i   Dim Sh1 As Worksheet   Dim Sh2 As Worksheet   Dim Sh4 As Worksheet   Set Sh1 = Worksheets("あ")   Set Sh2 = Worksheets("い")   Set Sh4 = Worksheets("う")   Dim dayCutoff As Date   dayCutoff = Application.InputBox("年月日を入力してください", _       "お支払期限 年月日を入力", Format(Date, "yyyy/mm/dd"))   Sh4.Range("D12").Value = DateSerial(Year(dayCutoff), _       Month(dayCutoff) + 2, 0) 'お支払期限   dayCutoff = Application.InputBox("年月日を入力してください", _       "請求書発行日を入力", Format(Date, "yyyy/mm/dd"))   Sh4.Range("AC3").Value = Format(Date, "yyyy/mm/dd") '発行日   Sh1.Cells.Clear   With Sh1 'edit     .Range("A2").Resize(, 12).Value = Array("番号", "会社", "判定", _           "契約番号", "拠点", "税率", "月額(税抜)", "消費税", _           "月額(税込)", "今回", "全回", "店番") 'ここから動きません…………     For i = 3 To Sh2.Cells(Sh2.Rows.Count, 1).End(xlUp).Row       .Cells(i, 1) = Sh2.Cells(i, 2)       .Cells(i, 2) = Sh2.Cells(i, 4)       .Cells(i, 4) = Sh2.Cells(i, 3)       .Cells(i, 5) = Sh2.Cells(i, 4) & "(" & Sh2.Cells(i, 6) & ")"       .Cells(i, 6) = Sh2.Cells(i, 9) & "%課税"       .Cells(i, 7) = Sh2.Cells(i, 8)       .Cells(i, 8) = Sh2.Cells(i, 10)       .Cells(i, 9) = Sh2.Cells(i, 11)       .Cells(i, 10) = Sh2.Cells(i, 12)       .Cells(i, 11) = Sh2.Cells(i, 7)       .Cells(i, 12) = Sh2.Cells(i, 2)       If Sh1.Cells(i, 10) > Sh1.Cells(i, 11) Then         .Cells(i, 3) = "×"       Else         .Cells(i, 3) = "〇"       End If       If Sh1.Cells(i, 3) = "×" Then         .Cells(i, 2) = ""       End If     Next i   End With '空白行を削除   Dim j As Integer, myFlag As Boolean   Dim c As Range   With Worksheets("edit").Range("A2").CurrentRegion     For j = .Rows.Count To 2 Step -1       myFlag = False       For Each c In .Cells(j, 2)         If c.Value <> "" Then           myFlag = True           Exit For         End If       Next       If myFlag = False Then         .Rows(j).Delete       End If     Next   End With   MsgBox "データの転記が終わりました" End Sub

関連するQ&A

  • マクロで質問します。

    初心者です。 下記のようなマクロの式があるのですが、条件を一つ増やしたいのですが、 イロイロ試してみたのですが、うまくゆきませんので教えてください! Sub 給与支払一覧() Application.ScreenUpdating = False Dim Sh As Worksheet For Each Sh In Worksheets If Sh.Name <> "給与支払一覧" And Sh.Name Like "Sheet*" Then With Worksheets("給与支払一覧") If Sh.Range("D14").Value > 0 Then With .Cells(.Rows.Count, 1).End(xlUp).Offset(1) Sh.Range("O2:X14").Copy .Cells(1) .Resize(13, 10).Value = Sh.Range("O2:X14").Value End With End If End With End If Next Sh Set Sh = Nothing End Sub この中で If Sh.Range("D14").Value > 0 Then とありますが、 同じ条件で I14も 0より大きいな時としたいのですが、 うまくゆきませんでした。 たぶん基本できな簡単な事と思いますが 分かりません。 If Sh.Range("D14").Value > 0 Then If Sh.Range("I14").Value > 0 Then 並べてみたり If Sh.Range("D14、I14").Value > 0 Then こんなのや If Sh.Range("D14、I14").).Value > 0 Then このような事も 他にも笑われるようなことも・・・・・ よろしくお願いします。

  • このマクロの意味を教えてください。

    このマクロの意味を教えてください。 このマクロの意味を教えてくれませんか?変な質問で申し訳ありません。というのも、先日インターネットからひろってそのままま真似して使っていたのですが、不具合が起こってしまいました。 しかし、どこからひろったのかどう検索しても見つからず、自分で不具合の原因がわからないのです。 どなたか、教えていただけないでしょうか。 このひとつひとつのマクロの意味を教えていただけたら大変助かります。 Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("元データ") Set sh2 = Worksheets("RMA") '-- d = sh1.Range("a65536").End(xlUp).Row For i = 2 To d If sh1.Cells(i - 1, "E") <> "" Then sh2.Cells(1, "A") = i - 1 sh2.Range("A2:I51").PrintOut End If Next i End Sub

  • エクセルで集計表を作成するマクロで悩んでいます。

    エクセルで集計表を作成するマクロで悩んでいます。 日付ごとにシート別に分かれたデータを「集計表」として新しいシートに集めたいと思っています。 ●元データに関して  1行目は空欄  2行目は表の名前  3行目は日付  4~7行目は番号・数量などの項目  8行目から多い場合で50行目くらいまで番号ごとの情報が並んでいます。  AC列まで並んでいます。・・・・・・●画像左上が元データ ●このファイルから、(1)集計表という新しいシートを作成して(2)そのファイルに日付ごとの データが下方向に集まるように集計したいと思っています。 そこで、次のVBAを作成しました。 Sub 集計表() Dim ws As Worksheet For Each ws In Worksheets ’AD列にシート名を入れる ws.Range("AD1:AD100").Value = ws.Name Next ws Dim newSh As String Dim Sh As Worksheet, myFlag As Boolean newSh = "集計表" myFlag = False For Each Sh In ThisWorkbook.Worksheets If Sh.Name = newSh Then myFlag = True '----全データシートのデータをクリアし、先頭へ移動します Worksheets(newSh).Cells.ClearContents Worksheets(newSh).Move before:=Sheets(1) Exit For End If Next Sh '----全データシートを先頭へ追加します If myFlag = False Then ActiveWorkbook.Worksheets.Add(before:=Worksheets(1)).Name = newSh End If Worksheets(2).Select Rows("1:1").Select Application.CutCopyMode = False Selection.Copy Sheets("集計表").Select ActiveSheet.Paste Dim i As Integer Dim lRow As Long, lCol As Long, lRow2 As Long Application.ScreenUpdating = False '----列見出しをコピーします Worksheets(2).Range("1:1").Copy Worksheets(1).Range("A1") For i = 2 To Worksheets.Count With Worksheets(i) lRow = .Cells(Rows.Count, 1).End(xlUp).Row lCol = .Cells(1, Columns.Count).End(xlToLeft).Column '----シートのデータが8行以上の場合にコピーします If lRow >= 8 Then lRow2 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1 .Activate .Range(Cells(2, 1), Cells(lRow, lCol)).Copy Worksheets(1).Cells(lRow2, 1) End If End With Next i Worksheets(1).Activate Range("A1").Select Application.ScreenUpdating = True End Sub この方法だと、「番号」などを含むシートごとの全ての情報がコピーされてしまいます。 ●左下画像 これを「(1)1枚目のシートの1行目から7行目(2)1枚目シートの8行目からA列に1以上の番号が 入っている行(3)2枚目シートの8行目からA列に1以上の番号が入っている行(4)3枚目シートの・・・」というように全てのシートに対して集計することはできないでしょうか。 ●右下画像 VBAを始めたばかりなので、まだ、あまり理解できていません。

  • エクセルのマクロで教えてください

    いつもお世話になっています。 先日、こちらのサイトでマクロをコピーさせて頂いて使っていました。 以下のようなマクロです ub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("統合表") j = 2 '統合表のデータ書きこみ開始行 For Each sh2 In ActiveWorkbook.Worksheets If sh2.Name = "統合表" Then Exit For '統合表は統合対象外 d = sh2.Range("A65536").End(xlUp).Row '各シートの最終行を知る ' MsgBox d For i = 63 To d '各シートの開始行2から最終行まで統合表に移す sh1.Cells(j, "C") = sh2.Cells(i, "C") sh1.Cells(j, "Q") = sh2.Cells(i, "Q") sh1.Cells(j, "T") = sh2.Cells(i, "T") sh1.Cells(j, "AM") = sh2.Cells(i, "AM") sh1.Cells(j, "AR") = sh2.Cells(i, "AR") sh1.Cells(j, "AU") = sh2.Cells(i, "AU") sh1.Cells(j, "BB") = sh2.Cells(i, "BB") sh1.Cells(j, "BI") = sh2.Cells(i, "BI") '列数だけこの後にコードを増やすこと j = j + 1 '統合表の直下行をポイント Next i Next End Sub このマクロでは2行目から以降を呼んでくることになっていますが、これを2行目から60行目までだけ呼んでくるようにしたいのです。 どうしたら良いか教えていただけないでしょうか? つたない文章ですみません。 よろしくお願いします。

  • マクロの式について教えてください!

    マクロの式について教えてください! 他で使っていたマクロを書き換えて流用してますが、 エラーなどの表示は、出ないのですが、動きません。 考えられる問題を 教えてください。 おねがいします。 下のような式をつかってます。 Sub 給与支払一覧() Application.ScreenUpdating = False Dim Sh As Worksheet For Each Sh In Worksheets If Sh.Name <> "給与支払一覧" And Sh.Name Like "Sheet*" Then With Worksheets("給与支払一覧") If Sh.Range("H5").Value > 0 Then With .Cells(.Rows.Count, 1).End(xlUp).Offset(1) Sh.Range("L1:T5").Copy .Cells(1) .Resize(5, 9).Value = Sh.Range("L1:T5").Value End With End If End With End If Next Sh Set Sh = Nothing End Sub おねがいします。

  • 2枚のエクセルのシートを図のように統合させる

    2枚のエクセルのシートを統合させるやり方を教えて下さい。 (同じ項目に2人の人が答えている場合2行に分けることはできますか。) 以前こちらで質問させていただいたとき、 Sub test() Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim Sh3 As Worksheet Set Sh1 = Workbooks("book1.xls").Sheets("Sheet1") Set Sh2 = Workbooks("book2.xls").Sheets("Sheet1") Set Sh3 = Workbooks("book3.xls").Sheets("Sheet1") Sh1.Range("B5").CurrentRegion.Copy Sh3.Range("B5") With Sh2.Range("B5").CurrentRegion .Resize(.Rows.Count - 1).Offset(1).Copy Sh3.Cells(Sh3.Rows.Count, "B").End(xlUp).Offset(1) End With With Sh3 Dim r As Long For r = .Cells(.Rows.Count, "B").End(xlUp).Row To 6 Step -1 If .Cells(r, "C").Value = "" Then .Rows(r).Delete Next r .Range("B5").CurrentRegion.Sort Key1:=.Range("B6"), Order1:=xlAscending, Header:=xlYes For r = .Cells(.Rows.Count, "B").End(xlUp).Row To 6 Step -1 If .Cells(r, "B").Value = .Cells(r - 1, "B").Value Then .Cells(r, "B").ClearContents Next r End With End Sub というコードを教えていただいたのですが、項目の中があいうえお順になってしまいうまくいきません。 そして、途中に項目があったりしてこれは1つだけ表示されるようにできますか? 説明が足りないところは、補足いたします。 いきなり部署を異動させられて今までやったことないようなことをやっています(涙) どなたか教えて下さいよろしくお願いします。

  • エクセルのマクロについて教えて下さい。

    エクセル2000を使用している初心者です。 マクロは昨日ここで、ご指導いただいたばかりです。 過去ログを参考にあるホームページから 赤いフォントを数えるマクロを、カレンダーの 年間休日数を数えるためにコピーしました。 1日かかって、動作する様にはなったのですが 私が範囲指定している場所の個数より多く、また シート全体の赤いフォントの個数よりも多い様なので す。以下にコピーしますのでどこがおかしいのか ご指導願えないでしょうか。 Sub 休日検索() Dim myRng As Range Dim myFlag As Byte Dim myBoldCnt As Long, myRedCnt As Long Dim myBoldOrRedCnt As Long, myBoldAndRedCnt As Long For Each myRng In Range("検索範囲")※私の書き換えたのはここだけ myFlag = 0 With myRng If .Font.Color = RGB(255, 0, 0) Then myFlag = myFlag + 1 If .Font.Bold Then myFlag = myFlag + 2 End With If myFlag And 1 Then myRedCnt = myRedCnt + 1 If myFlag And 2 Then myBoldCnt = myBoldCnt + 1 If myFlag And 3 Then myBoldOrRedCnt = myBoldOrRedCnt + 1 If myFlag = 3 Then myBoldAndRedCnt = myBoldAndRedCnt + 1 Next MsgBox "太字" & vbtab & vbtab & myBoldCnt & vbcrlf _ & "赤" & vbtab & vbtab & myRedCnt & vbcrlf _ & "太字または赤" & vbtab & myBoldOrRedCnt & vbcrlf _ & "太字かつ赤" & vbtab & myBoldAndRedCnt End Sub

  • Excel 2007 マクロのIF構文について

    Excel 2007 マクロのIF構文について Sheet1からSheet2にIF構文を使用して、 必要な情報を転記するマクロです。 下記マクロで実現できているのですが、IF構文が多く もっと効率的なマクロがあるのではないかと考えています。 IF構文が2つありますが、1つにまとめるマクロがありましたら お教えください。 Sub Rist() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '「Sheet1」シートを更新 Worksheets("Sheet1").Range("A1").ListObject.QueryTable.Refresh BackgroundQuery:=False '「Sheet1」シートから「Sheet2」シートに転記 For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row For j = 2 To ws2.Cells(Rows.Count, 13).End(xlUp).Row '「Sheet1」シートのL列から「Sheet2」シートのS列に転記 If ws2.Cells(j, "M") = ws1.Cells(i, "A") Then ws2.Cells(j, "S") = ws1.Cells(i, "L") End If '「Sheet1」シートのG列から「Sheet2」シートのQ列に転記 If ws2.Cells(j, "M") = ws1.Cells(i, "A") Then ws2.Cells(j, "Q") = ws1.Cells(i, "G") End If Next j Next i End Sub

  • マクロに手を加えたいのですが・・・・・

    マクロに手を加えたいのですが・・・・・ 下記のマクロの式があるのですが、全シートの AK8にデーターが0以上だったら 指定の範囲のデーター週払い一覧にコピーしなさいと、 書いてあるのだと おもうのですが・・・ (素人なので、分かりませんが) これだと 1件だけ要らないデーターを読みこんでしまいます。 色んなシート名が有りますが、 欲しいデータのあるシート名は、 必ずSheet番号となっているので、 Sheet1~Sheet50までのデーターから (シートNOは、増えたりします) Sheetの名前から 始まる等の指定をしたいのですが、 どのように 書き換えればよろしいでしょうか、 Sub test() Application.ScreenUpdating = False Dim Sh As Worksheet For Each Sh In Worksheets If Sh.Name <> "週払一覧" Then With Worksheets("週払一覧") If Sh.Range("AJ8").Value > 0 Then With .Cells(.Rows.Count, 1).End(xlUp).Offset(1) Sh.Range("AB3:AK8").Copy .Cells(1) .Resize(6, 10).Value = Sh.Range("AB3:AK8").Value End With End If End With End If Next Sh Set Sh = Nothing End Sub 私の勘ですが(笑) If Sh.Range("AJ8").Value > 0 Thenの IF Shを If sh"" とか Sh(" ") とか Sh(i)とか@とか やりましたが 、できませんでした、 初歩的な事でしょうが、 教えてください お願いします。

  • エクセル 最終行からの連続コピー

    エクセルで最終行から上に連続する10行(最終行含む)をコピーしたいです。 途中、空白行が含まれている場合でも、最終行を特定し、コピーできるようにするには、下記のコードにどう手を加えたらよいでしょうか? どなたかアドバイスをお願いします。 Sub Test()   Dim i As Long   Dim j As Integer   Dim rng As Range   With ActiveSheet     'フィルタ     .Range("A1").CurrentRegion.AutoFilter Field:=1          '行選択     With .AutoFilter.Range       For i = .Cells(.Cells.Count).Row To 2 Step -1         If .Rows(i).Hidden = False Then           If rng Is Nothing Then             Set rng = .Rows(i)           Else             Set rng = Union(rng, .Rows(i))           End If           j = j + 1         End If         If j >= 10 Then Exit For       Next i       'コピー       If Not rng Is Nothing Then         rng.Copy Worksheets("Sheet2").Range("A1")         Beep       Else         MsgBox "該当行は存在しません。", 48       End If     End With   End With   Set rng = Nothing なお、コードはこちらを参考にさせていただきました。 http://okwave.jp/qa3552420.html?ans_count_asc=1

専門家に質問してみよう