マクロ条件追加についての質問

このQ&Aのポイント
  • マクロの条件追加方法を教えてください。
  • エクセルファイルの特定の列に条件を追加してマクロを動作させる方法を知りたいです。
  • 特定の列に特定の文字が存在している場合にのみマクロを実行する方法を教えてください。
回答を見る
  • ベストアンサー

マクロの条件を追加したいのですが

いつもお世話になります、MEGUMIと申します。 既存のマクロに更に条件を追加したいという質問をさせてください。 現在、フォルダの中にある全てのエクセルファイルを下記のような処理をしています。 ●エクセルファイルの中の全てのSheetの1行目以降のA,B,C,G,H列をコピーしてマクロを動作させるエクセルファイルのSheet1に順次(A,B,C,D,E列)ペースト  ※マクロは下記の内容( Sub 今日のわたし()以降です )です。 これに下記のような条件を追加したいのですがどのようにすればいいでしょうか? ○I列に”元気”という文字が存在していた場合に限って、その列のA,B,C,G,H,I列をコピーしてマクロを動作させるエクセルファイルのSheet1に順次(A,B,C,D,E,F列)ペースト お忙しいところ大変恐れ入りますがもしご存知の方がいらっしゃりましたらご指導のほど何卒宜しくお願いいたします。 Sub 今日のわたし() Dim XlFile As String Dim MotoDataLastRow As Long Dim CopySakiLastRow As Long ThisWorkbook.Activate Worksheets(1).Select Cells.Clear XlFile = Dir(ThisWorkbook.Path & "\*.xls?") Do While XlFile <> "" If XlFile <> ThisWorkbook.Name Then Workbooks.Open ThisWorkbook.Path & "\" & XlFile, ReadOnly:=True Worksheets(1).Select MotoDataLastRow = Workbooks(XlFile).Worksheets(1).[A65536:H65536].End(xlUp).Row '元データファイルの最終行を取得 CopySakiLastRow = ThisWorkbook.Worksheets(1).[A65536:E65536].End(xlUp).Row 'インポート先の最終行を取得 If MotoDataLastRow > 1 Then Range([A2], Cells(MotoDataLastRow, "C")).Copy ThisWorkbook.Worksheets(1).Cells(CopySakiLastRow + 1, "A") Range([G2], Cells(MotoDataLastRow, "H")).Copy ThisWorkbook.Worksheets(1).Cells(CopySakiLastRow + 1, "D") End If Workbooks(XlFile).Close False End If XlFile = Dir() Loop End Sub

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

ANo2-3 merlionXXです。 どうもよくわかりません。 > ”元気”という文字のある列のA,B,C,G,H,IをコピーしてA,B,C,D,E,F列にコピーで問題ないです。 ”元気”という文字のある列はI列ですよね? そのI列になぜA,B,C,G,H列があるんですか?I列にはI列しかないでしょう? ”元気”という文字のある行のA,B,C,G,H,I列をコピーするんじゃないのですか? > 現在の問題は > ”元気”という文字がI列に入っていなくて別の文字が入っていてもコピーしてきてしまいます。 これはANo.2で回答したコードでの結果ではないのですか? ANo3のコード、Sub 今日のわたし03() では、”元気”という文字のある行だけ、A,B,C,G,H,I列をコピーするようにしたはずなのですが。 ひょっとしてエクセルのバージョンが違うとオートフィルタのコピーがうまくいかないのかもしれません。 可視セル("元気"フィルターで抽出されたセル)だけコピーするように変えてみました。 これでどうでしょう? Sub 今日のわたし04()   Dim XlFile As String   Dim MotoDataLastRow As Long   Dim CopySakiLastRow As Long   Dim myC As Range   ThisWorkbook.Activate   Worksheets(1).Select   Cells.Clear   Application.ScreenUpdating = False   XlFile = Dir(ThisWorkbook.Path & "\*.xls?")   Do While XlFile <> ""     If XlFile <> ThisWorkbook.Name Then       Workbooks.Open ThisWorkbook.Path & "\" & XlFile, ReadOnly:=True       With Worksheets(1)         Set myC = .Columns("I:I").Find(What:="元気", LookAt:=xlPart)         If Not myC Is Nothing Then           .AutoFilterMode = False           .Range("I:I").AutoFilter field:=1, Criteria1:="=*元気*"           MotoDataLastRow = Workbooks(XlFile).Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row '元データファイルのA列最終行を取得           CopySakiLastRow = ThisWorkbook.Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row 'インポート先のA列最終行を取得           .Range("A2", Cells(MotoDataLastRow, "C")).SpecialCells(xlCellTypeVisible).Copy ThisWorkbook.Worksheets(1).Cells(CopySakiLastRow + 1, "A")           .Range("G2", Cells(MotoDataLastRow, "I")).SpecialCells(xlCellTypeVisible).Copy ThisWorkbook.Worksheets(1).Cells(CopySakiLastRow + 1, "D")         End If       End With       Workbooks(XlFile).Close False     End If     XlFile = Dir()   Loop   Application.ScreenUpdating = True End Sub

その他の回答 (3)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

ANo2 merlionXXです。 違っているということは 、 > その列のA,B,C,G,H,I列をコピーして ではなく、その行のA,B,C,G,H,I列をコピーするんですね? ならば、これでいかがでしょう? Sub 今日のわたし03()   Dim XlFile As String   Dim MotoDataLastRow As Long   Dim CopySakiLastRow As Long   Dim myC As Range   ThisWorkbook.Activate   Worksheets(1).Select   Cells.Clear   Application.ScreenUpdating = False   XlFile = Dir(ThisWorkbook.Path & "\*.xls?")   Do While XlFile <> ""     If XlFile <> ThisWorkbook.Name Then       Workbooks.Open ThisWorkbook.Path & "\" & XlFile, ReadOnly:=True       With Worksheets(1)         Set myC = .Columns("I:I").Find(What:="元気", LookAt:=xlPart)         If Not myC Is Nothing Then           .AutoFilterMode = False           .Range("I:I").AutoFilter field:=1, Criteria1:="=*元気*"           MotoDataLastRow = Workbooks(XlFile).Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row '元データファイルのA列最終行を取得           CopySakiLastRow = ThisWorkbook.Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row 'インポート先のA列最終行を取得           If MotoDataLastRow > 1 Then             .Range("A2", Cells(MotoDataLastRow, "C")).Copy ThisWorkbook.Worksheets(1).Cells(CopySakiLastRow + 1, "A")             .Range("G2", Cells(MotoDataLastRow, "I")).Copy ThisWorkbook.Worksheets(1).Cells(CopySakiLastRow + 1, "D")           End If         End If       End With       Workbooks(XlFile).Close False     End If     XlFile = Dir()   Loop   Application.ScreenUpdating = True End Sub

MEGUMI19800214
質問者

補足

申し訳ありません、私の説明不足でした。 ”元気”という文字のある列のA,B,C,G,H,IをコピーしてA,B,C,D,E,F列にコピーで問題ないです。 現在の問題は ”元気”という文字がI列に入っていなくて別の文字が入っていてもコピーしてきてしまいます。 ちなみにI列に何も記載されていないとコピーはしてきません。 したいことは、 ”元気”という文字がI列にあった場合にだけ、その列(”元気”がある列)のA,B,C,G,H,IをコピーしてA,B,C,D,E,F列にコピーしてきて欲しいのです。 取り急ぎではありますが以上何卒宜しくお願いいたします。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

>.[A65536:H65536].End(xlUp).Row このような書き方をはじめて見ましたが、どの列の最終行をもとめたいのでしょうか? とりあえずA列で見ることにしました。 > ○I列に”元気”という文字が存在していた場合に限って、その列のA,B,C,G,H,I列をコピーしてマクロを動作させるエクセルファイルのSheet1に順次(A,B,C,D,E,F列)ペースト 元気という文字が存在しなければ何もしなくていいんですね? では、一例です。 Sub 今日のわたし02()   Dim XlFile As String   Dim MotoDataLastRow As Long   Dim CopySakiLastRow As Long   Dim myC As Range   ThisWorkbook.Activate   Worksheets(1).Select   Cells.Clear   Application.ScreenUpdating = False   XlFile = Dir(ThisWorkbook.Path & "\*.xls?")   Do While XlFile <> ""     If XlFile <> ThisWorkbook.Name Then       Workbooks.Open ThisWorkbook.Path & "\" & XlFile, ReadOnly:=True       With Worksheets(1)         Set myC = .Columns("I:I").Find(What:="元気", LookAt:=xlPart)         If Not myC Is Nothing Then           MotoDataLastRow = Workbooks(XlFile).Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row '元データファイルのA列最終行を取得           CopySakiLastRow = ThisWorkbook.Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row 'インポート先のA列最終行を取得           If MotoDataLastRow > 1 Then             .Range("A2", Cells(MotoDataLastRow, "C")).Copy ThisWorkbook.Worksheets(1).Cells(CopySakiLastRow + 1, "A")             .Range("G2", Cells(MotoDataLastRow, "I")).Copy ThisWorkbook.Worksheets(1).Cells(CopySakiLastRow + 1, "D")           End If         End If       End With       Workbooks(XlFile).Close False     End If     XlFile = Dir()   Loop   Application.ScreenUpdating = True End Sub

MEGUMI19800214
質問者

補足

早速の返信ありがとうございました。 なぜか”元気”以外の文字が有るところも拾ってきてペーストされてしまうようです。 私の質問にもっとも近い出来なので何とか”元気”以外の文字を拾ってペーストしないようにしたいのですが・・・

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

例えば。 変更前: Worksheets(1).Select MotoDataLastRow = Workbooks(XlFile).Worksheets(1).[A65536:H65536].End(xlUp).Row '元データファイルの最終行を取得 CopySakiLastRow = ThisWorkbook.Worksheets(1).[A65536:E65536].End(xlUp).Row 'インポート先の最終行を取得 変更後: Worksheets(1).Select activesheet.autofiltermode = false range("I:I").autofilter field:=1, criteria1:="=*元気*" MotoDataLastRow = Workbooks(XlFile).Worksheets(1).range("A65536").End(xlUp).Row '元データファイルの最終行を取得 CopySakiLastRow = ThisWorkbook.Worksheets(1).range("A65536").End(xlUp).Row 'インポート先の最終行を取得 のように。 #参考 今回ご質問内容には直接関係無い部分ですが,range("A65536:H65536").end(xlup)では「左端A列の」最下端しか調べることが出来ません。結果して上述「変更後」と同じ動作しかしていないという事です。 もしも最下端が「A列とは限らない」場合は,別の調べ方をする必要があります。 たとえばシート.cells.specialcells(xlcelltypelastcell)を調査するとか,BCDEFGH列を1列ずつ最下端を調べて一番大きい数字を採用するとか。

関連するQ&A

  • EXCEL マクロ につきまして

    お世話になっております。 以前、同様の質問をさせていただきまして、 その拡張バージョンをつくりたいと考えております。 Sub macro1() Dim myPath As String Dim myFile As String Dim c As Long Dim LastRowr As Long Application.ScreenUpdating = False myPath = ThisWorkbook.Path & "\" myFile = Dir(myPath & "*.xls") c = 6 Do Until myFile = "" If myFile <> ThisWorkbook.Name Then Workbooks.Open Filename:=myPath & myFile lastrow = Worksheets("特定のシート").Range("A65536").Row ThisWorkbook.Worksheets(2).Cells(1, c).Resize(lastrow, 1).Value = Worksheets("特定のシート").Range("H1").Resize(lastrow, 1).Value Workbooks(myFile).Close False c = c + 1 End If myFile = Dir() Loop Application.ScreenUpdating = True On Error Resume Next ActiveSheet.Name = Format(Date, "mmdd") On Error GoTo 0 End Sub こちらは"特定のシート"の特定の列(H)のみをひたすらフォーマットに 貼り付けていくものですが、コピペしたい列が増えた場合(数は一定ではない) のバージョンができればと思っております。 正直まったくわかりません。 1)データが何列あるかは不定 2)行1~3には自動的に何らかのデータが振られてしまっており(連番等)  データの終わりとして使えそうなのは、行4に「0」が入っていること  (但し0は非表示にしております) "特定のシート"名・データがH列から始まる等は変わりません。 現状の記述を改修、もしくは全とっかえでも構いません。 なにとぞよろしくお願い致します。

  • エクセルの簡単なマクロ機能を追加したいのです

    既存のエクセルマクロ(Sub チェック()以下です)に下記の内容のマクロを付け足したいです。 教えていただけないでしょうか。 付け足したい条件です:  Sheet2のC列に 0  があれば  Sheet1のB列に 愛 と([太字]でセルの背景色を[灰色25%]にして)入れたいです 恐れ入りますがご存じの方がいらっしゃりましたら教えていただきたく何卒よろしくお願いいたします。 ----------------------------------------------- Sub チェック() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim myRange1 As Range Dim myRange2 As Range Dim c1 As Range Dim c2 As Range Dim myCt As Long Set Ws1 = Worksheets("Sheet1") Set Ws2 = Worksheets("Sheet2") Set myRange1 = Ws1.Range("A1", Ws1.Cells(Rows.Count, "A").End(xlUp)) Set myRange2 = Ws2.Range("A1", Ws2.Cells(Rows.Count, "A").End(xlUp)) For Each c1 In myRange1 myCt = 0 For Each c2 In myRange2 If c2.Value = c1.Value Then If c2.Offset(, 1).Value = "" Then c1.Offset(, 1).Interior.ColorIndex = 3 Else c1.Offset(, 1).Value = c2.Offset(, 1).Value End If myCt = myCt + 1 End If Next c2 If myCt > 1 Then c1.Offset(, 1).Interior.ColorIndex = 10 Next c1 Set Ws1 = Nothing Set Ws2 = Nothing Set myRange1 = Nothing Set myRange2 = Nothing End Sub

  • Excel マクロ 重複チェックについて

    Excel マクロ 重複チェックについて Sheet3のA列とB列に製品番号が入っています。 A列とB列を比較して、A列と同じ番号がB列に2個以上ある場合のみ C列にフラグ「1]を入れたいです。 Sub RetsuCheck() Dim i As Long Dim ws1 As Worksheet Set ws1 = Worksheets("Sheet3") '「Sheet3」シートでA列とB列の重複をチェック。 For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row If ws1.Cells(i, "A") = ws1.Cells(i, "B") Then ws1.Cells(i, "C") = 1 End If Next i End Sub 1個の場合には上記マクロで解決するのですが、 2個以上の場合にどうようなマクロを記載すればよいのか アドバイスを頂けませんでしょうか。 よろしくお願いいたします。

  • 複数のエクセルシートをまとめるマクロ

    下は複数のエクセルファイルを一つにするマクロですが、100万件を超えるためcsvで保存するようにするにはどこを変更したらよいでしょうか。 よろしくお願いします。 Sub Sample() Dim t As Single Dim strPath As String Dim strFileName As String Dim WB1 As Workbook Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRowCount As Long 'A列に値が入っているデータ数 t = Timer 'まとめたいシート Set WS2 = ThisWorkbook.Worksheets(1) strPath = ThisWorkbook.Path strFileName = Dir(strPath & "\*.xls*") Do While strFileName <> "" If strFileName <> ThisWorkbook.Name Then Set WB1 = Workbooks.Open(strPath & "\" & strFileName) Set WS1 = WB1.Worksheets(1) With WS1.Range("A1") lngRowCount = .Worksheet.Cells(.Worksheet.Rows.Count, .Column).End(xlUp).Row - .Row If lngRowCount >= 1 Then With .Resize(lngRowCount, 14).Offset(1) .Copy WS2.Range("A" & WS2.Rows.Count).End(xlUp).Offset(1) End With End If End With WB1.Close False End If strFileName = Dir Loop MsgBox "まとめ処理をしました。処理時間 " & Format((Timer - t) / 60 / 60 / 24, "h:mm:ss") End Sub

  • エクセルのマクロについて

    お手数ですが誰か教えてください! BのデーターをAに集計するマクロを作ったのですが 処理速度とっても遅いのです。 高速で処理する方法はありませんでしょうか? 私が作ったマクロ Sub 集計() Dim Z As Integer Dim i As Integer Dim X As Integer For Z = 2 To 2000 For i = 2 To 2000 For X = 3 To 20 If Worksheets("A").cells(Z, 1) = Worksheets("B").cells(i, 1) And       Worksheets("A").cells(1, X) = Worksheets("B").cells(i, 14) Then Worksheets("A").cells(Z, X) = Worksheets("B").cells(i, 16) End If Next X Next i Next Z End Sub       どこかが間違っている気がしますがマクロ初心者のため       先に進めません。       どうかご教授よろしくお願い致します。

  • excelのファイルとセル値を書き出したい

    excel2003を利用しています。 とあるフォルダにある excelファイル名(自分自身のファイルを除く) を全て書き出して、 且つ A1セルの値をB列に書き出すことを、やろうとvbaを作ってみましたが。 最後のファイルのA1セルを書きだすところで、エラーになっていまい そこだけ空白になってしまいます。※写真参照 記述は以下の通りです。どのように修正すればよいか 教えていただけないでしょうか? また他にもっと優れた記述があれば、そちらも教えて欲しいです。 よろしくお願いします。 Sub test() Dim buf As String, cnt As Long Dim Path As String Path = ThisWorkbook.Path & "\" buf = Dir(Path & "*.xls") cnt = 2 Do While buf <> "" If buf <> ThisWorkbook.Name Then cnt = cnt + 1 Cells(cnt, 1) = buf buf = Dir() Workbooks.Open Filename:=Path & "\" & buf MsgBox Workbooks(buf).Worksheets(1).Range("A1").Value Cells(cnt, 2) = Workbooks(buf).Worksheets(1).Range("A1").Value Workbooks(buf).Close End If Loop End Sub

  • マクロでCOUNTIFを使いたい(続)

    マクロでCOUNTIFを使いたい(続) Excel2003を使用しています。 【転記元】B列の値が【転記先】A列には何回出てくるのか?を転記先C列に書き出す作業を しております。 【転記元】H列は空白・数値が入力されています。 【転記先】C列には【転記元】のH列が「0以上で"計"を含まない」件数をカウントさせたい のですが、現状のコードだと正確な数値が入りません。(2のところが5だったりとか) お解りの方がいらっしゃればどうぞご指摘ください。 宜しくお願いします。 ------------------------------------------------------------ 【転記元】  B列 … H列  あ    50  あ    20  計    70 ------------------------  い    ※空白  い    0  計    0 ------------------------  う    0  計    0 ------------------------  え    20  え    ※空白  計    20 ------------------------  お    10  お    20  計    30 ------------------------ 【転記先】  A列  B列  C列 ←★このC列に結果を表示させたい  あ      2  え      1  お      2 ------------------------------------------------------------ Sub テスト() Dim ent As Worksheet, mst As Worksheet Dim i As Integer, j As Integer, mstsh As Integer Dim lstcel As String Dim mstRge As Range Dim sach As Variant Set ent = Workbooks("転記先").ActiveSheet Set mst = Workbooks("転記元").ActiveSheet Set mstRge = mst.Range("B5:H2000") ent.Activate ent.Range("C2:C1000").ClearContents lstcel = mst.Cells(Rows.Count, "B").End(xlUp).Row For i = 1 To lstcel sach = ent.Cells(i + 1, "A") If mst.Cells(i + 5, "H") > 0 And mst.Cells(i + 5, "H") <> "計" Then ent.Cells(i + 1, "C").Value = Application.WorksheetFunction.CountIf(mstRge, sach) End If Next i End Sub

  • マクロ:データの抽出(複数条件)

    エクセルで以下のようなマクロを作成しました。 シート1のG列がシート2のF4と合致する時、シート2のC列にシート1のB列を貼り付けるのですが、条件を増やし 「シート1G列がシート2のF4と一致」かつ「シート1H列がシート2のG5と一致」かつ「シート1I列がシート2のH5と一致」かつ・・・としたいのですが、If Thenをどのように記述したらよろしいでしょうか。(AND関数の機能です) 宜しくお願いいたします。 Sub data01() With Sheets("Sheet1") x = .UsedRange.Cells(.UsedRange.Count).Row For i = 5 To x If .Cells(i, "G").Value = Worksheets("Sheet2").Range("F4").Value Then n = n + 1 Sheets("Sheet2").Cells(n + 5, "C").Value = .Cells(i, "B").Value End If Next End With End Sub

  • マクロでのワイルドカードの使い方について

    マクロ初心者です! 下記の動きを実現したいです。 (1)ファイル「*あいう*」(※)の「シート#1」のF5→AE24までの値をコピー →上記の値をすべて加算し、「貼り付け先ファイル」のF5→AE24に貼り付け ※「某フォルダ」に存在する、ファイル名に「あいう」を含むすべてのファイル(ファイル数は可変)が対象 (2)上記を同様の動きを、範囲のすべてのセルでなく、 (F25:F42)、(H25:H42)、、~(AD25:AD42)と1列ごとに対して行う 方々で知識のある方からご助力いただき、 下記の「それっぽい」記述までは辿り着いたのですが、上手く動かず。。 また、(1)と(2)は1つにできるのでは?とも推測してますが、どのように書けば間違いないのかわからない状況です…! 知識のある方から、間違いや改善点などご教示いただけたらとてもうれしいです。 Sub (1)() Dim folder As String Dim dws As Worksheet Dim sfile1 As String Dim swb1 As Workbook Dim adr As String folder = "C:\Users\某フォルダ\" Set dws = ThisWorkbook.Worksheets("貼り付け先シート") sfile1 = Dir(folder & "*あいう*.xlsm") If sfile1 = "" Then Exit Sub Set swb1 = Workbooks.Open(folder & sfile1) adr = Range(Cells(5, 6), Cells(24, 31)).Address(0, 0, 1) swb1.Sheets("シート#1").Range(adr).Copy dws.Range(adr).PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd swb1.Close False End Sub Sub (2)() ((1)と同じ宣言) Dim c As Integer folder = "C:\Users\某フォルダ\" Set dws = ThisWorkbook.Worksheets("貼り付け先シート") sfile1 = Dir(folder & "*あいう*.xlsm") If sfile1 = "" Then Exit Sub Set swb1 = Workbooks.Open(folder & sfile1) For c = 6 To 30 Step 2 adr = Range(Cells(25, c), Cells(42, c)).Address(0, 0, 1) swb1.Sheets("シート#1").Range(adr).Copy dws.Range(adr).PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd Next swb1.Close False End Sub

  • 下記エクセル列の並び替えマクロで、Callの際に変数が引き継がれません

    下記エクセル列の並び替えマクロで、Callの際に変数が引き継がれません。 何か方法はありませんでしょうか。 Sub 各学校() Dim i As Integer Worksheets("Sheet1").Activate For 元列 = 1 To 16 If Cells(1, i) = "学校" Then 新1列 = 元列 ElseIf Cells(1, i) = "住所" Then 新2列 = 元列 ElseIf Cells(1, i) = "電話" Then 新3列 = 元列 (略) End If Next Call 列の並び替え End Sub Sub 列の並び替え() Worksheets("Sheet2").Activate Cells.Clear Worksheets("Sheet1").Columns(新1列).Cut Worksheets("Sheet2").Columns("A").Insert Worksheets("Sheet1").Columns(新2列).Cut Worksheets("Sheet2").Columns("B").Insert Worksheets("Sheet1").Columns(新3列).Cut Worksheets("Sheet2").Columns("C").Insert (略) End Sub

専門家に質問してみよう