• 締切済み

別シートにコピペするExcelVBA

超初心者なのですが、業務処理の簡素化のため、色々調べながら、下記を作りました。 が、、、うまく動いてくれません。。 やりたいことは、D列に「OK」とある行を、「終了リスト」というSheetにコピーし、コピーした行を削除。 その処理の前に、メッセージボックスで処理を進めて問題ないか確認する。。。です。 メッセージボックスでの処理分岐を入れようとして、色々記述を変えたところ、エラーになってしまいました。。。 どなたか、お詳しい方がいらっしゃいましたら、誤っている箇所をご指摘、ご教授いただけないでしょうか。 それから、もし可能であれば件数が0件の場合は、「対象なし」と表示したいです。 どうぞ宜しくお願いいたします。 Sub 終了処理() Dim cnt As Long Dim chk As Integer Dim i, LastRow As Long Dim myMsg1 As String, myMsg2 As String myMsg1 = "終了件数は" myMsg2 = "件です。完了しますか?" cnt = WorksheetFunction.CountIf(ActiveSheet.Range("A3:A65536"), "OK") chk = MsgBox(myMsg1, cnt, myMsg2, vbYesNo) If chk = vbYes Then LastRow = Cells(Rows.Count, 4).End(xlUp).Row For i = 1 To LastRow If Cells(i, 4) = "OK" Then Rows(i).Copy Sheets("終了リスト").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Rows(i).Delete shift:=xlUp Next i End If End Sub どうぞ宜しくお願いいたします。

みんなの回答

  • ap_2
  • ベストアンサー率64% (70/109)
回答No.3

おう・・書いてる間に投稿が。あっちは説明丁寧だ(p_q ANo.1+文字列は&で結合してからMsgBoxに、ね。  ×MsgBox(myMsg1, cnt, myMsg2,  ○MsgBox(myMsg1 & cnt & myMsg2, 細かい部分は適当に解釈して書いたから、チェックしてね。

  • ap_2
  • ベストアンサー率64% (70/109)
回答No.2

調べながらでコレなら、大したもんだと思うんだ。 ということで、説明省略。動作未確認。あと任せた。 不明な点あれば補足で。 ※cnt = ... 以降を修正 LastRow = Cells(Rows.Count, 4).End(xlUp).Row cnt = WorksheetFunction.CountIf(Range("D3:D" & LastRow), "OK") If cnt = 0 Then  'OKが無い  MsgBox "おなかすいた", vbYesOnly Else  'OKがある  chk = MsgBox(myMsg1 & cnt & myMsg2, vbYesNo)  If chk = vbYes Then   'Deleteで行数が変わるので下から処理。D3まで?   For i = LastRow To 3 Step -1    If Cells(i, 4) = "OK" Then     'コピー&削除     Rows(i).Copy Sheets("終了リスト").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)     Rows(i).Delete shift:=xlUp    End If   Next i  End If End If End Sub コメント入れるといいよ。あと、段わけすると間違えてEnd If消すこともない。

sunny32day
質問者

補足

ap_2様 早々にご回答をいただいているのに、お礼とレスが遅くなっており、大変申し訳ありません。 VBAまで丁寧に時間を割いて記載いただきましてありがとうございます!間に入れていただいているコメントも初心者でもわかりやすくて、とても助かります。 実は、ただいまPCがトラぶっておりまして、、ご教授いただいたVBAを、まだ実験できておりません。。。  PCが回復次第、ご教授いただいた方法でチャレンジしたいと思っております。 もう少々、お時間ください。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

ざっと見て気が付いたところを…… まず、「OK」という文字を、D列からではなく、A列で探しています。 cnt = WorksheetFunction.CountIf(ActiveSheet.Range("A3:A65536"), "OK") ↓ cnt = WorksheetFunction.CountIf(ActiveSheet.Range("D:D"), "OK") 次に If Cells(i, 4) = "OK" Then に対するEnd Ifがありません。 Next i の1つ上に入れましょう。 あと、上から1行づつ探して削除していますが、これでは駄目です。 例えば、3行目と4行目に「OK」が入っていたとします。 3行目の「OK」を見つけてコピーと削除を行うと、4行目が3行目になりますが、今のコードでは次に4行目(元5行目)をチェックしますので元4行目の「OK」は残ってしまいます。 これを避けるには下から上に見ていきます。また、それに合わせてコピーも変えてやります。 For i = 1 To LastRow   If Cells(i, 4) = "OK" Then     Rows(i).Copy Sheets("終了リスト").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)  ↓ For i = LastRow To 1 Step -1   If Cells(i, 4) = "OK" Then     Rows(i).Copy     Sheets("終了リスト").Rows(2).Insert shift:=xlDown 'コピーした行を終了リストの2行目に挿入

sunny32day
質問者

補足

mt2008様 早々にご回答をいただいているのに、お礼とレスが遅くなっており、大変申し訳ありません。 実は、ただいまPCがトラぶっておりまして、、ご教授いただいたのに、まだファイルにされていない状況です。 下から削除の件、詳しくご説明いただきましてありがとうございます。なるほど。。VBAを書く(?)時には、削除されて参照先が変わる。。まで想定してかかなければおかしくなるんですね。 自分で行コピー削除のVBA作ったときに実験はしたのですが、行飛んでOKにしていたので、連続行でうまくいかなくなる。ということには全く気づいていませんでした。 PC回復したら、上記もあわせて再度実験して勉強したいともいます。

関連するQ&A

  • ExcelVBAでのユーザーフォームについて

    ご回答ありがとうございました。 これといった資料がなく(探し方が悪いのかもしれませんが)、少ない経験値で複雑なというか面倒な処理のマクロ(VBA)を組まされることになり、困っているところです。当初の話だと「勉強しながらでよい」ということだったのですが、いろいろと仕事が次々と舞い込んできて、そんな余裕もなくせっぱ詰まり少ない知識で必死にやっています。 先にご回答いただいた内容で是非アドバイスをいただきたいと思い、新たに質問させていただきました。 ユーザーフォームでマルチページを作っています。そこでもコンボボックスを使うのですがそこの記述方法をアドバイス下さい。やっぱり記述場所がおかしいのか、クリックするとリストの内容がコンボボックスをクリックした分だけ繰り返してしまうことがあります。 ////////////////////////////////////////////////////// Private Sub UserForm_Initialize() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// Private Sub ComboBox1_DropButtonClick() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// とまぁ、結局コードは同じなのですが。 それと、結果をラベルに出させる場合には回答で記述いただいた ////////////////////////////////////////////////////// Private Sub ComboBox1_Change()   Dim vTgYear As Variant   vTgYear = ComboBox1.Value   Label1.Caption = vTgYear - 1 & "~" & vTgYear + 1 & "年" End Sub ////////////////////////////////////////////////////// で、よいでしょうか? よろしくお願いいたします。

  • マクロ 行を切り取ってペーストでエラーになる

    J列に「0」と「#N/A」の行を切り取って集計対象外シートに貼り付けるといったコードです。 何故か途中でエラーになります。 どこが間違っておりますか? 宜しくお願いします。 Dim LastRow As Long LastRow = Cells(Rows.Count, 10).End(xlUp).Row For i = 1 To LastRow If Cells(i, 10) = "0" Or Cells(i, 10) = "#N/A" Then Rows(i).Cut Sheets("集計対象外").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i

  • マクロ 入力する文字に色を付けたい

    Sub CountUp(ByVal mCol1 As String, mCol2 As String) Dim LastRow1 As Long Dim LastRow2 As Long Dim mRow As Long With Sheets("プレーヤー") LastRow1 = .Cells(Rows.Count, mCol1).End(xlUp).Row LastRow2 = .Cells(Rows.Count, mCol2).End(xlUp).Row If LastRow1 > LastRow2 Then mRow = LastRow1 Else mRow = LastRow2 End If If LastRow1 = 1 Then LastRow1 = 2 End If .Cells(mRow + 1, mCol1).Value = .Cells(LastRow1, mCol1) + 1 End With End Sub このコードに文字の色の指定をしたいです Selection.Font.ColorIndex = 3を入れたら赤色文字で入力できるかなと思ったのですがうまくいきませんでした(エラーにはならないのですが、色が付かなかったです)

  • ExcelVBAについて

    以上~以下検索についてです。 現在、1文字以上一致で検索し、listboxに検索結果を表示させることができます コードは下記 Private Sub CommandButton1_Click() Dim lastRow As Long Dim myData, myData2(), myno Dim i As Long, j As Long, cn As Long With Workbooks("Master.xlsm").Worksheets("Sheet1") myData = .Range(.Cells(3, 2), .Cells(Rows.Count, 5).End(xlUp)).Value lastRow = .Cells(Rows.Count, 2).End(xlUp).Row End With ReDim myData2(1 To lastRow, 1 To 4) For i = LBound(myData) To UBound(myData) If myData(i, 2) Like "*" & TextBox2.Value & "*" And _ myData(i, 3) Like "*" & TextBox3.Value & "*" And _ myData(i, 4) Like "*" & TextBox4.Value & "*" _ Then cn = cn + 1 myData2(cn, 1) = myData(i, 1) myData2(cn, 2) = myData(i, 2) myData2(cn, 3) = myData(i, 3) myData2(cn, 4) = myData(i, 4) End If Next i If cn = 0 Then MsgBox "検索結果は見つかりませんでした・・・" Else End If With ListBox1 .ColumnCount = 4 .ColumnWidths = "20;40;20;60" End With End Sub そして今回教えていただきたいのが userfoamで 例えば,金額が1000~100000の間のものを検索し、 それに該当するものすべてをリストボックスに表示させることです。 このコードに以上~以下検索を追加するにはどうすればいいでしょうか? 新しい方法、これよりいい方法があればお教えください。 よろしくお願いいたします。

  • VBAで文字列のカウントがうまくいかない・・・です

    Dim cnt As Long Dim i As Long Dim lastRow As Long For i = 1 to 20 step 2 lastRow = Cells(65536, i).End(xlUP).Row cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(10, i),Cells(lastRow, i), "お世話になっております")cnt = cnt + cnt Next Excelのセルを1列ずつ飛ばして列に「お世話になっております」が含まれたら件数をカウントしています。 そのカウント数が何故かリセットされてしまいます。 カウント数を足していきたいのですが・・・考え方自体が違うのでしょうか?

  • マクロで複数の行をまとめて切り取りする方法

    Iの列のセルに「テスト」があったら、その行を切り取ってシート2に貼り付ける といった流れのコードが下記です。 Sub 切り取り() Dim i, LastRow As Long LastRow = Cells(Rows.Count, 9).End(xlUp).Row For i = 1 To LastRow If Cells(i, 9) = “テスト” Then Rows(i).Cut Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i End Sub ●Iの列のセルに「テスト」と「課題」があったら、その行を切り取ってシート2に貼り付ける といったものをしたいのです。 1. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト,課題” Then 結果エラー 2. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト&課題” Then 結果エラー 正常なコードを教えてくださいますか? 宜しくお願いします。

  • VBA 検索するSheetの位置の変更

    現在、グループの数だけユーザー名の合計数をSheet2に抽出するという 事をやっているのですが....... コードの方は下記になります Sub Sample3() Dim i As Long, j As Long, k As Long, lastRow As Long, lastCol As Long Dim wS2 As Worksheet, wS3 As Worksheet Set wS2 = Worksheets("Sheet1") Set wS3 = Worksheets("Sheet2") Application.ScreenUpdating = False If wS2.Range("Y1") = "" Then wS2.Range("Y1") = "ダミー" End If With Worksheets("Sheet1") If .Range("A4") = "" Then .Range("A4") = "ダミー" End If lastRow = .Cells(Rows.Count, "B").End(xlUp).Row Range(.Cells(5, "B"), .Cells(lastRow, "B")).AdvancedFilter Action:=xlFilterCopy, copytorange:=wS3.Range("A1"), unique:=True '★ For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row wS2.Cells(7, (i - 2) * 8 + 3) = wS3.Cells(i, "A") .Range("A4").AutoFilter field:=2, Criteria1:=wS3.Cells(i, "A") Range(.Cells(5, "AA"), .Cells(lastRow, "AA")).SpecialCells(xlCellTypeVisible).Copy wS2.Cells(7, (i - 2) * 8 + 2) For k = wS2.Cells(Rows.Count, (i - 2) * 8 + 2).End(xlUp).Row To 7 Step -1 wS2.Cells(k, (i - 2) * 8 + 3) = WorksheetFunction.CountIfs(.Range("AA:AA"), wS2.Cells(k, (i - 2) * 8 + 2), .Range("B:B"), _ wS2.Cells(7, (i - 2) * 8 + 3)) If WorksheetFunction.CountIf(wS2.Columns((i - 2) * 8 + 2), wS2.Cells(k, (i - 2) * 8 + 2)) > 1 Then wS2.Cells(k, (i - 2) * 8 + 2).Resize(, 2).Delete shift:=xlUp End If Next k Next i wS2.Range("B1").CurrentRegion.Borders.LineStyle = xlContinuous wS2.Cells.Replace what:="ダミー", replacement:="", lookat:=xlWhole .Cells.Replace what:="ダミー", replacement:="", lookat:=xlWhole wS3.Cells.Clear .AutoFilterMode = False End With Application.ScreenUpdating = True End Sub このコードで検索をかけるSheet1のセルBの文字をセルCに移動して検索かけたいという事なのですが、下記の用なコードでBをCに変更してみた結果エラーが発生してしまいます。 lastRow = .Cells(Rows.Count, "C").End(xlUp).Row Range(.Cells(5, "C"), .Cells(lastRow, "C")).AdvancedFilter Action:=xlFilterCopy, copytorange:=wS3.Range("A1"), unique:=True '★ For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row wS2.Cells(7, (i - 2) * 8 + 3) = wS3.Cells(i, "A") .Range("A4").AutoFilter field:=2, Criteria1:=wS3.Cells(i, "A") Range(.Cells(5, "AA"), .Cells(lastRow, "AA")).SpecialCells(xlCellTypeVisible).Copy wS2.Cells(7, (i - 2) * 8 + 2) For k = wS2.Cells(Rows.Count, (i - 2) * 8 + 2).End(xlUp).Row To 7 Step -1 wS2.Cells(k, (i - 2) * 8 + 3) = WorksheetFunction.CountIfs(.Range("AA:AA"), wS2.Cells(k, (i - 2) * 8 + 2), .Range("C:C"), _ どなたかご教授の方お願い致します。

  • マクロでファイルを読み込み、重複行を削除したい。

    35万件以上あるエクセルデータに対して、マクロを使って以下のような処理で重複業を削除したいと思っています。 Sub DeleteOldRow() Dim lastRow As Integer Dim i As Integer Dim j As Integer Dim strVal As String 'B列の最終行を求めます。 lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 2).End(xlUp).Row '1行目から最終行の前まで繰り返します。 For i = 1 To lastRow - 1 'チェックする値を、strValに代入します。 strVal = ActiveSheet.Cells(i, 2).Value '今見てる行から、下をチェックします。 For j = i + 1 To lastRow 'もし、値が同じであれば、 If strVal = ActiveSheet.Cells(j, 2).Value Then '元の行を削除します ActiveSheet.Rows(i).Delete '最終行が1行減ったのでlastRowの値を減らします。 lastRow = lastRow - 1 'チェックしている行を1行前に戻します。 j = j - 1 End If Next j Next i End Sub 上記処理を35万件あるファイル上でマクロの実行すると、オーバーフローしてしまいました。マクロ側で対象ファイルを読み込むなどして、処理を軽くするやり方はありますでしょうか。上記処理にどのような処理を加えればスムーズに処理されるでしょうか。

  • Excelのワークシートでのコンボボックスについて

    Excelのワークシートでコンボボックスを設定する方法を教えてください。 「フォームコントロール」と「ActiveXコントロール」の違いがわかりません。 添付の画像の通りコンボボックスに西暦を入力(別シートに入力済みの値を表示するように設定)してあるのですが、ファイルを保存しているにも関わらず、再度ファイルを開くとコンボボックスの中のリストは空欄になってしまいます。 今は「ActiveXコントロール」のコンボボックスで設定しています。 コードは以下のように設定してみたのですが、設定内容や設定箇所が違うのでしょうか? ////////////////////////////////////////////////////// Private Sub ComboBox1_DropButtonClick() Dim sh As Worksheet Set sh = Worksheets("マクロ") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// コンボボックスのリストの内容が消えてしまうので、 コードの内容は同じで以下のところにもコードを書いてみました。 ////////////////////////////////////////////////////// Private Sub Worksheet_Activate() Dim sh As Worksheet Set sh = Worksheets("マクロ") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// なんだかもう、訳がわからずぐちゃぐちゃです。 コンボボックスの中に値が入っていると、実行ボタンをクリックしたときは正常にやりたい結果を出すことが実現できます。 ファイルを閉じた後に再度開いてもコンボボックスの中に値があるようにするにはどうしたらよいのか、ド素人の私にご教授いただきたくお願いいたします。

  • エクセル 検索コピーマクロ

    マクロで検索、抽出して別ファイルに保存したいのですが、 以下のようなマクロを教えてもらったのですが コピー先のセル位置を任意の位置に直したいのですが、 どうしてもわかりません どの部分をどう直せばよいのでしょうか? Option Explicit Sub copyTodayData() Dim dateToday As String Dim tempDate As String Dim lastrow1 As Long Dim lastrow2 As Long Dim i As Long Dim fileA As String Dim anotherBook As String Dim anotherFilePath As String fileA = ThisWorkbook.Name anotherBook = "別のファイル.xls" anotherFilePath = "C:\Documents and Settings\日本太郎\デスクトップ\どこかのフォルダ" '問い合せダイアログの表示をOFFにします Application.DisplayAlerts = False 'ファイルを開く ChDir anotherFilePath Workbooks.Open Filename:=anotherFilePath & "\" & anotherBook '問い合せダイアログの表示をONに戻します Application.DisplayAlerts = True 'ウインドウの切替 Windows(fileA).Activate '今日の日付を取得 dateToday = Date 'データ最終行を取得 lastrow1 = Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To lastrow1 If Cells(i, 1) = dateToday Then 'Range(Cells(i, 1), Cells(i, 4)).Copy 'コピー Windows(anotherBook).Activate 'ウインドウの切替 lastrow2 = Cells(Rows.Count, 1).End(xlUp).Row '別ブックの最終行 Cells(lastrow2 + 1, 1).Select ActiveSheet.Paste Windows(fileA).Activate 'ウインドウの切替 End If Next i MsgBox "実行しました" End Sub たぶん、lastrow2 = Cells(Rows.Count, 1).End(xlUp).Row '別ブックの最終行 Cells(lastrow2 + 1, 1).Select ここらへんというのは、わかりますが、 どこをどう変えたらいいかわかりません

専門家に質問してみよう