• 締切済み

VBA 切り分けがうまくいかない

A列のデータで切り分けるようプログラム作成しています。 あるデータをA列で切り分けることができましたが、切り分けた後のファイル内容を確認したら、E列以降の内容が元データと異なっていました。 E列にはプルダウンメニューを入れていますので、それが原因かと思い、プルダウンメニューを消した元データで切り分けてみましたが、解決できませんでした。 他のデータ(プルダウンなし・空欄なし)では問題なく正しい内容で切り分けることができています。 フルダウン入りや空欄があるデータだと、正確に切り分けることができないかどうかご教示いただけますと幸いです。 VBAを作った担当者は異動してしまったため、直すことができませんでした。 宜しくお願いします。 Sub Macro5() ' ' Macro5 Macro ' Dim txtFilename As String '元のファイル名 Dim txtS As String '分類名保存用 Dim htxtS As String '定形文保存用 Dim cRow As Integer '行数カウント用 Dim sRow As Integer '行数保存用 Dim eRow As Integer '最終行格納用 Dim h As Integer 'データ入力行保管用 Dim j As Integer 'データ入力開始列 Dim i As Integer '分類項目列保管用 Dim e As Integer '分類項目最終行数保管 i = Cells(18, 9).Value '分類項目列取得 j = Cells(14, 9).Value 'データ入力開始列 h = Cells(14, 11).Value 'データ入力行取得 htxtS = Cells(21, 9).Value '定型文取得 '元ファイル名(=同じフォルダ)を取得する txtFilename = Dir(ThisWorkbook.Path & "¥*.xlsx") 'ファイルを開ける Workbooks.Open ThisWorkbook.Path & "¥" & txtFilename Sheets(1).Activate '分類項目の最終行を取得する e = Cells(h, i).End(xlDown).Row '分類項目でソートを掛ける Cells(h - 1, j).Activate Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.AutoFilter ActiveWorkbook.Worksheets(1).AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets(1).AutoFilter.Sort.SortFields.Add Key:= _ Range(Cells(h - 1, i), Cells(e, i)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _ :=xlSortNormal With ActiveWorkbook.Worksheets(1).AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With sRow = 0 cRow = h eRow = h '対象項目の行が無くなるまで繰り返す Do Until cRow > eRow '対象シートを新しいブックに貼り付ける Worksheets.Select Worksheets.Copy Sheets(1).Activate ' 項目名(=ファイル名)の退避 Cells(h, i).Select txtS = ActiveCell.Value '1つ目の分類項目を格納 ' 最終行の取得 eRow = Cells(h - 1, i).End(xlDown).Row cRow = h '分類項目が変わるまで繰り返す Do While txtS = Cells(cRow, i).Value cRow = cRow + 1 '1行加算 Loop '最終行が1行の時は削除されないように対象分類項目以下を削除をスキップする If cRow <> eRow + 1 Then '対象分類項目以下を削除 Rows(cRow & ":" & eRow).Select Selection.Delete End If '対象分類の行数を保存 sRow = cRow - 1 'ファイル名を指定して保存 Cells(1, 1).Activate Selection.AutoFilter With ActiveWorkbook .SaveAs ThisWorkbook.Path & "¥" & htxtS & txtS & ".xlsx" '元ファイルと同フォルダに保存する .Close End With '元のファイルに戻りファイル作成済みの項目を削除 Windows(txtFilename).Activate Sheets(1).Activate ActiveWindow.SelectedSheets(1).Select Rows(h & ":" & sRow).Select Selection.Delete Shift:=xlUp Cells(1.1).Activate Loop MsgBox ("ファイル分割処理が終了しました") '元ファイルを保存せずに閉じる Workbooks(txtFilename).Close SaveChanges:=False End Sub

みんなの回答

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

VBAコードをあまり見ていないと書いたのは、質問の内容を把握できなかったからです。 あくまでもEndプロパティを使う場合の参考意見です。 >A列のデータで切り分けるようプログラム作成しています。 まず、この行の意味が分かりません。万人に分かるように.書くべきでしょう。 A列にどのようなデータが入って、どのように切り分けるのでしょうか。 また、切り分けとは何でしょうか? >E列にはプルダウンメニューを入れていますので、それが原因かと思い これも意味が分かりません。シートの概要とか、対象Bookの構造を示すべきでしょう。 プルダウンメニューがあるのはどのBookでしょうか。 >フルダウン入りや空欄があるデータ プルダウンとは入力規則のことですか?プルダウンセルは全て選択されているんでしょうか。全て文字列や数値が選択されていますか? 空欄とは未入力行のことですか?未入力セルのことですか?まさかスペース? >上記のように修正しましたが、エラーメッセージが出てしまいました。 データ内容もからず、こう書れても手が出ません。 データを明らかにし、エラーがどの行で起きたか示すべきでしょう。 そうされても解決できるか分かりませんが。 前回回答はあくまで、未入力セルがあるときのEndプロパティの引数の使い方がおかしいということの説明です。元のコードがそのようなデータを想定していないということになります。

nkmyr
質問者

お礼

説明不足ですみません。 マクロ処理するデータ「マクロ.xlsm」データ元「部署.xlsx」完成データ「完成.xlsx」 データ元 A列   B   C     D   E(プルダウンメニュー) 人事  鈴木  生年月日  住所  血液型A 総務  山田  生年月日  住所  血液型B 企画  高橋  生年月日  住所  血液型不明 人事  田中  生年月日  住所  (空欄) 人事  小島  生年月日  住所  血液型B 企画  山本  生年月日  住所  血液型B 総務  斉藤  生年月日  住所  血液型A ※E列のプルダウンメニュー https://office-hack.com/excel/pulldown-menu/ プルダウンメニューの内容(5個) ・血液型A・血液型B・血液型O・血液型AB・血液型不明 「マクロ.xlsm」で処理すると「完成.xlsx」は以下になるものです。 切り分けとはA列の部署によって切り分けるということです。 A列   B   C     D   E(プルダウンメニュー) 人事  鈴木  生年月日  住所  血液型A 人事  田中  生年月日  住所  (空欄) 人事  小島  生年月日  住所  血液型B 総務  山田  生年月日  住所  血液型B 総務  斉藤  生年月日  住所  血液型A 企画  高橋  生年月日  住所  血液型不明 企画  山本  生年月日  住所  血液型B となるのですが、空欄があると下のデータが繰り上げてしまうのです。 A列   B   C     D   E(プルダウンメニュー) 人事  鈴木  生年月日  住所  血液型A 人事  田中  生年月日  住所  血液型B 人事  小島  生年月日  住所  血液型B  総務  山田  生年月日  住所  血液型A 総務  斉藤  生年月日  住所  血液型不明 企画  高橋  生年月日  住所  血液型B 企画  山本  生年月日  住所 となってしまい、正確なデータができてないのです。 宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

VBAコードはあまり見ていません。ファイルの中身が分からないので、あくまで想像です。ご容赦を。当方Excel2010です。 空欄があるとうまくいかないということをヒントに考えてみました。 コードには「RangeオブジェクトのEndプロパティ」が4カ所使われています。 Endプロパティの引数が「xlDown」、「xlToRight」なので、上から下、または左から右のセルの途中に空欄があると意図した領域が選択できません。 空欄がある場合の最終セルを求めるには、行の場合は一番下から「xlUp」で上に向かって調べます。 列の場合も、右端から「xlToLeft」で左に向かって調べます。 下のコードはその辺を考慮しています。 しかし、最終行や最終列に空欄があって、その列や行で範囲を決める場合、正しくも求まらない場合があります。添付図のA列、C列、8行目のような例です。 データ内容が分からないので判断付きかねますが、最悪、各列の最下段、各行の最右セルの最大値を求める必要があるかもしれません。 この辺りはいくらがんばっても何が起きるか分からないので、データの構造を工夫して、「Selection.CurrentRegion.Select」等が使えるようにするのが賢明だと思います。   '分類項目の最終行を取得する   'e = Cells(h, i).End(xlDown).Row      '// 元   e = Cells(Rows.Count, i).End(xlUp).Row '// 修正   '分類項目でソートを掛ける   Cells(h - 1, j).Activate   'Range(Selection, Selection.End(xlToRight)).Select '// 元   Range(Selection, Cells(h - 1, Columns.Count).End(xlToLeft)).Select '// 修正   'Range(Selection, Selection.End(xlDown)).Select '// 元   Range(Selection, Cells(Rows.Count, j).End(xlUp)).Select '// 修正   '最終行の取得   'eRow = Cells(h - 1, i).End(xlDown).Row '// 元   eRow = Cells(Rows.Count, i).End(xlUp).Row '// 修正

nkmyr
質問者

お礼

コメントをありがとうございます。 上記のように修正しましたが、エラーメッセージが出てしまいました。 実行時エラー'1004' 'Select'メソッドは失敗しました 'Sheets'オブジェクト

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • EXCEL VBA作成方法

    職場で頭の痛いことがありまして・・・ 月合計をEXCELで1つのシートに出すことは出来ますが、それを日付ごとに(1日~31日)複数シートにする方法がわかりません。 内容は自分で工夫をして見ましたがうまくできません。ご教授をいただけますでしょうか? Sub 月別シート分割() Dim 元シート As Worksheet Dim 列幅() As Variant Dim 条件列 As Integer Dim 月 As Long Dim 条件1 As String, 条件2 As String Dim i As Integer, j As Long Set 元シート = ActiveSheet ActiveCell.CurrentRegion.Select ReDim 列幅(Selection.Columns.Count) For i = 1 To Selection.Columns.Count 列幅(i) = Selection.Cells(, i).ColumnWidth Next 条件列 = 1 月 = Month(ActiveCell.Offset(1, 条件列 - 1)) If Selection.AutoFilter Then Selection _ .AutoFilter For i = 1 To 31 Sheets.Add Before:=Sheets(i) ActiveSheet.Name = i & "" 条件1 = ">=" & DateSerial(月, i, 1) 条件2 = "<" & DateSerial(月, i + 1, 1) 元シート.Activate ActiveCell.CurrentRegion.Select Selection.AutoFilter Field:=条件列 _ , Criteria1:=条件1 _ , Operator:=xlAnd _ , Criteria2:=条件2 Selection.SpecialCells( _ xlCellTypeVisible).Copy Sheets(i).Range("A1").PasteSpecial For j = 1 To Selection.Columns.Count Sheets(i).Cells(, j).ColumnWidth _ = 列幅(j) Next j Next i Selection.AutoFilter Sheets(1).Activate End Sub

  • VBA エクセル 合計

    皆様、こんにちは。 それぞれの値が入っている会計シート(シートの形式は同じ)を一つの合計シートに合計しようとしていますが、うまくいきません。具体的に、数値の合計ができません。 例えば、ある項目に対して、シートAに100が入力され、シートBには230が入力されているとすれば、合計シートに100+230=330を入力したいです。なお、全ての会計シートは"Form"というエクセルシートにあり、その数をユーザが決めますので、検索しなければいけません。そして、合計シートは"Result"にあります。 以下のように書いてみましたが、間違っているようです。 Worksheets("Result").Activate Dim SR As Integer Dim SC As Integer 'SR is start row 'SC is start column SR = 6 SC = 2 Worksheets("Form").Activate Dim i As Integer i = 68 Do While 1 = 1 If Selection.Cells(i, 4).Value = "" Then Exit Do End If i = i + 49 Loop Sum = 0 Sum = Sum + Selection.Cells(i, 4) Worksheets("Result").Activate Cells(SR + 5, SC + 2) = Sum 詳しい方に教えていただければ非常に助かります。 どうぞよろしくお願いします。

  • マクロでのActiveSheet.Pasteでのデバック

    関数の入ったセルを切取りで貼付けたいのですが、ActiveSheet.Pasteのところで"WorksheetクラスのPasteメソッドが失敗しました.”のデバッグになってしまいます。対応を教えていただけないでしょうかお願い致します。 Sub susiki() Columns("A:J").Select Selection.AutoFilter Selection.AutoFilter Field:=6, Criteria1:="AG" Dim kirix As Integer, kiriy As Integer Dim kiriz As Long kiriy = Range("A:A").Column kiriz = Range("F1").End(xlDown).Row For kirix = 1 To kiriy Range(Cells(kiriz, kirix), Cells(kiriz, kirix)).Select Selection.CurrentRegion.Select Selection.Cut Next kirix Selection.AutoFilter Field:=6, Criteria1:="DB" Dim harix As Integer, hariy As Integer Dim hariz As Long hariy = Range("A:A").Column hariz = Range("F1").End(xlDown).Row For harix = 1 To kiriy Range(Cells(hariz, harix), Cells(hariz, harix)).Select ActiveSheet.Paste Next harix Selection.AutoFilter End Sub

  • エクセルのVBAの記述について

    VBAの記述についてなのですが、 Sub filter() Dim gyo As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = Worksheets("データ") Set ws2 = Worksheets("チーム") Application.ScreenUpdating = False ws2.Range("A4:BH30").Clear gyo = ws1.Range("A65536").End(xlUp).Row ws1.Activate With ws1.Range(Cells(4, 1), Cells(gyo, 6)) .AutoFilter Field:=1, Criteria1:="A" .SpecialCells(xlCellTypeVisible).Copy ws2.Range("A4") Selection.AutoFilter End With Application.ScreenUpdating = True End Sub ならプログラムははしるのですが、 14行目を .SpecialCells(xlCellTypeVisible).Copy ws2.Range(Cells(4, 1)) だと 「実行時エラー 1004 Rangeメソッドは失敗しました Worksheet オブジェクト」 とでるのですが、出来ないのでしょうか? Cells(4, 1)の1のところを変数にして変えていきたいのですが、よい方法はありますか。 よろしくお願いいたします。

  • VBAでハイパーリンクをつける

    仕事で画像のファイル名をExcelに書き出し、書き出しものにハイパーリンクで見がうまくいきません。下記のものです。どこが悪いのでしょうか? Option Explicit Dim ドライブ As String Dim フォルダ As String Dim 拡張子 As String Dim 記入シート As String Dim パス As String Dim ファイル名 As String Dim 貼付行 As Integer Sub フォルダ中のファイル名をシートに書く() ドライブ = "C" フォルダ = "分析" 拡張子 = "*." & "JPG" 記入シート = "ファイル一覧" End Sub Private Sub 指定フォルダ中の指定拡張子のファイル名をシートに書く() Sheets(記入シート).Activate Cells.Clear Range("A1").Select パス = ドライブ & ":\" & フォルダ & "\" ファイル名 = Dir(パス & 拡張子) 貼付行 = 0 Do While ファイル名 <> "" 貼付行 = 貼付行 + 1 Cells(貼付行, 1).Value = ファイル名 ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:=ファイル名, TextToDisplay:=ファイル名 ファイル名 = Dir() Loop End Sub 実行すると初めの一行だけリンクができ後は一行もできません。よろしくお願い致します。

  • エクセル マクロ:文字変更

    教えてください。 sheet5にデータがあります。 マクロを実行すると、一番右の列のセルに○があると●と書き換える 一番右の列のセルに△があると▲と書き換えるコードを作成しています。 下記のコードでは時間がかかってしまいます。 省略 If Sheets("sheet5").Cells(r, cmax).Value = "○" Then Sheets("sheet5").Cells(r, cmax).Value = "●" 省略 AutoFilterを使用してマクロを作成しましたが、列に○と△が両方無いと 範囲指定したセルがすべて▲となってしまいます。 下記コードをどのように手直ししたらよいのか教えて頂けないでしょうか。 よろしくお願いします。 Sub 文字変更() Dim c As Integer Dim cmax As Integer Dim rmax As Long With Sheets("sheet5") rmax = .Range("A3").End(xlDown).Row cmax = .Range("A3").End(xlToRight).Column .Rows("1:1").Select Selection.AutoFilter For c = 2 To cmax Selection.AutoFilter Field:=c, Criteria1:="○" .Cells(1, c).Offset(1, 0).Select .Range(Selection, Cells(rmax, c)).Value = "●" Selection.AutoFilter Field:=c, Criteria1:="△" .Cells(1, c).Offset(1, 0).Select .Range(Selection, Cells(rmax, c)).Value = "▲" Selection.AutoFilter Field:=c Next c End With Selection.AutoFilter End Sub

  • 好みの列にフィルタをかけたいのですが・・?

    Windows XP Home Edition Excel 2002 変数関連の記述の仕方が間違っていると思いますが、 いろいろ試してみましたが、うまく実行できません。 何卒、ご教示お願い致します。 Sub オートフィルタtest() Dim i As Long Dim S As Range Dim Sdown As Range Set S = Selection.Cells(1, i) Set Sdown = Selection.Cells(2, i) Rows("6:6").AutoFilter Sheets(1).Activate Selection.AutoFilter Field:=i, Criteria1:=">=2", Operator:=xlAnd, _ Criteria2:="<3" With Range(Sdown, Sdown.End(xlDown)) .Interior.ColorIndex = 40 End With End Sub

  • エクセルVBAの繰り返し処理の質問

    C列にある項目とG列にある項目を比較して、 一致し、H列にある数字が10以上ならば、B列にフラグ1を立てる という処理を行いたいんですが、 下記ぐらいまでしか作れず、うまくいきません・・・ Sub フラグを立てる処理() Dim i As Integer Dim j As Integer Dim k As Integer i = 1 j = 1 Do j = j + 1 Do i = i + 1 If Cells(j, 8) > 9 Then Cells(i - 1, 4) = 1 End If Loop Until Cells(i, 3) <> Cells(j, 7) Or Cells(i, 3) = "" Loop Until Cells(j, 7) = "" End Sub わかる方がいらっしゃいましたら、お願いします。

  • VBAトラブル

    Sub 百人一首一番から二十番() Dim hyakuSh As Worksheet Dim mySh As Worksheet Set mySh = Worksheets("百人一首クイズ") Set hyakuSh = Worksheets("百人一首") Dim myRow As Integer Randomize myRow = Int((21 - 2 + 1) * Rnd + 2) Dim kaminoku As String Dim kaminoku2 As String Dim kaminoku3 As String Dim simonoku As String Dim simonoku1 As String Dim sakusha As String kaminoku = hyakuSh.Cells(myRow, 3).Value kaminoku2 = hyakuSh.Cells(myRow, 4).Value kaminoku3 = hyakuSh.Cells(myRow, 5).Value shimonoku = hyakuSh.Cells(myRow, 6).Value shimonoku1 = hyakuSh.Cells(myRow, 7).Value sakusha = hyakuSh.Cells(myRow, 8).Value mySh.Activate mySh.Shapes("Text Box 2").Select Selection.Characters.Text = kaminoku & Chr(10) & kaminoku2 & Chr(10) & kaminoku3 Dim MyTBox As Integer Dim smRow As Integer Dim smRow2 As Integer Dim smRow3 As Integer Dim smRow4 As Integer Dim smRow5 As Integer Dim i As Integer mySh.Shapes(2).Select Randomize smRow5 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow5, 6).Value & Chr(10) & hyakuSh.Cells(smRow5, 7).Value & Chr(10) & hyakuSh.Cells(smRow5, 8).Value mySh.Shapes(3).Select Randomize smRow = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow, 6).Value & Chr(10) & hyakuSh.Cells(smRow, 7).Value & Chr(10) & hyakuSh.Cells(smRow, 8).Value mySh.Shapes(4).Select Randomize smRow2 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow2, 6).Value & Chr(10) & hyakuSh.Cells(smRow2, 7).Value & Chr(10) & hyakuSh.Cells(smRow2, 8).Value mySh.Shapes(5).Select Randomize smRow3 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow3, 6).Value & Chr(10) & hyakuSh.Cells(smRow3, 7).Value & Chr(10) & hyakuSh.Cells(smRow3, 8).Value mySh.Shapes(6).Select Randomize smRow4 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow4, 6).Value & Chr(10) & hyakuSh.Cells(smRow4, 7).Value & Chr(10) & hyakuSh.Cells(smRow4, 8).Value Randomize MyTBox = Int((6 - 2 + 1) * Rnd + 2) mySh.Shapes(MyTBox).Select Selection.Characters.Text = shimonoku & Chr(10) & shimonoku1 & Chr(10) & sakusha mySh.Shapes("Text Box 2").Select Dim Ans As Integer Ans = InputBox(hyakuSh.Cells(myRow, 3).Value & hyakuSh.Cells(myRow, 4).Value & hyakuSh.Cells(myRow, 5).Value & Chr(10) & Chr(10) & "下の句を番号で答えなさい", Title:="百人一首", Xpos:=7500, Ypos:=2500) If Ans = MyTBox Then MsgBox " 正解!!! V(・ o ・)V " Else MsgBox ("間違いです!!!!!!!!" & Chr(10) & Chr(10) & hyakuSh.Cells(myRow, 6).Value & hyakuSh.Cells(myRow, 7).Value & Chr(10) & Chr(10) & sakusha & "です") End If End Sub 以上のマクロをエクセルで作ったのですが、VBE~マクロを走らせると順調に走るのですが、マクロをボタンに登録すると、Inputbox に解答を掘り込んであげないと、kaminokuもshimonokuもあたらしいものになりません 今マクロはシート上にあります、マクロを標準モジュールに移しても同じ結果です。何か解決策はありますか? かなり古くエクセル2000です、初心者なので難しいこことはわかりませんが、よろしくお願いします。

  • VBAの検索について

    Excelシートに表の一覧があり、項目(5行目)のところでウィンドウの固定をしています。 検索したいNo.をセル(G2)に入力し、コマンドボタンをクリックします。 セル(G2)に入力されたNo.とA列に入力されているNo.が一致する行を検索し、一致した行(複数はない)を項目の下までスクロールさせた状態で表示したいと思っています。 検索までは下記プログラムでできているのですが、一致した行を項目の下までスクロールさせた状態で表示するのはどうしたらよいのでしょうか。 ************************************************************* Private Sub CommandButton1_Click()   Dim myClm As Integer, myFind As Integer, myRow As Integer   myClm = 1 'A列   If Sheet1.Range("G2") = "" Then Exit Sub   myFind = Sheet1.Range("G2")   For myRow = Cells(Rows.Count, myClm).End(xlUp).Row To 1 Step -1    With Cells(myRow, myClm)     If .Value Like myFind Then       .Activate       Exit For     End If    End With    Next End Sub ************************************************************

専門家に質問してみよう