マクロでのエラーについて

このQ&Aのポイント
  • エクセルのマクロエラーについて知りたいのですが、特定のコードが実行される時と実行できない時があります。どのような原因が考えられるでしょうか?
  • マクロエラー発生時のZoomプロパティの設定に関するエラーが発生しています。Zoomプロパティの設定方法を確認してください。
  • マクロエラーの原因の一つとして、PrintAreaの範囲設定不正が考えられます。PrintAreaの設定に問題がないか確認してください。
回答を見る
  • ベストアンサー

マクロでのエラーについて

エクセル2010 マクロエラーについて 以前 印刷について下記コードを提示して頂きました。 このコードが通る時と2回目の .Zoom = j で止まる時があります。 どなたか検証して頂き、何が原因なのかご教示頂けますでしょうか? 宜しくお願い致します。 Dim myRng As Range Dim i As Long Dim j As Long Dim k As Long j = 100 With ActiveSheet Set myRng = .Range("A1", .Cells(Rows.Count, "L").End(xlUp)).Resize(, 16) For i = 1 To myRng.Columns.Count If i = 11 Then .Columns(i).AutoFit End If Next i With .PageSetup .PrintArea = myRng.Address .Orientation = xlLandscape .PaperSize = xlPaperA4 .Zoom = j Do k = Application.ExecuteExcel4Macro("COLUMNS(GET.DOCUMENT(65))") If k = 1 Then Exit Do j = j - 1 .Zoom = j '”ここで実行時エラー1004” PageSetupクラスのZoomプロパティを設定できません” Loop End With .PrintOut Preview:=True .PageSetup.Zoom = 100 End With

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

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

こんばんは。 そのコードのエラーは、もともと想定済みなのですが、注意点として、あまりも古い問題なので、今さらということで、曖昧にしていました。もちろん、Microsoft側も、曖昧なままにしています。たぶん、現在のバージョンまで直っていないと思います。 この話は、Microsoft Support に残っているかもしれませんが、趣旨は、Zoomなど、画面全体に影響するものは、印刷の設定自体が狂うことがあるそうです。当然ですが、無理な部分のあるコードです。 k = Application.ExecuteExcel4Macro("COLUMNS(GET.DOCUMENT(65))") これは、横方向のページ改行の数を取得しようとしたコードです。 それで、ワザと、マクロ関数を使ったわけです。VBAメソッドでは、かなりのタイムロスが生じるためです。 しかし、それが逆に災いしてしまったようです。 今考えられるのは、2つの方法です。 例えば、  If k = 1 Then Exit Do   j = j - 1   .PrintArea = myRng.Address '*   .Orientation = xlLandscape '*   .PaperSize = xlPaperA4 '*   .Zoom = j Loop とフルに入れる方法と、もうひとつは、設定が安定するのを待たせるために、ループのスピードを落とす方法です。 モジュール画面の一番上に Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) と入れておいて、   Do    k = Application.ExecuteExcel4Macro("COLUMNS(GET.DOCUMENT(65))")    If k = 1 Then Exit Do    j = j - 1    .Zoom = j    DoEvents '*    Sleep 500 '*500/1000秒 'スピードの調整。二度目からの安定を図る   Loop このどちらかだと思います。Waitでも良いのですが、Sleepという、Win32API関数を使う理由は、メモリ負担を減らす目的です。なお、これで直らない場合は、エラー・トラップ(On Error Goto ~)を設定してください。事前には、なかなか書きにくかったことで、ご面倒をかけましたが、よろしくご了解願います。

maron1010
質問者

お礼

申し訳なく思いつつも、大変感謝しています。 体調は如何でしょうか? 提示して頂いた修正コード2点ですが、 実際に動かしましたところ、最初のフルに入れる方法を活用させて頂きます。 2点目のコードだと、同じく .Zoom = j のところでエラーが発生してしまい、 またOn Error Goto ~を用いてもエラーは回避しても時間が掛かるため 最初のコード(こちらもやや時間はかかりますが)の方が 確実性があるように感じましたので、そちらを使用させて頂きます。 過去に遡り多々ご迷惑をお掛けしました事、申し訳ありませんでした。 しかし、その後素人の悪あがきで、試行錯誤しながら手を変え品を変え コードを書き換えたりしていましたら、ほぼ思い通りの形となりました。 当初、想定していたもの以上のものが出来るようで、本当に感謝しています。 ありがとうございました。

その他の回答 (1)

  • kkkkkm
  • ベストアンサー率65% (1602/2439)
回答No.1

Do~Loopでjが減算されていますがそこがマイナスになるということは無いですか。

関連するQ&A

  • 二つのマクロで一気に処理したい

    以下のようなことができるのかお伺い致します。よろしくお願い致します。  やりたいこと   ※ 前提として、sheet1にすでにA列に通し番号で奇数の数字が入っている。    1.sheet1からsheet2へコピペーストする。しかし、A列からO列のすべてにデータがあった場合のみコピー貼り付けさせたい。     (前提で示したように、A列に通し番号で奇数の数字が入っていて、A列のみ数字があり、以外が空欄の行があるため)    2.下記のコピー貼り付けのコードと重複削除のコードを合体させて、一つの処理で動かしたい。 Sub コピー貼り付けつけ()  'コピー貼り付けつけのコード Dim lastRow As Long 'Sheet1のA3から最終行までをコピー With Sheets("sheet1") .Range("A3:O" & .Cells(Rows.Count, "A").End(xlUp).Row).Copy End With 'Sheet2のA列の最終行の次の行に貼付け Sheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Application.CutCopyMode = False End Sub Sub 重複データを一括削除する() ' Macro1 Macro Dim i As Long, lastRow As Long, myRng As Range LastRow = Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To lastRow - 1 If WorksheetFunction.CountIf(Range(Cells(i + 1, "O"), Cells(lastRow, "O")), Cells(i, "O")) > 0 Then If myRng Is Nothing Then Set myRng = Cells(i, "O") Else Set myRng = Union(myRng, Cells(i, "O")) End If End If Next i If Not myRng Is Nothing Then myRng.EntireRow.Delete End If End Sub

  • VBA マクロ実行にてエラーが出ますが、原因を教えてください

    下記コードを実行すると、myCell.Selectのところで 実行時エラー’91’ オブジェクト変数またはWithブロック変数が設定されていません。 というエラーが出るのですが、どうすれば対策出来るのでしょうか? Sub test() Dim i As Long Dim myCell As Range With Range("A1").CurrentRegion For i = 2 To .Rows.Count Step 2 If i = 2 Then Set myCell = .Rows(i) Else Set myCell = Application.Union(myCell, .Rows(i)) End If Next i End With myCell.Select End Sub

  • 素数を求めるマクロを

    走らすと暴走したようになり、素数=151で止まります。 どこが悪いのでしょうか。正常に終わるようにしたいです。 ====================== Sub 素数を求める()   Dim i As Long   Dim j As Long   Dim m As Long   Dim p As Long   Dim flg As Boolean   i = 1   j = 1   p = 2   Do     flg = False     For m = 2 To Int(Sqr(p))       If p Mod m = 0 Then         flg = True         Exit For       End If     Next     If flg = False Then       Cells(i, j) = p       i = i + 1       If i > Rows.Count Then         i = 1         j = j + 1       End If     End If     p = p + 1   Loop End Sub ======================

  • EXCEL VBA4行毎に枠で囲みたい

    お世話になります。 添付の様な表1があります。 これを表2のようにA1から順に4行毎に枠で囲みたいのです。 下記のようなコードを見よう見まねで書いてみましたがうまく動きません。 ごなたかご教授いただけませんでしょうか? よろしくお願い致します。 Dim i As Long Dim j As Long Dim lngYCnt As Long Dim intXCnt As Long Dim LastRow As Long ingYCnt = Worksheets("Sheet1").UsedRange.Rows.Count intXCnt = Worksheets("Sheet1").UsedRange.Columns.Count LastRow = Cells(Rows.Count, 1).End(xlUp).Row With Selection For i = 5 To LastRow Range("A" & i & ":F" & j).Select Selection.BorderAround Weight:=xlMedium j = j + 5 i = i + 5 Next End With どなたかご教授いただけませんでしょうか? よろしくお願い致します。 環境 EXCEL2003 WINDOWS XP SP3

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

    Sub search() Dim i As Long, lastCol As Long, c As Range, str As String, wS As Worksheet Set wS = Worksheets("sheet2") wS.Cells.Clear str = Application.InputBox("検索内容を入力") Application.ScreenUpdating = False With Worksheets("sheet1") lastCol = .Cells(1, Columns.Count).End(xlToLeft).Column .Columns(lastCol + 1).Insert For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row Set c = Range(.Cells(i, "A"), .Cells(i, lastCol)).Find(what:=str, LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then .Cells(i, lastCol + 1) = 1 End If Next i If WorksheetFunction.CountIf(.Columns(lastCol + 1), 1) > 0 Then .Range("A1").AutoFilter field:=lastCol + 1, Criteria1:=1 .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy wS.Range("A1") wS.Columns.AutoFit wS.Columns(lastCol + 1).Delete wS.Activate .Columns(lastCol + 1).Delete .AutoFilterMode = False Else MsgBox "該当データなし" End If End With Application.ScreenUpdating = True End Sub エクセルで上のシステムをネットから持ってきました。 上から5行目のinputboxを"Sheet3"のA列からデータを持ってきてプルダウンで表示させたいのですがユーザーフォームでオブジェクトを組まないで表示させる方法を教えてください

  • シート1の氏名をシート2に反映

    sheet1の氏名をsheet2の日付、記号(A,B,C)にマッチした位置に入力させたいのですが下記コードで他で試したのですがうまくいきません。どなたかコードが解る方よろしくお願いします。 Sub 入力() Dim i As Long, j As Long, k As Long, L As Long Dim wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") i = wS2.Range(wS2.Cells(6, 1), wS2.Cells(8, 1)) j = wS2.Cells(3, Columns.Count).End(xlToLeft).Column Range(wS2.Cells(3, 2), wS2.Cells(i, j)).ClearContents On Error Resume Next For i = 2 To wS1.Cells(Rows.Count, 4).End(xlUp).Row If WorksheetFunction.CountA(wS1.Rows(i)) > 1 Then For j = 2 To wS1.Cells(i, Columns.Count).End(xlToLeft).Column If wS1.Cells(i, j) <> "" Then k = WorksheetFunction.Match(wS1.Cells(i, 4), wS2.Range(wS2.Cells(6, 1), wS2.Cells(8, 1)), False) L = WorksheetFunction.Match(wS1.Cells(5, j), wS2.Rows(3), False) wS2.Cells(k, L) = wS1.Cells(i, j) End If Next j End If Next i End Sub

  • シートの保護が原因でできない?

    シートの保護をすると下記のコードでエラーが出ます rabgeクラスのinsertメソッドが失敗しましたとなります。 原因はわかりますでしょうか? エクセル2010です。 ユーザーに許可する操作としてロックされていないセル範囲の選択と列の挿入を選択しています。 エクセル2010です。 お手数かけますがよろしくお願いします。 Dim n As Long Application.ScreenUpdating = False ' 画面描画を抑制 Range("J:J").Insert With Range("B5:J11") .Columns(.Columns.Count).FormulaR1C1 = "=IF(RC4<>"""",1,"""")" n = WorksheetFunction.Count(.Columns(.Columns.Count)) .Sort Key1:=.Columns(.Columns.Count), Orientation:=xlTopToBottom If n < .Rows.Count Then ' 消去する範囲から E列を除いて消去する Intersect(.Parent.Range("B:D,F:I"), _ .Rows(n + 1).Resize(.Rows.Count - n)).ClearContents End If End With Range("J:J").Delete Application.ScreenUpdating = True ' 画面描画を通常に

  • エクセル重複行統合マクロの意味

    Tom04さんの回答で 以下のとても素晴らしいマクロがあり、 使用させていただきたいのですが、 詳細がわかりません。 少々編集して自分の書類に反映させていただきたく、 マクロの内容を教えていただけませんか? Sub test() 'この行から Dim i, j, k, L As Long Application.ScreenUpdating = False For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 For j = 2 To Cells(1, Columns.Count).End(xlToLeft).Column + 1 For k = Cells(Rows.Count, j).End(xlUp).Row To 2 Step -1 If Cells(k, j) <> "" And WorksheetFunction.CountIf _ (Range(Cells(2, 1), Cells(k, 1)), Cells(k, 1)) > 1 Then L = WorksheetFunction.Match(Cells(k, 1), Columns(1), False) Cells(k, j).Cut Destination:=Cells(L, j) End If Next k Next j Next i For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 If WorksheetFunction.CountA(Rows(i)) = 1 Then Rows(i).ClearContents End If Next i Application.ScreenUpdating = True End Sub 'この行まで

  • マクロエラー処理

    下記のマクロを実行すると、If (.Range のところでコンパイルエラー参照が不正または不完全です。というメッセージが出るのですが、どこを修正すればよいのでしょうか 教えてください。 Sub 再表示1() Dim SheetName As String Dim i As Integer Dim LastRow As Integer Dim rng As Range LastRow = 3000 '最終行の番号 Sheets("ACT").Select For i = 6 To LastRow If (.Range("D" & i) = "A310" Or .Range("D" & i) = "A505") And .Range("V" & i) < 0 Then .Cells(i, "W").Resize(1, 3).ClearContents End If Next Stop End With End Sub

  • VBAでの質問

    お世話になります。 下記の記述で、「←」の矢印の記述で、 Cells.(5,2)がブランクでなければ、 「→」から進めたいのですが、 どの様に記述すれば宜しいでしょうか ご教示お願いします。 Sub 表記入() Dim Data As Range Dim i As Integer Dim j As Integer Dim k As Integer Set Data = Sheets("集計").Range("A2").CurrentRegion j = 16 k = 0 With Sheets("表") For i = 3 To Data.Rows.Count If Data.Cells(i, 51) <> "" Then .Cells(5, 2) = Data.Cells(i, 3)  ← .Cells(5, 7) = Data.Cells(i, 4) → .Cells(j, 2) = Data.Cells(i, 10) .Cells(j, 6) = Data.Cells(i, 11) & Data.Cells(i, 12) .Cells(j, 14) = Data.Cells(i, 51) Else End If k = k + 1 If k = 10 Then j = j + 18 k = 0 Else j = j + 1 End If End If Next i End With End Sub

専門家に質問してみよう