EXCELのVBAでセル値の移動でエラー

このQ&Aのポイント
  • EXCEL2002のVBAでセル値の移動を行う際、1行分の移動は正常に行えますが、2行分の移動を行うとエラーが発生します。エラーコードは実行時エラー1004です。このエラーの原因を特定することができません。
  • 2行目を移動させる際にエラーが発生しています。なぜエラーが発生するのか理由が分かりません。エラーを回避しながら2行目を移動させる方法を教えてください。
回答を見る
  • ベストアンサー

EXCELのVBAでセル値の移動でエラー

EXCEL2002のVBAでセル値の移動をVBAでやりたいのですが (1)の様に1行は出来るのですが、(2)の様に2行を移動させるとエラー (実行時エラー1004 アプリケーション定義またはオブジェクト定義のアラーです。)が出てしまいます。 (2)のマクロでどうしてエラーが出るのか分かりません。 エラーを出さずに2行目を移動させる方法を教えてください。 (1)_________________________________________________ If Range("L1") <> detachn Then i = 9 While i >= 1 Cells(1, i + 13).Value = Cells(1, i + 12).Value i = i - 1 Wend Cells(1, 13).Value = Range("L1").Value datachn = Range("L1").Value End If (2)_______________________________________________ If Range("L1") <> detachn Then i = 9 While i >= 1 Cells(1, i + 13).Value = Cells(1, i + 12).Value Cells(2, i + 13).Value = Cells(2, i + 12).Value ←ここでエラー i = i - 1 Wend Cells(1, 13).Value = Range("L1").Value Cells(2, 13).Value = Range("L2").Value datachn = Range("L1").Value End If

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

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

再び、#1の GreatDragon です。 ワークシートモジュールに記述されていたのですね。 それでは動作がおかしくなったり、エラーが発生するのは当然です。 ユーザがシートを変更  ↓ イベントプロシージャの自動実行  ↓ プロシージャによる1箇所のセルの変更  ↓ プロシージャが実行途中でもイベント発生のため、 更にイベントプロシージャを自動実行  ↓ プロシージャによる1箇所のセルの変更  ↓ プロシージャが実行途中でもイベント発生のため、 更にイベントプロシージャを自動実行 という具合に、おかしな動きをしてしまいます。 なので今回の場合、イベントを一時的に無効にしてみてください。 (例) Option Explicit Dim i As Integer Dim datachn As Integer Private Sub Worksheet_Change(ByVal Target As Range) If Range("L1") <> datachn Then Application.EnableEvents = False 'イベント無効 i = 9 While i >= 1 Cells(1, i + 13).Value = Cells(1, i + 12).Value Cells(2, i + 13).Value = Cells(2, i + 12).Value i = i - 1 Wend Cells(1, 13).Value = Range("L1").Value Cells(2, 13).Value = Range("L1").Value datachn = Range("L1").Value Application.EnableEvents = True 'イベント有効 End If End Sub なお、標準モジュールでは正しく動作します。

meikenpochi
質問者

お礼

GreatDragonさん、回答ありがとうございます。 イベントを無効したものをワークシートモジュールに記述して確認してみたところ見事に動きました。 「標準モジュールでは正しく動きます」とあるのですが、標準モジュールにPrivate Sub Worksheet_Change(ByVal Target As Range)を記述してもセルの変更イベントを無視すると思うのですが、Private Sub Worksheet_Change(ByVal Target As Range)以外にセルの変更を感知する方法ってあるのでしょうか?

その他の回答 (3)

回答No.4

#1~#3の GreatDragon です。 > Private Sub Worksheet_Change(ByVal Target As Range)以外に > セルの変更を感知する方法ってあるのでしょうか? ワークシートの変更を検出してプロシージャを実行できるのは  Worksheet_Change  Workbook_SheetChange の2つだけと思っています。 ご存知とは思いますが、  Worksheet_Change:記述したシートの変更を検出  Workbook_SheetChange:記述したブックのすべてのシートの変更を検出 ですね。

meikenpochi
質問者

お礼

GreatDragonさん、毎度、回答ありがとうございます。 おかげ様で自分のやりたかったことができました。

回答No.3

言葉が足りませんでした。 >なお、標準モジュールでは正しく動作します。 イベントを無効にしなくても、標準モジュールに記述したら 正しく動作すると言う意味です。

回答No.1

こんにちは。 こちらでは実行時エラーは確認できませんでしたが、 エラーとなる原因が分からない時は、前後の改行も含め その行を削除後再入力すると解消できる場合があります。 それと気になる点がいくつかありますが ご承知であれば読み飛ばしてください。 1.変数名が違う   detachn と datachn のスペルが異なるのですが、   こういう誤りを防ぐためには、Option Explicit を   記述し、Dim ステートメントで変数を定義する。 2.セル範囲を指定してからまとめて転記したほうがスムーズ   (例)   Dim DownRow As Long   DownRow = Range("L1").End(xlDown).Row   Range(Cells(1, 13), Cells(DownRow, 22)).Value _     = Range(Cells(1, 12), Cells(DownRow, 21)).Value

meikenpochi
質問者

補足

GreatDragonさん、回答ありがとうございます。 新しくBookを作ってみました。 私の環境では下記マクロでエラーが発生してしまいますがGreatDragonさんの環境ではエラーが発生しないとはExcelに問題があるのでしょうか? Dim i As Integer Dim datachn As Integer Private Sub Worksheet_Change(ByVal Target As Range) If Range("L1") <> datachn Then i = 9 While i >= 1 Cells(1, i + 13).Value = Cells(1, i + 12).Value Cells(2, i + 13).Value = Cells(2, i + 12).Value'←エラー i = i - 1 Wend Cells(1, 13).Value = Range("L1").Value Cells(2, 13).Value = Range("L1").Value datachn = Range("L1").Value End If End Sub

関連するQ&A

  • エクセルVBAを修正したい

    数字を入力すると記号に変換になるマクロを 元ファイルを修正して作成したいのですが、 同一シートにC9:M33,C9:Y25,O27:Y29といった 範囲の異なる表がある場合はセル範囲をどのように記述すれば良いでしょうか? StartCol = 4 '開始列 EndCol = 20 '終了列 BlankCount = 0 I = 16 '開始行 L = 14 '行の指定 Do While Len(Range("B" & CStr(I)) & Range("C" & CStr(I))) > 0 For J = StartCol To EndCol If Len(ActiveSheet.Cells(L, J).Value & ActiveSheet.Cells(L + 1,J).Value) > 0 Then tmp = "" If ActiveSheet.Cells(I, J).Value = "×" Or ActiveSheet.Cells(I,J).Value = "中止" Then Else If Len(ActiveSheet.Cells(I, J).Value) = 0 Then K = -1 Else K = ActiveSheet.Cells(I, J).Value End If Select Case K Case 0 tmp = "×" Case 1 To 14 tmp = "△" Case Is >= 15 tmp = "○" End Select End If Next I = I + 1 If Len(Range("B" & CStr(I)) & Range("C" & CStr(I))) = 0 Then L = I + 1 I = I + 3 End If Loop End Sub

  • VBAエクセル空白セル0の入力

    C列が空白となるまで、F列・・・L列の空白セルに0を代入する。 という処理を行いたく以下コードで実行をして ファイル種類をCSVにて、保存した後名前の変更で拡張子をTXTにすると データ入力された列の以降がカンマの羅列が「,,,,,,,,(改行)」の繰り返しで表示されてしまいます。 (CSV保存の後、視覚的に空白部分を行選択して削除するとなくなります。) どうすれば、このカンマが表示されなくなるでしょうか。 うまく説明できてないですが、アドバイス御願いします。 Dim i As Long i = 3 Do Until Cells(i, 3).Value = "" If Cells(i, 6).Value = "" Then Cells(i, 6).Value = "0" End If If Cells(i, 7).Value = "" Then Cells(i, 7).Value = "0" End If If Cells(i, 8).Value = "" Then Cells(i, 8).Value = "0" End If If Cells(i, 9).Value = "" Then Cells(i, 9).Value = "0" End If If Cells(i, 10).Value = "" Then Cells(i, 10).Value = "0" End If If Cells(i, 11).Value = "" Then Cells(i, 11).Value = "0" End If If Cells(i, 12).Value = "" Then Cells(i, 12).Value = "0" End If i = i + 1 Loop

  • ExcelのVBAがオーバーフローに!?

    読んで頂きありがとうございます。 以前に質問しました時に回答を頂き凄く助かっていたのですが、何故か「オーバーフロー」と表示されてしまいます。 ひょっとしたら桁なのかも知れません。 下記のVBAを教えて頂きしようしていました。 Option Explicit Sub Test() Dim c(), p(), q(), i, j, l, r, k As Long r = Range("B2").End(xlDown).Row l = Range("D2").End(xlDown).Row ReDim c(r - 2), p(r - 2), q(r - 2) For i = 1 To r - 2 c(i) = Cells(i + 2, 2).Value p(i) = Cells(i + 2, 3).Value q(i) = i + 2 Next i For i = 1 To r - 3 For j = i + 1 To r - 2 If c(i) > c(j) Then k = c(i) c(i) = c(j) c(j) = k k = p(i) p(i) = p(j) p(j) = k k = q(i) q(i) = q(j) q(j) = k End If Next j Next i For i = 1 To r - 2 Cells(i + 2, 7).Value = c(i) For j = 3 To r If Cells(j, 4).Value = c(i) Then Cells(i + 2, 8).Value = p(i) - Cells(j, 5).Value If p(i) - Cells(j, 5).Value <> 0 Then Range("B" & q(i)).Interior.ColorIndex = 6 Range("D" & j).Interior.ColorIndex = 6 End If Exit For End If Next j Next i For i = 3 To r k = 0 For j = 3 To l If Cells(i, 2).Value = Cells(j, 4).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("B" & i).Interior.ColorIndex = 35 End If Next i For i = 3 To l k = 0 For j = 3 To r If Cells(i, 4).Value = Cells(j, 2).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("D" & i).Interior.ColorIndex = 35 End If Next i End Sub デパックのClickすると15行目辺りの「k = c(i)」が黄色くなります。 正直言ってマクロとか全く解りませんが、コピーして使っていました。 どこをどう変更すれば良いのか教えて頂ければ助かります。 よろしくお願いします。

  • 結合セルが連続して複数存在する場合。

    結合セルが連続して複数存在する場合。 vbaでどのようにしたら単体の結合セルが抽出できるでしょうか? 環境はexcel2003です。(写真は2010ですが) よろしくお願い致します。 以下ソース Dim MergeArray(1000),Mergecount '配列 複数のセルを格納したい。,添え字 Dim i,j'while文で使用する。 Dim m, n '行,列 m = 1'行だけ動かす。 n = 2'列は固定する。 i = 1 j = 1 mergecount = 1 while i <= 1000 If Range(Cells(m,n),Cells(m + j,n).mergecells = True then while j <= 1000 If Range(Cells(m,n),Cells(m + j,n)).mergecells = false then MergeArray(mergecount)=Range(Cells(m,n),Cells(m + j,n))'->ここでエラーがでました。 MsgBox MergeArray(mergecount) mergecount = mergecount + 1 m = m + j End If j = j + 1 wend End If m = m + 1 i = i + 1 Wend

  • VBAの転記について

    With Sheets("入力") '3行目~22行目まで For i = 5 To 24 SheetName = Sheets("入力").Cells(i, "C").Value On Error Resume Next Set Dummy = Sheets(SheetName) SheetName2 = .Cells(i, "C").Value U最終行 = Sheets(SheetName2).Range("C65536").End(xlUp).Row + 1 If U最終行 = 39 Then Sheets(SheetName2).Copy BEFORE:=ActiveSheet Sheets(SheetName).Delete End If If Err.Number = 0 Then A = Sheets(SheetName2).Range("C65536").End(xlUp).Row + 1 Sheets(SheetName2).Range("C" & A).Value = .Cells(i, "G").Value Sheets(SheetName2).Range("D" & A).Value = .Cells(i, "I").Value Sheets(SheetName2).Range("E" & A).Value = .Cells(i, "L").Value Sheets(SheetName2).Range("F" & A).Value = .Cells(i, "N").Value Sheets(SheetName2).Range("G" & A).Value = .Cells(i, "P").Value Sheets(SheetName2).Range("H" & A).Value = .Cells(i, "R").Value Sheets(SheetName2).Range("I" & A).Value = .Cells(i, "T").Value Sheets(SheetName2).Range("K" & A).Value = .Cells(i, "V").Value Sheets(SheetName2).Range("L" & A).Value = .Cells(i, "X").Value ElseIf .Cells(i, "C").Value <> "" Then G = Sheets("原紙").Range("C65536").End(xlUp).Row + 1 Sheets("原紙").Range("B1").Value = .Cells(i, "D").Value Sheets("原紙").Range("B4").Value = .Cells(2, "D").Value Sheets("原紙").Range("C" & G).Value = .Cells(i, "G").Value Sheets("原紙").Range("D" & G).Value = .Cells(i, "I").Value Sheets("原紙").Range("E" & G).Value = .Cells(i, "L").Value Sheets("原紙").Range("F" & G).Value = .Cells(i, "N").Value Sheets("原紙").Range("G" & G).Value = .Cells(i, "P").Value Sheets("原紙").Range("H" & G).Value = .Cells(i, "R").Value Sheets("原紙").Range("I" & G).Value = .Cells(i, "T").Value Sheets("原紙").Range("K" & G).Value = .Cells(i, "V").Value Sheets("原紙").Range("L" & G).Value = .Cells(i, "X").Value '原紙をコピーする Sheets("原紙").Copy BEFORE:=Sheets(1) 'シートの名前を市場コードにする Sheets(1).Name = SheetName End If Next i End With On Error GoTo 0 上記のVBAを作成しましたが、 C行の値ごとの転記(G~Xの値)が出来ません。 どこが間違いか教えていただけないでしょうか。

  • Excel VBA セルの双方向同期のエラーについ

    エラーが発生して理由がわからないので、どなたか助言をお願いします。 以下のVBAにて、目的のセルにデータを入力すると、1回目は必ず添付写真の通りのエラーが出まして、デバッグをすると3行目が黄色でハイライトされます。 記述は以下の通りです。どうぞよろしくお願いします。 シートAへのVBA設定 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Sheets("シートB").Range("$B$1").Value = Sheets("シートA").Range("$A$1").Value End If End Sub シートBへのVBA設定 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$1" Then Sheets("シートA").Range("$A$1").Value = Sheets("シートB").Range("$B$1").Value End If End Sub

  • VBA マクロ エラー1004 アプリケーション定義またはオブジェクト定義のエラー

    VBAで正当表と入力表の正誤判定を一気に行いたいのですが If Cells(a, b).Value = Cells(c, d).Value Thenの部分で エラー1004、アプリケーション定義またはオブジェクト定義のエラーと出てしまいます。 エラーの対処の仕方を調べたのですがわかりませんでした。 教えていただけるとありがたいです。 以下作ったプログラムです。 Sub 正誤判定() Dim a Dim b Dim c Dim d Dim e Dim i Dim j Dim x Dim y Dim hokan Dim ytate Dim xyoko a = 3 b = 21 c = 3 d = 43 e = 2 i = 1 j = 1 Do While j < 261 Do While i < 11 If Cells(a, b).Value = Cells(c, d).Value Then a = a + 1 c = c + 1 If Cells(a, b) = Cells(c, d) Then hokan = Cells(e, b).Value ytate = Range("B2:S15").Find(hokan, lookat:=xwhole).Row + 15 xyoko = Range("B2:S15").Find(hokan, lookat:=xwhole).Column Cells(ytate, xyoko).Value = Cells(ytate, xyoko).Value + 1 Else End If Else End If a = a - 1 c = c - 1 b = b + 1 d = d + 2 i = i + 1 Loop a = a + 3 c = c + 3 e = e + 3 j = j + 1 Loop End Sub

  • EXCEL VBAで、途中で処理が終わってしまいます。

    お世話になります。No.843313の続きになるのですが、思った通りに動いてくれませんでした。 やりたいことは、「Cells(97,4)まで数字が入ったら、次はCells(7,13)に移動して処理1を繰返したい」というものなのですが、Cells(97,4)まで入ったところで終了してしまい、次のCells(7,13)へ移動してくれません。エラーメッセージも出ていません。 どうしたらいいのでしょうか?宜しくお願いします。 (見やすいように字下げできませんでした。見難くてごめんなさい。) iii = 4 With sheetIRO ’処理1  For ii = 7 To 97 Step 10    If .Cells(ii, iii).Value = "" Then    .Range(.Cells(ii, iii), .Cells(ii + 4, iii + 2)).Value _    = Sheets("Result").Range("G20:I24").Value   Exit For  End If If ii = 97 Then   iii = iii + 9   ii = 7   Exit Sub End If Next ii End With

  • 2つのVBAを組み合わせる方法

    お世話になります、2つのVBAを組み合わせる方法で迷っています。 1つ目が Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True End Sub です。 2つめが Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = True If Intersect(Target, Range("R8:R38")) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End Sub です。2つのPrivate Sub Worksheet_Change(ByVal Target As Range)イベントのVBAですが、どのようにして組み合わせれば良いのでしょうか?

  • 連続するセルの比較をしたいのですが、(型が一致しません)のエラーが出ます。

     下記のどの部分でエラーになるのか、お教えください よろしくお願いします。  Sub CellsSamp() Sheets("sheet3").Select If Range(Cells(5, 1), Cells(5, 6)) = Range(Cells(5, 8), Cells(5, 25)).Value Then Range(Cells(6, 1), Cells(6, 6)) = Range(Cells(5, 1), Cells(5, 6)).Value End If End Sub

専門家に質問してみよう