マクロセルの値によってセルの色を消す

このQ&Aのポイント
  • エクセル2013で、セルの値が0または空白の場合で、セルが色塗りされていたら色を消すマクロを作成しました。ただ、700行55列では処理が遅いです。
  • 対象範囲から対象セルをすべて見つけて一括処理すれば処理が早くなると考え、以下のマクロを作成しましたが、構文エラーが発生しています。
  • どこを修正すればいいのでしょうか?
回答を見る
  • ベストアンサー

マクロセルの値によってセルの色を消す

エクセル2013です。 セルの値が0又は空白の場合でそのセルが色塗りされていたら色を消す というマクロをを作成しました。 ただ700行55列では処理が遅いです。 Sub 色消() '成功 Dim 最終行 Dim 最終列 Dim 対象セル As Range 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Value = 0 Or 対象セル = "" Then 対象セル.Interior.ColorIndex = 0 End If Next 対象セル End Sub 対象範囲から対象セルを全部見つけて一括処理すれば早いのではと 以下のマクロを作成してみましたが Set 対象範囲 = Cells.Find(What:=0 Or "", LookIn:=xlValues, LookAt:=xlWhole) で構文ERRです。 どこを直せばいいのでしょうか? よろしくお願いします。 Sub 色消2() '2014/8/4 '失敗 Dim 対象範囲 Dim 最終行 Dim 最終列 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 対象範囲 = Range(Cells(10, 17), Cells(最終行, 最終列)) Set 対象範囲 = Cells.Find(What:=0 Or "", LookIn:=xlValues, LookAt:=xlWhole) If Not 対象範囲 Is Nothing Then 対象範囲.Interior.ColorIndex = 0 End If End Sub

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

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 色々方法はありますが、Findメソッドを使って一括というのは難しいと思います。 とりあえず一例として、Range型変数に、 塗り潰しをキャンセルする処理対象範囲を格納するパターン。 書式操作を一度に纏める、という意味では、最もポピュラーで簡単に書ける方法です。 #すみませんけれど、Range(Cells(), Cells())書式は私の守備範囲外なので、 #書き換えています。そちらで適当に書き換えてみてくださいませ。 Sub Re870387a()   Const 先頭行 As Long = 10   Const 先頭列 As Long = 17   Dim 処理対象範囲 As Range   Dim 対象セル As Range   Dim 行数 As Long   Dim 列数 As Long   ' ' 8行目を基準に対象範囲の列数を取得   列数 = Cells(8, Columns.Count).End(xlToLeft).Column - 先頭列 + 1   ' ' A列を基準に対象範囲の行数を取得   行数 = Cells(Rows.Count, 1).End(xlUp).Row - 先頭行 + 1   ' ' 対象範囲を総当たりループ   For Each 対象セル In Cells(先頭行, 先頭列).Resize(行数, 列数)     If 対象セル.Value = 0 Or 対象セル = "" Then       If 処理対象範囲 Is Nothing Then ' 処理対象範囲が未設定なら         Set 処理対象範囲 = 対象セル ' 処理対象範囲に設定       Else ' 設定済なら ' 処理対象範囲に追加設定         Set 処理対象範囲 = Application.Union(処理対象範囲, 対象セル)       End If     End If   Next   ' ' 処理対象範囲が未設定でなければ、処理対象範囲の塗りつぶしを一度に纏めてキャンセル   If Not 処理対象範囲 Is Nothing Then 処理対象範囲.Interior.Pattern = xlNone End Sub

gx9wx
質問者

お礼

>Range(Cells(), Cells())書式は私の守備範囲外 いえいえ、とんでもありません。 教えて頂いたコードでしたらこれは不要でした。 何でもかんでも Range(Cells(), Cells()) にすればいいのではない事がわかりました。 教えていただいたコードですが 思ったとうりに動作いたしました。 自作で成功している Sub 色消() '成功 Dim 最終行 Dim 最終列 Dim 対象セル As Range 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Value = 0 Or 対象セル = "" Then 対象セル.Interior.ColorIndex = 0 End If Next 対象セル End Sub と処理速度がかわりませんでした。 どうもありがとうございました。

gx9wx
質問者

補足

http://okwave.jp/qa/q8695934.html にて Sub 出荷済削除() Dim 対象セル As Range Dim 対象色 As Long Dim 対象色2 As Long Dim 最終行 Dim 最終列 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 Application.ScreenUpdating = False '画面切替停止 対象色 = Range("B8").Interior.Color 'セルB8の色を基準色とする 対象色2 = Range("A8").Interior.Color 'セルB8の色を基準色とする For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Interior.Color = 対象色 Or 対象セル.Interior.Color = 対象色2 Then 対象セル.ClearContents Next 対象セル Application.ScreenUpdating = True '画面切替停止解除 End Sub を Sub 出荷済削除() Dim 対象色 As Long Dim 最終行 As Long, 最終列 As Long Dim i As Integer 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 For i = 1 To 2 対象色 = Cells(8, i).Interior.Color Application.FindFormat.Clear Application.FindFormat.Interior.Color = 対象色 Range(Cells(10, 17), Cells(最終行, 最終列)).Replace "", "", xlWhole, , , , True Next i End Sub にするように教えていただき1秒かからなくうまくいったので 応用しようとしていますがうまくできません。

その他の回答 (2)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

#1、2、cjです。 すみません。編集ミスがありましたので取り急ぎ訂正、自己レスです。 ReplaceFormat版の方、 誤)   ' ' 自動計算停止(数式の参照先を含まないなら不要)   .Calculation = xlCalculationAutomatic   ' ' 描画抑止   .ScreenUpdating = True 正)   ' ' 自動計算停止(数式の参照先を含まないなら不要)   .Calculation = xlCalculationManual   ' ' 描画抑止   .ScreenUpdating = False ついでに全体で、"描画"は"描画更新"の方が意味が通りますね。 以上訂正します。失礼しました。 今から出掛けますので、もし再レスが必要な場合は明日以降になるかも知れません。一応。

gx9wx
質問者

お礼

ご丁寧にありがとうございます。 気を使わせて大変申し訳なく思います。 いろいろありがとうございました。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

#1、cjです。#1お礼欄・補足欄、拝見しました。 まずはお礼欄について。 .ReplaceFormatプロパティを設定した上で、 .Replaceメソッドで処理したい、ということです? 確かにこの方法なら速いですけれど、 処理できるのは定数値のみ、数式の戻り値は無視されますが、 それでいいのでしょうか? とりあえず、プロット程度ですが、、、。 Sub Re870387e()  Const 先頭行 As Long = 10  Const 先頭列 As Long = 17 ' Q列相当  Dim 行数 As Long, 列数 As Long  With Application   ' ' イベント発行停止(Chane,SelectionChange,Calculate未使用なら不要)   .EnableEvents = False   ' ' イベント発行停止のままエラー終了しないようにトラップ(念の為)   On Error GoTo Out_   ' ' A列を基準に対象範囲の行数を取得   行数 = Cells(Rows.Count, 1).End(xlUp).Row - 先頭行 + 1   ' ' 8行目を基準に対象範囲の列数を取得   列数 = Cells(8, Columns.Count).End(xlToLeft).Column - 先頭列 + 1   ' ' 自動計算停止(数式の参照先を含まないなら不要)   .Calculation = xlCalculationAutomatic   ' ' 描画抑止   .ScreenUpdating = True   .FindFormat.Clear   .ReplaceFormat.Clear   .ReplaceFormat.Interior.ColorIndex = xlColorIndexNone  End With  With Cells(先頭行, 先頭列).Resize(行数, 列数)   .Replace What:=0, Replacement:=0, LookAt:=xlWhole, ReplaceFormat:=True   .Replace What:="", Replacement:="", LookAt:=xlWhole, ReplaceFormat:=True  End With Out_:  With Application   .ReplaceFormat.Clear   ' ' イベント発行再開   .EnableEvents = True   ' ' 自動計算再開   .Calculation = xlCalculationAutomatic   ' ' 描画再開   .ScreenUpdating = True  End With  If Err Then MsgBox Err & vbLf & Err.Description End Sub 続いて補足欄。 処理の遅さが問題だとしたら、Application系の更新抑止を丁寧に書けば、 場合によって多少の改善は望めるとは思います。 700*55程度でしたらコンマ数秒程度でしょうから、遅いと言えるかどうか微妙ですね。 なので、#1では書式操作を一度に纏める、という意図だけでお応えした訳です。 Excel VBA もVer2007以降は随分様変わりしましたから、 以前なら高速に処理できた手法もキャッシュファイルが邪魔して、 一度に纏めての処理が却って遅い場合なんかもあったりして、、、。 もっと速くということだとhttp://okwave.jp/qa/q4007086.html辺りを 現代版に書き直す方法もあるとは思いますが、まぁあの頃に比べれば。 PCもExcelも随分速くなりましたから、処理速度ネタは最近あまり興味なかったりします。 もっと速くということでしたら、また考えますけれど、、、。 さて前述の通り、.ReplaceFormatでは数式の戻り値を処理に反映できないという意味で、 上記のマクロはご提示のSub 色消()とは仕様が異なる結果になってしまいます。 それでも構わないなら、それでいいですが、 当初の条件で、もう少し速くなるものを書いてみました。 これが最速ではありませんが、最近配列変数について興味をお持ちかと思いましたので、 一応掲げてみます。 Sub Re870387j()   Const 先頭行 As Long = 10   Const 先頭列 As Long = 17 ' Q列相当   Dim 二次元配列B()   Dim 二次元配列V()   Dim 判別用二次元配列()   Dim 単位行数 As Long   Dim 行数 As Long   Dim 列数 As Long   Dim 行 As Long   Dim 列 As Long   ' ' イベント発行停止(Chane,SelectionChange,Calculate未使用なら不要)   Application.EnableEvents = False   ' ' イベント発行停止のままエラー終了しないようにトラップ(念の為)   On Error GoTo Out_   ' ' A列を基準に対象範囲の行数を取得   行数 = Cells(Rows.Count, 1).End(xlUp).Row - 先頭行 + 1   If 行数 < 1 Then MsgBox 先頭行 & "行以下にデータなし!": Exit Sub   ' ' 8行目を基準に対象範囲の列数を取得   列数 = Cells(8, Columns.Count).End(xlToLeft).Column - 先頭列 + 1   If 列数 < 1 Then MsgBox 先頭列 & "列以右にデータなし!": Exit Sub   If 行数 * 列数 = 1 Then MsgBox "単セル非対応。手作業でお願い!": Exit Sub   ' ' 判別用二次元配列のサイズを再定義   ReDim 判別用二次元配列(1 To 行数, 1 To 列数)   ' ' 処理対象範囲をブロック化   With Cells(先頭行, 先頭列).Resize(行数, 列数)     ' ' 値・数式を後で元に戻す為の配列変数     二次元配列B() = .Formula     ' ' 値を確認する為の配列変数     二次元配列V() = .Value     For 行 = 1 To 行数       For 列 = 1 To 列数         Select Case 二次元配列V(行, 列) ' 値を確認して         Case Empty, 0 ' Emptyまたは0ならば           ' ' フラグとしての1を判別用配列変数に格納           判別用二次元配列(行, 列) = 0         End Select       Next 列     Next 行     Erase 二次元配列V() ' 使用済みの変数を初期化     ' ' 描画抑止     Application.ScreenUpdating = False     ' ' 自動計算停止(数式の参照先を含まないなら不要)     Application.Calculation = xlCalculationManual     ' ' フラグを格納した判別用配列変数をセル範囲に出力     .Value = 判別用二次元配列     Erase 判別用二次元配列() ' 使用済みの配列変数を初期化     ' ' 何行ずつ纏めて処理するかを環境に合わせてt設定     ' ' 大き過ぎると処理が遅くなる     単位行数 = 20 ' 本来はプロシージャ上部記述する(Const が相応)     ' ' 単位行数ステップでループ     For 行 = 1 To 行数 Step 単位行数       ' ' 端数の調整       If 行 + 単位行数 > 行数 Then 単位行数 = 行数 - 行 '+ 1       ' ' 処理対象がない場合のエラー対策       On Error Resume Next       ' ' フラグが立っているセルを纏めて[塗り潰しなし]にする       .Rows(行 & ":" & 行 + 単位行数).SpecialCells(xlCellTypeConstants).Interior.ColorIndex = xlColorIndexNone       On Error GoTo Out_:     Next 行     ' ' 配列変数をセル範囲に出力して値・数式を元に戻す     .Formula = 二次元配列B()     Erase 二次元配列B() ' 使用済みの変数を初期化   End With Out_:   With Application     ' ' イベント発行再開     .EnableEvents = True     ' ' 自動計算再開     .Calculation = xlCalculationAutomatic     ' ' 描画再開     .ScreenUpdating = True   End With   If Err Then MsgBox Err & vbLf & Err.Description End Sub

gx9wx
質問者

お礼

夏季休暇に入ってしまい 自分が制御できるコードで とりあえずリリースしまHした。 ありがとうございます。

関連するQ&A

  • エクセルマクロFor Eachを1回で処理したい

    エクセル2013です。 以下のようなマクロを作成しました。 For Each が2回、回る為、処理時間が長いです。 For Each を1かいで済ませたくif文をandでつなげば といろいろ試しましたが、うまくできません。 For Each を1回で済ませるにはどうすればいいでしょうか? よろしくお願いします。 Sub 出荷済削除() Dim 対象セル As Range Dim 対象色 As Long Dim 対象色2 As Long Dim 最終行 Dim 最終列 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 Application.ScreenUpdating = False '画面切替停止 対象色 = Range("B8").Interior.Color 'セルB8の色を基準色とする For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Interior.Color = 対象色 Then 対象セル.ClearContents '基準色と同じ色のセルの値をクリアする Next 対象セル 対象色2 = Range("A8").Interior.Color 'セルB8の色を基準色とする For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Interior.Color = 対象色2 Then 対象セル.ClearContents '基準色と同じ色のセルの値をクリアする Next 対象セル Application.ScreenUpdating = True '画面切替停止解除 End Sub

  • エクセルマクロFor Eachの処理が長い

    エクセル2013です。 皆さんに教えていただいて以下のマクロが完成しました。 サンプルデータ 30行、7列ではあっという間に処理ができたのですが 本番環境 800行、50列ですと 処理時間が長く 青丸がくるくる回っていて、2分後にくらいで終わります。 もう少し早く処理する方法はありますでしょうか? Findで検索して、一括削除? (それはマクロでできるのでしょうか?) よろしくお願いします。 Sub 出荷済削除() Dim 対象セル As Range Dim 対象色 As Long Dim 対象色2 As Long Dim 最終行 Dim 最終列 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 Application.ScreenUpdating = False '画面切替停止 対象色 = Range("B8").Interior.Color 'セルB8の色を基準色とする 対象色2 = Range("A8").Interior.Color 'セルB8の色を基準色とする For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Interior.Color = 対象色 Or 対象セル.Interior.Color = 対象色2 Then 対象セル.ClearContents Next 対象セル Application.ScreenUpdating = True '画面切替停止解除 End Sub

  • エクセルマクロ行削除

    エクセル2013です。 以下の行削除マクロを作りました。 取得した 最終行が20行目として 最終列がZ列として セル Z20 の値が 1以上なら問題なく動作するのですが セル Z20 の値が 0 だとループして終了しません。 どこを修正しても、思うように動作しません。 どこを修正すれば、いいのでしょうか? よろしくお願いします。 Sub 行削除() Dim 最終行 Dim 最終列 Dim 対象行 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 Application.ScreenUpdating = False '画面切替停止 For 対象行 = 10 To 最終行 If Cells(対象行, 最終列) = 0 Then Rows(対象行).Delete 最終行 = 最終行 - 1 '削除により最終行が1行減ったので最終行の値を1行減らす 対象行 = 対象行 - 1 '削除により対象行が1行繰り上がったので対象行の値を1行減らす Else End If Next 対象行 Application.ScreenUpdating = True '画面切替停止解除 End Sub

  • マクロで指定したセル内の改行を削除

    エクセル2013です。 既に動いているマクロに別な処理を追加したいです。 まずその追加したい処理だけの単独のコードを 作成し、正しく動いたら 今使用しているマクロの最初に組込たいです。 内容はシート内において、指定した複数のセルの中の すべての改行を削除です。 マクロでなくてもできますが、上記理由でマクロで行いたいです。 ・質問1 Sub 実験() 最終行 = Cells(Rows.Count, 6).End(xlUp).Row 'F列の最終行を求める Range(Cells(4, 1), Cells(最終行, 6)).Value = Replace(Range(Cells(4, 1), Cells(最終行, 6)).Value, vbLf, "") End Sub これですと 「型が一致しません」でERRです。 これは何処が悪いのでしょうか? ・質問2 Sub 改行削除() Dim 対象範囲 As Range 最終行 = Cells(Rows.Count, 6).End(xlUp).Row 'F列の最終行を求める   Set 対象範囲 = Range(Cells(4, 1), Cells(最終行, 6)) 対象範囲.Replace vbLf, "", xlPart End Sub ↑これなら正しく動きました。 でこれを、今動いているマクロの先頭に入れたら 対象範囲.Replace vbLf, "", xlPart ↑ ここで「型が一致しません」でERRです。 なぜ単独では動作するのに、別のマクロの先頭に組み込むとERRに なるのかわかりません。 よろしくお願いします。

  • オートフィルタ 最終行を指定する必要は?

    エクセルでVBAでオートフィルタをする場合、 ******************************************* Sub test1() 最終列 = Range("IV1").End(xlToLeft).Column Range(Cells(1, 1), Cells(1, 最終列)).AutoFilter End Sub Sub test2() 最終行 = Range("a65536").End(xlUp).Row 最終列 = Range("IV1").End(xlToLeft).Column Range(Cells(1, 1), Cells(最終行, 最終列)).AutoFilter End Sub ******************************************* どちらでもできるのですが、 test2のように最終行を取得・指定する必要はあるのでしょうか?

  • セルの値が0はクリアするマクロ

    エクセル2003です。 ある集計表において 4行目のH列からAM列まで 数値データがあります。 最終行は常に変化します この表内にてセルの値が0のセルは セル内を空白にしたいです。 以下のマクロを作成しましたが If Cells(処理行, 8).Value = 0 Then Cells(処理行, 8).ClearContents をあと(処理行, 13)から(処理行,31) まで記述しなければなりません。 構文的にも処理的にも不利? と思うので、なにかいい方法を教えてください。 Sub 数字0クリア() '2012年2月3日節分 Dim 最終行 '最終列をG列で求めます 最終行 = Cells(Rows.Count, 7).End(xlUp).Row Application.ScreenUpdating = False For 処理行 = 4 To 最終行 If Cells(処理行, 8).Value = 0 Then Cells(処理行, 8).ClearContents End If If Cells(処理行, 9).Value = 0 Then Cells(処理行, 9).ClearContents End If If Cells(処理行, 10).Value = 0 Then Cells(処理行, 10).ClearContents End If If Cells(処理行, 11).Value = 0 Then Cells(処理行, 11).ClearContents End If If Cells(処理行, 12).Value = 0 Then Cells(処理行, 12).ClearContents End If If Cells(処理行, 13).Value = 0 Then Cells(処理行, 13).ClearContents End If Next 処理行 Application.ScreenUpdating = True MsgBox "終了しました" End Sub

  • エクセルVBAでセル位置の置き換え

    売上帳をエクセルVBAを使って作っています。 シート自体は、    B    C     D    E 1 日付 顧客NO. 顧客名 品名 2 3 のようになっており、 B列、C列、D列の最終行に入っている値を、その一行下から、E列最終行までのB~D列全部に貼りつけたいのです。 コードは下記のように書いてあります。 Dim 行番号 Dim セル日 Dim セル客 Dim 品名行 Dim 日付行 Dim セル日2 Dim セル日3 Sub 日付と顧客名を貼付() 行番号 = Cells(Rows.Count, "B").End(xlUp).Row 'B列最終行の行番号を取得し「行番号」に代入 セル日 = "B" & 行番号 セル客 = "D" & 行番号 Range("セル日:セル客").Copy '日付と顧客番号と顧客名をコピー 品名行 = Cells(Rows.Count, "E").End(xlUp).Row 'E列最終行の行番号を取得し「品名行」に代入 日付行 = Cells(Rows.Count, "B").End(xlUp).Row + 1 'B列最終行の1行下の行番号を取得し「日付行」に代入 セル日2 = "B" & 日付行 セル日3 = "B" & 品名行 Range("セル日2:セル日3").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'B列最終行の1行下のB列からD列に値の貼り付け End Sub これを実行すると、 『Range("セル日:セル客").Copy』の部分でエラーがでます。 正しくはどのように書けばよいのでしょうか?

  • 途中に空白行や列があるデータ範囲

    エクセル2003です。 セルA1からセルC50までデータがあり 10行目と20行目は全て空白、 セルC39が空白で セルE55、F57、G55にはデータがある の状態で以下の構文ですと Sub 範囲コピー1() Range("B3").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Copy End Sub 途中に空白行や列、空白セルがあり さらに離れた所E55、F57、G55に データが有るのにもかかわらず セルB3からセルG57までを選択してクリップボードにコピー してくれます。 ですが問題がありまして 上記のシートにて A45~F50を選択してDeleteをし、 さらにセルのF55、G55もDeleteして データ範囲を セルA1~E44とセルE55のみにしてからから 上記構文を実行すると セルB3からセルE55を選択してクリップボードにコピー してほしいのに、 データ削除前と同様の セルB3からセルG57を選択してクリップボードにコピー されてしまいます。 これはエクセルの手操作 Ctrl+Shift+End でも同じようになりますので当然の結果(※1)と思っています。 (※1→なにか別な方法はありますか?) 上記の使用方法はあまりないのですが 構文を使う時点での最大行数や最大列数は常に不明で 途中空白が有る場合無い場合、 上記のようにシート上でデータ操作をした直後であっても データ削除部分は加味しデータのある範囲だけの取得の対応 が可能な構文を1種類で作成したいのですが どういう方法があるでしょうか? ちなみに Sub 範囲コピー2() Range("B3").Select Range(Cells(Rows.Count, 1).End(xlUp).Row).Select Range(Cells(1, Columns.Count).End(xlToLeft).Column).Select Selection.Copy End Sub これですと 実行時エラー1004 Rangeメソッドは失敗しましたGlobalオブジェクト となります。 ヘルプをクリックしても何も表示されません。 WEB検索するとこのエラーの質問は結構多いのですが 事例が相違する為よく理解できません。 もしかしてRangeなのに 取得できる値が一つの番号でセルを指定できないからでしょうか? エラーになる構文だと最初のRangeは行番号、次のRangeは列番号、 ですので。 で、 Sub 範囲コピー3() Dim 最終行 Dim 最終列 Range("B3").Select 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 最終列 = Cells(1, Columns.Count).End(xlToLeft).Column Cells(最終行, 最終列).Select Selection.Copy End Sub これならエラーにはなりませんが 事例だとセルC50だけが単独選択されて範囲として 取得をしてくれません。 また 1, Columns.Count ですので最終列の列番号の取得が1行目の最終列から左に検索し データのある所の列番号を返すので 3→C列 となってしまい D,E,F列を見つけてくれません。 かといって 55, Columns.Count では データが55行まで無い場合には対応が出来ませんのでこれも駄目です。 途中に空白が無い場合や離れたセルが無い場合でも使いたいので UsedRangeは使用したくない(よくわかってない事もあって)です。 よろしくお願いします。

  • VBA 最終列に入力された値の表示について

    VBAで最終列に入力された値の表示について教えてください。 例えば10行目の10列目(J列)に”123”と入力された値をセル”D1”に表示させたいのですがどのようにすればよいのでしょうか。 A列の最終行については Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Long r = Cells(Rows.Count, 1).End(xlUp).Row Range("D1").Value = Cells(r, 1).Value End Sub でうまく表示できたのですが、最終列についてなかなかうまくいきません。 どなたかご指南ください宜しくお願いします。

  • Excelセル範囲内の値のみ1行空欄にする

    下記コードでは1行づつ挿入により下段までずれてしまいます。 Excelセル範囲内の値のみ1行づつ開けるにはどのようにすれば良いでしょうか。 どなたか解る方よろしくお願いします。 Sub 空欄1行() Dim i As Long If TypeName(Selection) <> "Range" Then Exit Sub With Selection For i = .Rows.Count To 2 Step -1 Intersect(.Cells(i, 1).EntireRow, .Columns).Insert xlDown Next End With End Sub

専門家に質問してみよう