塗りつぶしプロパティの判定でエラーが発生する

このQ&Aのポイント
  • 上司(上司A)がエクセルで作業予定表を作っております。別の上司から、このエクセルの情報を一覧として別シートに抽出するよう指示されました。
  • 作業開始日、作業者の抽出自体はさして難しくありませんでしたが、作業継続日数は少々やっかいでした。
  • セルのプロパティで塗りつぶし状態をみて、それにより作業終了日を判定しようと考えました。しかし、塗りつぶし判定のところでエラーが発生してしまいます。
回答を見る
  • ベストアンサー

塗りつぶしプロパティの判定でエラーが出る

上司(上司A)がエクセルで作業予定表を作っております(添付画像の体裁です。実際はもっと日数や予定数があります)。 別の上司から、このエクセルの情報を一覧として別シートに抽出するよう指示されました。 一覧の形式としては、A列に作業開始日、B列に作業者名、C列に作業継続日数、と並べて記載し、作業割り当て者の無い日は抽出不要、です。 作業開始日、作業者の抽出自体はさして難しくありませんでしたが、作業継続日数は少々やっかいでした。 というのも上司Aの作業予定表では、作業者の作業継続状況をセルの塗りつぶしで表示しており、ここで終わり、という文字なり記号なりがあるわけでは無かったためです。 そこで、セルのプロパティで塗りつぶし状態をみて、それにより作業終了日を判定しようと考えました。 また、作業終了日翌日から別の作業が続いている場合はこれで判定出来ないため、空欄であること、という条件も追加しました。 以上を考え作成したコードですが、塗りつぶし判定のところでエラーが発生してしまいます。 エラーは、   実行時エラー 1004   アプリケーション定義またはオブジェクト定義のエラーです。 です。 試しに、「<>」を「=」にしてみたところ通ります。 (ただし望んだ結果は得られません。当然ながら……) いったい何が問題か、どなたかアドバイス頂けませんでしょうか……。 -----以下コード----- Option Explicit Sub スケジュール抽出() Dim i As Long Dim j As Long Dim k As Long Dim l As Long Dim m As Long k = 1 For i = 2 To 11 For j = 1 To 4 If Not Cells(j, i) = "" Then If Not j = 1 Then Worksheets("Sheet2").Cells(k, 2).Value = Cells(j, i).Value l = i Do While Cells(j, l).Interior.ColorIndex <> xlColorIndexNone Or Cells(j, l).Value = "" ←ここでエラー ' Do While Cells(j, l).Interior.ColorIndex = xlColorIndexNone Or Cells(j, l).Value = "" ←こうするとエラーは起きない l = l + 1 Loop m = l - i Worksheets("Sheet2").Cells(k, 3).Value = m '予定の継続日数 Else Worksheets("Sheet2").Cells(k, 1).Value = Cells(j, i).Value k = k + 1 End If End If Next Next MsgBox "抽出完了" End Sub

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

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

#1,3です。 #3の直接の回答の修正点は少し違っていたみたいなので、 あらためて、当初のお望みは、こういうことかな?という コードを実際に動くような形であげてみますね。 #1-3のコードとの違いを言えば、何がなんでもデータ範囲すべてをループする、 ので、少し無駄な感じがしますし、 全セルループの内側で、DoLoopでセル範囲のループを重ねるのも少し違和感はあります。 でも、ロジックとしてこれはこれで成立していますね。 まぁ、入力に際しての規則に対して、 不規則なものへの手当てを何処まで考慮に入れて、 それらへのエラー(回避)対策を何処まで書くか、 という点については、 本来、メンテナンスレベルでのタスクですから、 不足があるかも知れないですし、これで十分なのかも知れないですし、 現場での判断に委ねるとして、今の処こちらからは何とも言えません。 最終的にどんな記述を選ぶにせよ、せっかくですから、 ご提示の記述も動くようにしてから、納得の上、次に進んだ方が好いのかな、 と改めて思い直しました。 以下、質問添付画像の場合は、#1,3と同じデータを同じ並びで返します。 #3添付画像の例では、それぞれ違う結果になります。 ' ' /// Sub スケジュール抽出_re() Dim i As Long Dim j As Long Dim k As Long Dim l As Long Dim m As Long   Sheets("Sheet1").Select   k = 0   For i = 2 To Cells(1, 2).End(xlToRight).Column     For j = 2 To Cells(2, 1).End(xlDown).Row       If Cells(j, i) <> "" Then         k = k + 1         l = i         Do While Cells(j, l + 1).Interior.ColorIndex <> xlColorIndexNone And Cells(j, l + 1).Value = ""           l = l + 1         Loop         m = l - i + 1         Worksheets("Sheet2").Cells(k, 1).Value = Cells(1, i).Value ' 作業開始日         Worksheets("Sheet2").Cells(k, 2).Value = Cells(j, i).Value ' 作業者名         Worksheets("Sheet2").Cells(k, 3).Value = m ' 予定の継続日数       End If     Next   Next   Sheets("Sheet2").Select   MsgBox "抽出完了" End Sub ' ' ///

wine38
質問者

お礼

こんにちは。 休出(汗)を終え帰宅したところ、素晴らしいご回答を頂いており、小躍りしております。 塗りつぶし無しで判定……の意図はご拝察の通りです。 最初に書いておくべきでしたね(汗) また、二種類もの正解サンプルを頂戴でき、大変勉強になります。 エクセル(VBA)の作法というか、効率の良いコーディングがどういったものかまだ全然理解していない初心者なので、いろいろムズムズされたかと存じますが、丁寧にお付き合いいただき感謝の至りです。 最初のサンプルもしっかり拝見して、勉強させて頂きたいと思います。 ありがとうございました。

wine38
質問者

補足

あ、エラーの原因についてですが、単なるロジックバグだったのですね、お恥ずかしい限りです……。 高校二年で数学を諦めたクチなので、AND とか OR の辺りはちょっと考えるとたちまち混乱してしまうのがこんな所にも現れてしまい(汗)

その他の回答 (3)

回答No.3

#1です。 "上司さん(他人)のやることだから塗り潰しも不規則かも知れない。" というような意味での保険を掛けていくなら、 質問添付画像の例示のようにはならず、 なるほど[作業者名]を跨いで連続して同色で塗り潰しているかも知れませんし、 或いは期間未定とかで、塗ってさえいない場合も考えられますね。 ということで、対策したものを最後に再掲します。 因みに、.ColorIndex ではなく、.Color を条件に使う理由は、 一旦大き目の範囲を塗り潰した後の修正の際に上司さん(他人)が [塗り潰しなし]ではなく[白]で塗ってしまうかも知れない ことへの対策になっていたりします。 それから、あらためて直接の回答ですが、 ご提示のコードのエラーは、 ご提示の画像サンプルで言うと、 1件めの[作業者名]田中さんに関する期間処理で、 >  l = i >  Do While Cells(j, l).Interior.ColorIndex <> xlColorIndexNone Or Cells(j, l).Value = "" ' ←ここでエラー の条件判別が正しくない為に、 2件めの[作業者名]鈴木さんの列でループを止めるような判別が出来ていない ことが原因です。 現象としては、2行めを 16384 列め(旧バージョンなら 256 列め) を超えてループしようとしている為に、 Cells(j, 16385)(旧バージョンなら Cells(j, 257)) という存在しないセルを参照を指定している為に起こる実行時エラーです。 その点に対して部分的な修正をするとすれば、   l = i + 1   Do While Cells(j, l).Interior.ColorIndex <> xlColorIndexNone And Cells(j, l).Value = "" のような形になります。 修正点は「 + 1」「 And 」の2ヶ所です。 先述の通り、この部分の修正だけでは十分でありませんが、 今回課題のエラーの原因と対処法については、 納得のいく答え、になっているのではないかと思います。 以下、冒頭で述べた修正(対策)を加えたコード(修正★3ヶ所)です。 有効な範囲の右端列を超えないように条件を加えることで、 塗り潰しされていない場合にも対応します。 なお、余計なこととは思いますが、 D列に"予定1"~"予定n"を出力する場合を●option 1-3で書き足しています。 不要なら削除して構いませんが、[予定]項目を追加しておくと、 好きな順に並べ替えできるようになるかなぁ、と。 ' ' /// Sub Re8985616w() ' スケジュール抽出 Dim Target As Range ' Sheet1 元データ セル範囲 Dim rngPrint As Range ' Sheet2 出力先 セル範囲 Dim c As Range ' ループ用 range型変数 Dim nLastColumn As Long ' 有効範囲の右端列位置★ Dim nCurColor As Long ' 基準の背景色 Dim cnDay As Long ' 作業継続日数 カウンタ Dim k As Long ' 出力行位置 カウンタ    ' ' Sheet2   Set rngPrint = Sheets("Sheet2").Range("A:C") ' Sheet2 出力先 セル範囲 を変数に格納 ●prime 1 '  Set rngPrint = Sheets("Sheet2").Range("A:D") ' Sheet2 出力先 セル範囲 を変数に格納 ●option 1   rngPrint.Clear ' Sheet2 出力先 セル範囲 をクリア   rngPrint.Rows(1).Value = Split("作業開始日 作業者名 作業継続日数") ' Sheet2 出力先 セル範囲 項目名 設定 ●prime 2 '  rngPrint.Rows(1).Value = Split("作業開始日 作業者名 作業継続日数 予定") ' ●option 2   rngPrint.Columns(1).NumberFormatLocal = "m""月""d""日""" ' Sheet2 出力先 セル範囲 日付表示形式 設定 ' ' Sheet1   Sheets("Sheet1").Select   Set Target = Cells(2, 2).CurrentRegion.Offset(1, 1) ' Sheet1 元データ セル範囲 を変数に格納   nLastColumn = Target(Target.Count).Column ' ★   Set Target = Target.SpecialCells(xlCellTypeConstants) ' Sheet1 元データ セル範囲 値のあるセルのみ抽出   k = 1 ' 出力行位置 初期化   For Each c In Target ' Sheet1 元データ セル範囲 値のあるセル を総当たりでループ     nCurColor = c.Interior.Color ' 基準の背景色を記録     cnDay = 1 ' 作業継続日数 初期化     ' ' ひとつ右のセルの背景色が基準の背景色と一致している間 ループ ★     Do While c.Offset(, cnDay).Interior.Color = nCurColor And c.Offset(, cnDay) = "" And c.Offset(, cnDay).Column < nLastColumn       cnDay = cnDay + 1 ' 作業継続日数をカウント     Loop     k = k + 1 ' 出力行位置を送り     ' ' 作業開始日 作業者名 作業継続日数 データを出力     rngPrint.Rows(k).Value = Array(Cells(1, c.Column), c, cnDay) ' ●prime 3 '    rngPrint.Rows(k).Value = Array(Cells(1, c.Column), c, cnDay, Cells(c.Row, 1)) ' +[予定]●option 3   Next ' ' Sheet2   Sheets("Sheet2").Select '' ' 作業開始日 の順に ソート   rngPrint.Sort Key1:=rngPrint(1, 1), Order1:=xlAscending, Header:=True, Orientation:=xlSortColumns   MsgBox "抽出完了" End Sub ' ' ///

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

エラーが出た直接の原因として、不適切なデータが記入されているためと推測します。 あとはまぁ、誰がやっても似たようなマクロの構成になっちゃいますね。 sub macro1()  dim h as range  dim Target as range  dim n as long ’出力準備  worksheets("Sheet2").range("A:C").clearcontents  worksheets("Sheet2").range("A1:C1") = array("作業開始日", "作業者名", "作業継続日数")  worksheets("Sheet2").range("A:A").numberformatlocal = "mm/dd"  worksheets("Sheet1").select for each h in range("A1").currentregion.offset(1,1).specialcells(xlcelltypeconstants) ’不適切データチェック(例)  if h.interior.colorindex = xlnone then   h.select   msgbox "ERROR"   exit sub  end if ’抽出  n = 1  do until h.offset(0, n).interior.color <> h.interior.color or h.offset(0, n) <> ""   n = n + 1  loop ’出力  with worksheets("Sheet2").range("A65536").end(xlup).offset(1)   .offset(0, 0) = cells(1, h.column)   .offset(0, 1) = h   .offset(0, 2) = n  end with  next end sub

wine38
質問者

お礼

こんにちは。 正常に作動するサンプルコードをいただき、誠にありがとうございます。 初心者である私の目からは、いかにもエクセルチックな記述がたくさんあって、とても勉強になります。 しっかり拝見させていただきたいと思います。

回答No.1

こんにちは。 他にもうまく行ってない点もあるようでしたので、 こちらで設計し直したものでお答えします。 1. [作業者名]の書かれたセルを過不足なく抽出 2. [作業者名]セルの背景色を基準色として記録 3. [作業者名]セルから右へ基準色とは違う背景色が見つかるまで   [作業継続日数]をカウントしながらループ 4. [作業開始日] [作業者名] [作業継続日数] データ出力 5. 以上の処理は、[作業者名]セルを 右→、下↓、の順にループするので、   最後に、出力先を日付順にソート といった流れです。 もしお手元のマクロを修正するのでしたら、 2.3.あたりが参考になるのではないでしょうか。 不足や疑問があれば、補足欄にでも書いてみて下さい。 ' ' /// Sub Re8985616w() ' スケジュール抽出 Dim Target As Range ' Sheet1 元データ セル範囲 Dim rngPrint As Range ' Sheet2 出力先 セル範囲 Dim c As Range ' ループ用 range型変数 Dim nCurColor As Long ' 基準の背景色 Dim cnDay As Long ' 作業継続日数 カウンタ Dim k As Long ' 出力行位置 カウンタ    ' ' Sheet2   Set rngPrint = Sheets("Sheet2").Range("A:C") ' Sheet2 出力先 セル範囲 を変数に格納   rngPrint.Clear ' Sheet2 出力先 セル範囲 をクリア   rngPrint.Rows(1).Value = Split("作業開始日 作業者名 作業継続日数") ' Sheet2 出力先 セル範囲 項目名 設定   rngPrint.Columns(1).NumberFormatLocal = "m""月""d""日""" ' Sheet2 出力先 セル範囲 日付表示形式 設定 ' ' Sheet1   Sheets("Sheet1").Select   Set Target = Cells(2, 2).CurrentRegion.Offset(1, 1) ' Sheet1 元データ セル範囲 を変数に格納   Set Target = Target.SpecialCells(xlCellTypeConstants) ' Sheet1 元データ セル範囲 値のあるセルのみ抽出   k = 1 ' 出力行位置 初期化   For Each c In Target ' Sheet1 元データ セル範囲 値のあるセル を総当たりでループ     nCurColor = c.Interior.Color ' 基準の背景色を記録     cnDay = 1 ' 作業継続日数 初期化     ' ' ひとつ右のセルの背景色が基準の背景色と一致している間 ループ     Do While c.Offset(, cnDay).Interior.Color = nCurColor       cnDay = cnDay + 1 ' 作業継続日数をカウント     Loop     k = k + 1 ' 出力行位置を送り     ' ' 作業開始日 作業者名 作業継続日数 データを出力     rngPrint.Rows(k).Value = Array(Cells(1, c.Column), c, cnDay)   Next ' ' Sheet2   Sheets("Sheet2").Select ' ' 作業開始日 の順に ソート   rngPrint.Sort Key1:=rngPrint(1, 1), Order1:=xlAscending, Header:=True, Orientation:=xlSortColumns   MsgBox "抽出完了" End Sub ' ' ///

関連するQ&A

  • データ検索ネスト Excel VBA

    excel2003でデータ検索の処理をするというマクロをVBAで作成したいのですが、うまく動作しません。自作のVBAを記載してみましたので何が原因なのか教えてください。初心者です、よろしくお願いします。 Sub データ検索() Dim i As Integer, j As Integer, k As Integer, l As Integer Dim myRange As Range Dim IngLastrow As Long IngLastrow = Range("A65536").End(xlUp).Row For i = 3 To IngLastrow For j = 3 To 25 For k = 8 To 53 For l = 3 To 9 Set myRange = Worksheets("データベース").Cells(i, "o").Find(what:=Worksheets("コード").Cells(j, "o").Value, _ LookIn:=xlValues) If Not myRange Is Nothing Then Worksheets("予定").Cells(k, l).Value = myRange.Offset(, -12).Value End If Next l Next k Next j Next i End Sub

  • 抜き出しマクロ(3)

    以下のプログラムは10行ごとにデータを抜き出すプログラムです。 これに追加して、普段は10行に1個データを抜き出し、前回の結果より絶対値が10増減があったとき、 相対値が10%の増減があった時にもデータを抜き出すようにするにはどうすればいいですか? 例えば以下の通り time result 1   1 2   1 3   1 4   1 5   1 6   1 7   1 8   1 9   1 10   1 11  100 12  500 13  1000 14  1000 15  1000 16  1000 17  1000 18  1000 19  1000 20  1000 21  1000 ・  ・ ・  ・ ・  ・  ↓ time result 1   1 10  1 11  100 12  500 13  1000 20  1000 ・  ・ ・  ・ ・  ・ ここからプログラム(10行ごとに抜き出す) ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Sub nukitori() Dim X As Worksheet Dim i As Long Dim ii As Long Dim col As Integer Dim Nukitori_Step As Long Nukitori_Step = 10 i = 2 ii = 2 '●●●見出し行が1行目なので2で始める Set X = ActiveSheet '●シートShordataがあったら削除 On Error Resume Next Application.DisplayAlerts = False Worksheets("shortdata").Delete Application.DisplayAlerts = True On Error GoTo 0 Worksheets.Add.Name = "shortdata" '●先ず、見出しをコピー Worksheets("shortdata").Rows(1).Value = X.Rows(1).Value While X.Cells(i, 1) <> "" And i < 65535 For col = 1 To 255 Worksheets("shortdata").Cells(ii, col).Value = X.Cells(i, col).Value Next If i = 2 Then i = 1 i = i + Nukitori_Step ii = ii + 1 Wend End Sub ここからプログラム(10行ごとに抜き出す+増減があった場合も抜き出す) ただし以下の箇所でエラーが起こる If i > 3 And Abs(Cells(i, 1) - Cells(i - 1)) >= 10 Then 中断モードでコードを実行することができませんと。 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ Sub 抽出() Dim i As Long Dim j As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim Lastline As Long Dim SelFlg As Boolean '抽出データかどうかの Set ws1 = Worksheets("OriginDT") '元データ Set ws2 = Worksheets("SelectDT") '抽出データ Lastline = ws1.Cells(Rows.Count, 1).End(xlUp).Row '最終行番号を取得 ws2.Cells(1, 1) = ws1.Cells(1, 1) '見出し部分のコピー ws2.Cells(1, 2) = ws1.Cells(1, 2) j = 1 For i = 2 To Lastline SelFlg = False '10で割ったあまりが1(つまり10行おき)または最初のデータのとき If i Mod 10 = 1 Or i = 2 Then ' SelFlg = True '抽出対象にする End If '2行目以降で一つ上の行との差が10以上のとき If i > 3 And Abs(Cells(i, 1) - Cells(i - 1)) >= 10 Then SelFlg = True '抽出対象にする End If If SelFlg = True Then '抽出対象だったらコピー j = j + 1 ws2.Cells(j, 1) = ws1.Cells(i, 1) ws2.Cells(j, 2) = ws1.Cells(i, 2) End If Next End Sub

  • vbaでオーバーフローしてしまいました。

    Dim i As Long Dim k As Long For i = 1 To 829 For k = 1 To 995 Worksheets("2").Cells(k,i) = Worksheets("1").Cells(k,i) /Worksheets("1").Cells(996,i) Next k Next i これを実行したらオーバーフローしてしまい、途中までしか計算できませんでした。 解決方法を教えて頂きたいです。よろしくお願いします。

  • Do untilで判定されない

    office2010 WORKシートのI4802セルに2019/08/28という日付データが登録されています J2セルに2019/1/1の日付を設定し、その右セルに+1日ずつ設定するマクロ(カレンダ日付イメージ)で、上記WORKシートのI4802セルまでの日付を設定したい。 下記がそのマクロ Sub test() Rows("1:2").Select Selection.ClearContents Range("J2") = "2019/1/1" Dim i As Long Dim day As String day = Worksheets("WORK").Range("I4802").Value i = 11 Do Until Worksheets("Sheet2").Cells(2, i + 1) = day Worksheets("Sheet2").Cells(2, i) = Worksheets("Sheet2").Cells(2, i - 1) + 1 i = i + 1 Loop End Sub 上記を実行すると、ずっと計算して、2063/10/30までいって実行時エラーで停止します。 2019/08/28で終了しないのは何故でしょう? 日付判定になってると思うのですが、原因分からず。 また、その修正方法も教えて頂きたく

  • ExcelのVBAの配列に関する質問です。

    ExcelのVBAの配列に関する質問です。 sheet1のデータをsheet2に表示するVBAを作成しています。。 sheet1のデータは7行目からスタートし、sheet2のデータは26行目からスタートしています。。 sheet1とsheet2の列は同じ並びではないため、それぞれのシートの列番号をCellsを用いて指定しています。 Sub test1() Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 Worksheets("sheet2").Cells(j, 1) = Worksheets("sheet1").Cells(i, 2) Worksheets("sheet2").Cells(j, 8) = Worksheets("sheet1").Cells(i, 28) Worksheets("sheet2").Cells(j, 9) = Worksheets("sheet1").Cells(i, 31) Worksheets("sheet2").Cells(j, 10) = Worksheets("sheet1").Cells(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub 上記のtest1は正常に動くのですが、データ量が多いため、処理に時間がかかってしまいます。 高速化できないかと、以下のように変更しました。 Sub test2() Dim dataRange1 As Variant Dim dataRange2 As Variant dataRange1 = Worksheets("sheet1").Range("A1:GI10006") dataRange2 = Worksheets("sheet2").Range("A1:DZ10018") Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 dataRange2(j, 1) = dataRange1(i, 2) dataRange2(j, 8) = dataRange1(i, 28) dataRange2(j, 9) = dataRange1(i, 31) dataRange2(j, 10) = dataRange1(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub test2は、エラーメッセージ等は表示されませんが、sheet2にデータが表示されません。 ちなみに、以下のようにsheet1のみ配列化した場合は、正常に表示されました。 Worksheets("sheet2").Cells(j, 1) = dataRange1(i, 2) Worksheets("sheet2").Cells(j, 8) = dataRange1(i, 28) Worksheets("sheet2").Cells(j, 9) = dataRange1(i, 31) Worksheets("sheet2").Cells(j, 10) = dataRange1(i, 32) test2は、どこが間違っているのでしょうか? ご教示ください。 よろしくお願いいたします。

  • 実行時エラー1004がでてしまう(VBA)

    実行時エラー1004「RangeクラスのAutoFilterメソッドが失敗しました」が出てしまいます。 (1)とあるシートのL列に"判定"を作り、そこに、D列の名称の中に、特、SO、FRが入っていないものには〇をL列に入力し、〇が付くものを抽出するというものを作ったのですがエラーが出てしまいます。(この内容は@の範囲になります)解決策を教えていただけないでしょうか? (2)またこのVBAを行った際に、本ファイルの処理リストのデータと評価リストのデータが消えてしまいます。(データがうまく表示されていない状態で行間をダブルクリックすれば全て出てくる)解決策を教えていただけないでしょうか? ちなみに自分はVBA初心者です。 Sub 抽出() Dim フォルダ, ファイル名, 基本ファイル名 Dim i, j As String i = ActiveWorkbook.Name j = ActiveSheet.Name Application.DisplayAlerts = False '警告ダイアログボックスを表示しない 基本ファイル名 = Sheets("データリスト").Range("B8").Value '基本ファイル名(欲しいデータがあるBook)を定義 Workbooks.Open 基本ファイル名 '基本ファイル名(欲しいデータがあるBook)を開く Worksheets(1).Range("A1:O400").Copy '基本ファイル名内にある履歴データシートの内容をコピー Workbooks(i).Worksheets("処理リスト").Range("A1:O400").PasteSpecial '基本ファイル名のコピーを本ファイルの処理リストに貼り付ける Workbooks(基本ファイル名).Close SaveChanges:=False '基本ファイル名を閉じる Sheets(j).Select With Worksheets("処理リスト") .Range("A1").AutoFilter _ Field:=10, _ Criteria1:="003", _ Operator:=xlOr, _ Criteria2:="004" End With '本ファイルの処理リストのA列からの10列目の"003"もしくは"004" を抽出 'Dim k As Long …@ Range("L1") = "判定" For k = 2 To Cells(Rows.Count, 1).End(xlUp).Row With Cells(k, 4).Interior If .Cells(k, 4) <> "" * 特 * "" And .Cells(k, 4) <> "" * SO * "" And .Cells(k, 4) <> "" * FR * "" Then Cells(k, 12) = "〇" End If End With Next k Range("A1").AutoFilter 12, "〇" →ここでエラーが出る …@ Dim データ範囲 As Range Dim 抽出列 As Variant Dim l As Long Set データ範囲 = Worksheets("処理リスト").Range("A1").CurrentRegion 抽出列 = Array(3, 4, 5, 10) For l = 0 To UBound(抽出列) データ範囲.Columns(抽出列(l)).Copy Sheets("評価リスト").Range("D7").Offset(0, l) Next '本ファイルの処理リストの3,4,5,10列を本ファイルの評価リストのD7に貼り付け Application.DisplayAlerts = True '警告ダイアログボックスを表示するに戻す MsgBox ("履歴データを取り込みました") End Sub

  • エラー Nextに対するForがありませんについて

    VBAに慣れていないのですが、下記のマクロを組んでみました。 実行すると、コンパイルエラー Nextに対するForがありませんと出てしまいました。 原因が良く解らないので解る方いらっしゃいましたら教えてください。 それと、もっと良い書き方などありましたらアドバイスを下さい。 よろしくお願いします。 Sub レポート作成2each() Dim ReportMaxRow As Long '上方向に最終行を検索し行番号を格納 Dim AddWsName As String 'シート名格納 Dim Ws As Worksheet 'オブジェクト格納 Dim i As Long '繰り返しのカウントを格納 Dim flag As Boolean '真偽 ReportMaxRow = Worksheets("レポート元").Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To ReportMaxRow If Cells(i, "N").Value <> "" Then If Cells(i, "O").Value <> "" Then AddWsName = Cells(i, "K").Value For Each Ws In Worksheets If Ws = AddWsName Then flag = True Next Ws   ←ここでエラーになります。 If flag = True Then Worksheets("レポート元").Cells(i, 1).EntireRow.Copy _ Destination:=Worksheets(AddWsName).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Else Worksheets.Add ActiveWorksheet.Name = AddWsName Worksheets("レポート元").Cells(i, 1).EntireRow.Copy _ Destination:=Worksheets(AddWsName).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If MsgBox i + "行目の発注数の入力がませんでした。" & vbNewLine & "処理を中断します, _ vbOKOnly + vbExclamation, "お知らせ" End If Else MsgBox i + "行目の発注数の入力がませんでした。" & vbNewLine & "処理を中断します", _ vbOKOnly + vbExclamation, "お知らせ" End If Next i End Sub

  • シート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

  • excelデータベースによる差込印刷について質問です。

    新しい職場で使用されているデータベースがあるのですが、オートフィルタによる絞り込み後のデータのみ(可視セルのみ)の差込印刷ができなくて困っています。 データベースは「date.xls」ファイルに各データが格納され、「入力及び印刷.xls」ファイルのコマンドボタンにて入力・プリントアウトを行っています。 現状でも印刷ボタンはあるのですが、オートフィルタされたデータの一番上から一番下までのデータが全て印刷されてしまうようです(不可視セルも含めて) 以下に関係してそうなコードを記載します。 【印刷】 Private Sub CommandButton3_Click() '印刷 Dim Msg Dim i As Long, k As Long, eflag As Long UserForm1.Hide If StartData = 0 Or SaisyuData = 0 Then Exit Sub ' エラーが発生したら、エラー メッセージを作成 On Error Resume Next ' エラーのトラップを留保 Fukusya (StartData) ActiveWindow.SelectedSheets.PrintPreview 'commandpos If MsgBox("選択" & RowCount & "件 だけ印刷 ", vbOKCancel) <> vbCancel Then For i = StartData To SaisyuData Fukusya (i) ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True ActiveWindow.View = xlNormalView ' エラーの発生をチェックした後、メッセージを表示 If Err.Number <> 0 Then Msg = "エラー番号 " & Str(Err.Number) & Err.Source & " でエラーが発生" & Chr(13) & Err.Description MsgBox Msg, , "エラー", Err.HelpFile, Err.HelpContext End If Next 'commandpos End If Fukusya (SaisyuData) Calculate End Sub 【印刷コード内の各単語に関するもの】 Private Function StartData() Dim i As Long, k As Long, eflag As Long Dim start As Long k = Retu start = 0 For i = 3 To k If Workbooks("data.xls").Worksheets("data").Rows(i).Hidden = False Then start = i Exit For End If Next StartData = start End Function Private Function SaisyuData() Dim i As Long, k As Long, eflag As Long Dim stp As Long k = Retu stp = 0 For i = k To 3 Step -1 If Workbooks("data.xls").Worksheets("data").Rows(i).Hidden = False Then stp = i Exit For End If Next SaisyuData = stp End Function Private Sub Fukusya(mm As Long) 'data複写 Dim i As Long, j As Long, k As Long Dim nn As String nn = RowCount UserForm1.TextBox1.Value = nn UserForm1.TextBox4.Value = TourokuSoSu - 2 UserForm1.TextBox5.Value = Myretu - 2 k = Koumokusu j = mm 'データシートから配列に読み込み With Workbooks("data.xls").Worksheets("data") For i = 0 To k kou(3, i) = .Cells(j, i + 1).Value Next GazoSize(0) = .Cells(j, k + 3).Value GazoName(0) = .Cells(j, k + 2).Value GazoSize(1) = .Cells(j, k + 5).Value GazoName(1) = .Cells(j, k + 4).Value End With '配列からフォームに読み込み With Worksheets("入力") For i = 0 To k If kou(1, i) = "" Then Exit For .Range(kou(1, i)).Value = kou(3, i) Next End With image1 image2 End Sub 長くなって申し訳ありません。以上のようなコードになっています。 なんとか「date.xls」上で絞り込んだ可視セルのみを、「入力及び印刷.xls」ファイルに差し込んで印刷したいです。よろしくお願いいたします。

  • エクセルで範囲が変化する場合のΣ

    エクセルのマクロ初学者です。上下二つのセルの塊が用意してあり、上の塊にはすべて値が入っています。下のセルには、一定のルールで上のセルの和をとりその結果を表示させたいです。 ちなみにエクセル2003を使用しています。 以下、エラーが発生するデータ Sub Sigmaoperation() Dim i As Long Dim j As Long For k = 4 To 26 For i = 1 To 20 //kとiを変化させて二次元のデータを取得したいです。 For j = 1 To i  A = A - Cells((22 - j), k).Value + Cells((22 - j), (k - 1)).Value - Cells((23 - j), k).Value + Cells((23 - j), (k - 1)).Value    //上の塊のセルを4つ(jとkに依存)を選択し、その値を用いて上のような計算をします。ここで”型が違います”とエラーがでます。 Next Cells(51 - i, k).Value = A //ここでセルに値が入るつもりです Next Next End Sub Cells().valueの使い方がおかしいのか、おかしかったらどう変更すればよいのかいろいろ調べましたが解決しなかったので質問させていただきました。お詳しい方是非ご教授いただけるとありがたいです。 ここまで読んでいただきありがとうございます。

専門家に質問してみよう