マクロに不備があるかどうか判断できません。質問。

このQ&Aのポイント
  • 作ったマクロに不備があるかどうか分かりません。
  • 指定したフォルダ内のフォルダ名を、一行ずつ間を空けて書き出す。
  • 6~7つのディレクトリを書き出し、共有フォルダの負荷も教えていただきたい。
回答を見る
  • ベストアンサー

作ったマクロに不備があるかどうか分かりません

様々なサイトを参考にして、自分でマクロを作り、うまく動作したまではいいのですが、不勉強で不備があるかどうか自分では判断できません…。 どなたか不備を指摘してはいただけないでしょうか。 内容:指定したフォルダ内のフォルダ名を、一行ずつ間を空けて書き出す。 Public Sub make_FolderList_02() ' FileSystemObjectを作成する。 Dim Obj As Object Set Obj = CreateObject("Scripting.FileSystemObject") ' フォルダ名をシート上に出力する為のカウンタ Dim cnt As Long cnt = 0 ' 「C:\Sample」フォルダ配下に存在するフォルダを一つずつ参照する。 Dim f As Object For Each f In Obj.GetFolder("C:\Users\test\Desktop\test").SubFolders ' フォルダ名をシート上に出力する。 Range("A1").Offset(cnt, 0).Value = Obj.GetFolder(f).Name cnt = cnt + 1 ' 空白セルを出力する。 Range("A1").Offset(cnt, 0).Value = Null cnt = cnt + 1 Next f Set f = Nothing ' 別のフォルダを書き出す Dim a As Object For Each a In Obj.GetFolder("C:\Users\test\Desktop\nyannko").SubFolders ' フォルダ名をシート上に出力する。 Range("A1").Offset(cnt, 0).Value = Obj.GetFolder(a).Name cnt = cnt + 1 Range("A1").Offset(cnt, 0).Value = Null cnt = cnt + 1 Next a Set a = Nothing ' オブジェクトを破棄する。 Set Obj = Nothing End Sub ここでは、2つのディレクトリを書き出していますが、実際には、6~7つ書き出す予定です。 また、参照先を共有フォルダにした場合、過剰な負荷が掛からないかどうかも、教えていただけると嬉しいです。 大変無駄の多い内容だとは思いますが、ご指導のほどよろしくお願いいたします。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.6

No2です。 書き忘れてましたが以下の部分 Range("A1").Offset(cnt, 0).Value = Obj.GetFolder(f).Name Offsetを利用してますが、何か特別に理由がなければ(以下ご存知かもしれませんが) 処理速度の速い順(といっても、操作を100万回実施して秒単位での差だったりするようですが) A列指定の場合 Cells(cnt, 1).Value←右側の引数は、1はA列、2はB列というように列を数値で表します。変数でもOKです。 Cells(cnt, "A").Value Range("A" & cnt).Value←この書き方は悪評を買ったりしてます。 といった感じでOffsetを利用しなくてもセル指定に変数が使えます。 ただし、最初のcnt = 0はcnt = 1にしておかないとエラーになります。

kirinpopo
質問者

お礼

業務に使うために独学で覚えた知識なので、処理速度の良し悪しなどは知りませんでした。色々なアプローチの仕方があるんですね。 kkkkkmさんの一連の投稿、大変勉強になりました。ありがとうございました。

その他の回答 (5)

noname#223464
noname#223464
回答No.5

要件は満たしているかと思われるので、コード自体には特に不備はないかと思います。 そもそもロジックに正解は無いので、やりたいことが満たされていれば問題ないかと思います。 (重箱の隅を突くような言い方をすれば、エラー処理が無いとか色々あるかもしれませんが。本筋とは関係ないので、これはおいといて。(笑)) ということで、仕様の面から2つほど気になった点を。 (1) 本マクロをどのように実行するのか不明ですが、 仮に、書き出し先シートが確定しているのであれば、Rangeの親オブジェクトのシート名を指定した方が意図しない動作をする可能性は低くなります。 ボタンやメニュー等から実行し、アクティブシートに書き出すのであれば、特に気にする必要は無いかと思います。 (2) 書き出し先シートが常にクリアされているか不明ですが、 仮に、既に値の入ったシートに書き出すのであれば、書き出し先シートのA列を最初にクリアする処理を入れといた方が意図しない出力をする可能性は低くなります。 書き出し先シートのA列が常にクリアされている状態であれば、特に気にする必要は無いかと思います。 以上です。

kirinpopo
質問者

お礼

明らかな不備はないということで、安心しました。 ご指摘いただいた中で、(2)については思い至っていなかったので、追加いたしました。回答ありがとうございます。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.4

No2,No3です UBound(RootFolder) にした場合(探すディレクトリに増減があった場合の事を考えると) Dim RootFolder(1) As String ↓ Dim RootFolder() As String RootFolder(0) = "C:\Users\Test" RootFolder(1) = "C:\Users\Test2" ↓ ReDim RootFolder(0) RootFolder(0) = "C:\Users\Test" ReDim Preserve RootFolder(1) RootFolder(1) = "C:\Users\Test2" にそれぞれ変更しておいた方が安全です。

kirinpopo
質問者

お礼

ご丁寧に、回答していただきありがとうございます。 教えていただいたやり方だと、コードが短くてすみそうです。特に、 空白セルについてはすぐに修正したいと思いました。参考にして、色々やってみます。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.3

No2です FolderCount = 1 'RootFolderの数値に合わせます。 ↓ FolderCount = UBound(RootFolder) もしくはFolderCountをなくしてしまって Call kakidasi(MyObj, RootFolder, cnt, FolderCount) ↓ Call kakidasi(MyObj, RootFolder, cnt, UBound(RootFolder)) に訂正です。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.2

おなじコードを何回も書くのは面倒なので、同一部分を別のプロシージャにしてメインから呼び出すようにしておくと楽です。あまり美しくないけど以下のような感じでいかがですか。 Call kakidasiで下のPrivate Sub kakidasiを呼び出しています。 探すディレクトリが増えたらRootFolder(x)を必要分確保すればそれだけで修正が済みます。 Public Sub make_FolderList_02() Dim MyObj As Object Dim cnt As Long, FolderCount As Integer Dim RootFolder(1) As String Set MyObj = CreateObject("Scripting.FileSystemObject") RootFolder(0) = "C:\Users\Test" RootFolder(1) = "C:\Users\Test2" cnt = 0 FolderCount = 1 'RootFolderの数値に合わせます。 Call kakidasi(MyObj, RootFolder, cnt, FolderCount) Set MyObj = Nothing End Sub Private Sub kakidasi(MyObj As Object, FoldersName() As String, ByRef cnt As Long, ByVal FolderCount As Integer) Dim f As Object Dim i As Integer For i = 0 To FolderCount For Each f In MyObj.GetFolder(FoldersName(i)).SubFolders Range("A1").Offset(cnt, 0).Value = MyObj.GetFolder(f).Name cnt = cnt + 1 ' 空白セルを出力する。もともと空白なら上の行でcnt = cnt + 2としておけば下の2行はいりません Range("A1").Offset(cnt, 0).ClearComments cnt = cnt + 1 Next f Set f = Nothing Next i End Sub

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

不備とまでは言えないが、2点気になりました コメント行、残すならきちんとした内容に。 前半と後半の差は、FSOに渡す対象フォルダでしょ? だったらくくり出して、引数で対象フォルダと行カウンタ(cmt)を 渡せば、6~7回の繰り返しを作るのは楽になると思いますよ

kirinpopo
質問者

お礼

コメント行、人に見せることを考慮して書き直します。 カウンタについては、すぐにはできそうにありませんが、他の方の回答も参考にして修正してみます。早速の回答ありがとうございました。

関連するQ&A

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

    既存のエクセルマクロ(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

  • ファイル名をエクセルにリスト化するマクロの応用

    ファイル名をエクセルにリスト化するマクロの応用 こんにちは。 以下に示しますマクロは フォルダ内の名前や作成日等(サブディレクトリを含む)を エクセルにリスト化するもので 以前同サイト内で教えて頂きました。 現在このマクロでは シート1のAセルにフォルダのパスを入力して実行すると、 シート2にフォルダ内の情報がリスト化されます。 このマクロでは1つのフォルダ内の情報をリスト化することが可能ですが、 今回は更に、 エクセルのA列にフォルダのパスを複数個入力し、 それらのフォルダ内の情報を、それぞれ別シートに 一気にリスト化したいと考えています。 ご存じの方がいらっしゃいましたら よろしくお願いいたします。 プログラミングに関する知識はほとんどありません… 具体的に、どこに何を入力するのかを教えていただけると嬉しいです。 お手数をおかけし、すいません。 ※以下は以前nicotinismさんに回答いただいたマクロを 参考にさせていただいております。 Sub makeFileList()   Call fileList   MsgBox "終了しました" Columns.AutoFit 'すべての列幅を自動調整する End Sub    Function fileList(Optional trgDir As String = "", Optional fCnt As Long = 0)   On Error GoTo err   Dim objFs As Object   Dim objDir As Object   Dim objFile As Object   Dim i As Long      Set objFs = CreateObject("Scripting.FileSystemObject")      If trgDir = "" Then     Set objDir = objFs.Getfolder(Sheets("sheet1").Range("a1"))   Else     Set objDir = objFs.Getfolder(trgDir)   End If      Set objFile = objDir.Files        With Sheets("sheet2")     For Each objFile In objDir.Files         fCnt = fCnt + 1 .Cells(fCnt, 1).Offset(1, 0) = fCnt .Cells(fCnt, 2).Offset(1, 0) = objFile.DateCreated .Cells(fCnt, 3).Offset(1, 0) = objFile.DateLastModified .Cells(fCnt, 4).Offset(1, 0) = objFile.Path .Range("A1").Value = "No" .Range("B1").Value = "作成日" .Range("C1").Value = "更新日" .Range("D1").Value = "ファイル名"     Next objFile          For Each objDir In objDir.SubFolders       If objDir.Attributes <> 22 Then   'システムフォルダ除外                      '--------------サブフォルダの再帰検索             Call fileList(objDir.Path, fCnt)           '--------------サブフォルダの再帰検索                End If     Next objDir   End With      Set objFile = Nothing   Set objDir = Nothing   Set objFs = Nothing Exit Function err:   Select Case err.Number     Case 76 ' path がない       MsgBox "path 指定が間違っています"     Case Else       MsgBox err.Number & vbCrLf & err.Description   End Select      Set objFile = Nothing   Set objDir = Nothing   Set objFs = Nothing End Function

  • Excelのマクロで条件を指定して、自動処理する方法。

    Excelのマクロで条件を指定して、自動処理する方法。 こんにちは。 条件を指定して自動処理したいのですが、 どのようにしたらよいかわからず困っています。 よろしくお願いします。     A    B 1   α   ○                           2   β 3 エクセルの表で、A1セルが空白か否か A1セルが 空白の場合→終了 記入してある場合→B1セルが空白か否か B1セルに○が 記入してある場合→A2セルへ 空白の場合→「ファイル情報リスト作成マクロ(既に作成済み)」を使ってリストを自動作成          →リスト作成が終わったらB1セルに○印を付ける          →A2セルへ A2セルが空白か否か…(繰り返し) 「ファイル情報リスト作成マクロ」は、文字数の許す限りで以下に示します。 こちらも相談箱を参考にさせて頂いたものです。 「ファイル情報リスト作成マクロ」 Sheet1 の A1 セルに調べたいフォルダ名を入力して 標準モジュールに貼り付けて、マクロ makeFileList を実行 Sheet2にリスト出力 Sub makeFileList()   Call fileList   MsgBox "終了しました" Columns.AutoFit 'すべての列幅を自動調整する End Sub    Function fileList(Optional trgDir As String = "", Optional fCnt As Long = 0)   On Error GoTo err   Dim objFs As Object   Dim objDir As Object   Dim objFile As Object   Dim i As Long      Set objFs = CreateObject("Scripting.FileSystemObject")      If trgDir = "" Then     Set objDir = objFs.Getfolder(Sheets("sheet1").Range("a1"))   Else     Set objDir = objFs.Getfolder(trgDir)   End If      Set objFile = objDir.Files        With Sheets("sheet2")     For Each objFile In objDir.Files         fCnt = fCnt + 1 .Cells(fCnt, 1).Offset(1, 0) = fCnt .Cells(fCnt, 2).Offset(1, 0) = objFile.DateCreated .Cells(fCnt, 3).Offset(1, 0) = objFile.DateLastModified .Cells(fCnt, 4).Offset(1, 0) = objFile.Path .Range("A1").Value = "No" .Range("B1").Value = "作成日" .Range("C1").Value = "更新日" .Range("D1").Value = "ファイル名"     Next objFile          For Each objDir In objDir.SubFolders       If objDir.Attributes <> 22 Then   'システムフォルダ除外                      '--------------サブフォルダの再帰検索             Call fileList(objDir.Path, fCnt)           '--------------サブフォルダの再帰検索                End If     Next objDir   End With      Set objFile = Nothing   Set objDir = Nothing   Set objFs = Nothing Exit Function err:   Select Case err.Number     Case 76 ' path がない       MsgBox "path 指定が間違っています"

  • エクセル マクロ 

    以下のマクロを作成し Fnameを開き、そのファイルで特定の文字列を探し、Offsetしたセルの値のコピー&ペーストをしようとしています。 しかし、ファイルは開くのですが、コピー&ペーストをいません。 どのようにすれば、実行できるのでしょうか? 変数やOffsetの使い方が違うと思うのですが、教えてください。  Dim Wbk As Workbook Dim Fname As String Dim f As Integer For f = 1 To 100 ChDrive ThisWorkbook.Path ChDir ThisWorkbook.Path Fname = Cells(f, 1).Value & ".xls" Application.ScreenUpdating = False Workbooks.Open (Fname), UpdateLinks:=0 Set Obj = Worksheets(Cells(f, 2).Value).Cells.Find(Cells(f, 3).Value) Obj.Offset(24, 0).Copy Obj.Offset(36, 0).PasteSpecial (xlPasteValues) Application.CutCopyMode = False Application.DisplayAlerts = False Workbooks(Fname).Close SaveChanges:=True Application.DisplayAlerts = True Application.ScreenUpdating = True Next f

  • 変数で指定したセルの値を取得して計算させるには?

    sub 単月発生残高の取得() Windows("総勘定元帳データ").Activate Worksheets(1).Activate Range("a2").Activate Dim sRange As Range, eRange As Range, tRange As Range, uRange As Range Dim j As Long, k As Long Dim i As Integer For i = 3 To Range("a2").End(xlDown).Row Set sRange = Cells(i, 1) Set eRange = sRange.End(xlToRight) Set tRange = eRange.Offset(2, 0) Set uRange = tRange.Offset(0, -1) j= tRange.value k= uRange.value Range("B1").formula="=k-j" Range("A1").value="単月発生残高" Next Set sRange = Nothing Set eRange = Nothing Set tRange = Nothing Set uRange = Nothing End Sub 上記のマクロを組んでみましたが、j= tRange.value のところでエラーになります。 uRangeの値からtRangeの値を引いた値を"B1"に表示させたいのですが、うまくいきません。 どうすればいいでしょうか。

  • 複数のフォルダ内の名前や作成日等をリスト化する方法

    複数のフォルダ内の名前や作成日等をリスト化する方法 こんにちは。 以下に示しますマクロは フォルダ内の名前や作成日等(サブディレクトリを含む)をリスト化するもので 以前同サイト内で教えて頂きました。 現在このマクロでは シート1のAセルにフォルダのパスを入力して実行すると、 シート2にフォルダ内の情報がリスト化されます。 このマクロでは1つのフォルダ内の情報をリスト化することが可能ですが、 今回は更に、 エクセルのA列にフォルダのパスを複数個入力し、 それらのフォルダ内の情報を、それぞれ別シートに 一気にリスト化したいと考えています。 ご存じの方がいらっしゃいましたら よろしくお願いいたします。 Sub makeFileList()   Call fileList   MsgBox "終了しました" Columns.AutoFit 'すべての列幅を自動調整する End Sub    Function fileList(Optional trgDir As String = "", Optional fCnt As Long = 0)   On Error GoTo err   Dim objFs As Object   Dim objDir As Object   Dim objFile As Object   Dim i As Long      Set objFs = CreateObject("Scripting.FileSystemObject")      If trgDir = "" Then     Set objDir = objFs.Getfolder(Sheets("sheet1").Range("a1"))   Else     Set objDir = objFs.Getfolder(trgDir)   End If      Set objFile = objDir.Files        With Sheets("sheet2")     For Each objFile In objDir.Files         fCnt = fCnt + 1 .Cells(fCnt, 1).Offset(1, 0) = fCnt .Cells(fCnt, 2).Offset(1, 0) = objFile.DateCreated .Cells(fCnt, 3).Offset(1, 0) = objFile.DateLastModified .Cells(fCnt, 4).Offset(1, 0) = objFile.Path .Range("A1").Value = "No" .Range("B1").Value = "作成日" .Range("C1").Value = "更新日" .Range("D1").Value = "ファイル名"     Next objFile          For Each objDir In objDir.SubFolders       If objDir.Attributes <> 22 Then   'システムフォルダ除外                      '--------------サブフォルダの再帰検索             Call fileList(objDir.Path, fCnt)           '--------------サブフォルダの再帰検索                End If     Next objDir   End With      Set objFile = Nothing   Set objDir = Nothing   Set objFs = Nothing Exit Function err:   Select Case err.Number     Case 76 ' path がない       MsgBox "path 指定が間違っています"     Case Else       MsgBox err.Number & vbCrLf & err.Description   End Select      Set objFile = Nothing   Set objDir = Nothing   Set objFs = Nothing End Function

  • SetとNothingの存在意味?

    数値とオブジェクトの変数セットはそれぞれ、 Dim num as integer num = 5 Dim obj as Object set obj = new From set obj = Nothing ですが、 オブジェクトの場合でインスタンスを生成しない、単なる参照?別名? の場合はNothingは不要でしょうか? Dim obj as Object For x = 1 to 10 set obj = Form2 ' newとインスタンスを生成するのではなく、単なる参照  obj.Caption = str(x) & "回目" 'set obj = nothingは不要? Next x

  • マクロで困ってます!

    マクロでセル検索かけたらそのセルに設定していたハイパーリンクが外れてしまいます。 どうすればいいでしょうか・・?お力を貸してください! バージョンは2007です! コードは下記になります! 同一ブック内の「データ」というシートにあるものを「検索更新」というシートで検索をかけるというものです。 宜しくお願いします!! Sub 検索2() myLAST = Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row + 1 If myLAST < 5 Then myLAST = 5 Range("A5:F" & myLAST).ClearContents Set myC = Sheets(1).Columns(3) _ .Find(What:=Range("E2").Value, _ LookIn:=xlValues, LookAt:=xlPart) ' If myC Is Nothing Then Exit Sub myCa = myC.Address Do myLAST = Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row + 1 Range("A" & myLAST) = myC.Row Range("B" & myLAST) = myC.Offset(0, -1) Range("C" & myLAST) = myC.Offset(0, 0) Range("D" & myLAST) = myC.Offset(0, 1) Range("E" & myLAST) = myC.Offset(0, 2) Range("F" & myLAST) = myC.Offset(0, 3) Set myC = Sheets(1).Columns(3).FindNext(myC) If myC Is Nothing _ Or myCa = myC.Address Then Exit Do Loop Set myC = Nothing End Sub Sub 更新() myLAST = Range("A" & ActiveSheet.Rows.Count).End(xlUp).Row If myLAST < 5 Then myLAST = 5 For Each myC In Range("A5:A" & myLAST) If myC.Value = "" Then Exit Sub With Sheets(1) .Range("B" & myC.Value) = myC.Offset(0, 1) .Range("C" & myC.Value) = myC.Offset(0, 2) .Range("D" & myC.Value) = myC.Offset(0, 3) .Range("E" & myC.Value) = myC.Offset(0, 4) .Range("F" & myC.Value) = myC.Offset(0, 5) End With Range("A" & myC.Row & ":F" & myC.Row).ClearContents Next MsgBox "更新しました" End Sub

  • エクセルVBA

    Sub PlusA001() Dim a As Range Dim b As Integer Range("e1").Value = "氏名" Range("e2").Value = "甲" Range("e2").AutoFill Destination:=Range("e2:e10"), Type:=xlFillDefault Range("f1:j1").Value = Array("国", "数", "理", "社", "英") Set a = Range("f2") For i = 1 To 5 Do Until b = 9 a.Value = Int(100 * Rnd) + 1 b = b + 1 Set a = a.Offset(1, 0) Loop b = 0 Set a = a.Offset(-9, 1) Next i End Sub サンプルコードの例ですが、どうも実行しても納得できない部分があります。それはSet a=a.offset(-9,1)の部分です。Set a = Range("f2")においてf2を始点としているのは判りますが、f2からであればa=a.offset(-9、5) とすればいいのかと思い実行したのですが、ぐちゃぐちゃになります。なぜ(-9、5)ではなく(-9、1)何ですか?いくら読み解いても判りません。教えてください。

  • エクセル 2010 マクロ 検索

    http://okwave.jp/qa/q8562170.html 上記質問に追加です。 ※1 'D,E,F,G,H,I,K を検索してD,E,F,G,H,I に検索対象があった時 E,F,G,H,Iのいずれかだったら左横列の上に向かって (EならD 、FならE ・・・という具合に) 何か入力されているセルのM列の191000####をmsgboxで表示させたいです。 (画 F11セル(A-1)が検索ヒットした場合E9セル(R-01)を辿り、 その行のM列のセル(191000####)をmsgboxで表示 ※2 但し、検索結果がD列のデータだった時、その行のM列が191000####だった場合 M列の191000####をmsgboxで表示させたいです。 (画 D25セル(Y-1)対象の時) ※3 また、検索結果がD列のデータだった時、その行のM列が191000####以外だった場合 (空白だったり191000####以外の場合) M列の一番上の191000####をmsgboxで 191000####&「これは例外です」と表示させたいです。 (画 D24セル (X-1)対象の時) 現在のコードは下記のとおりです。 Sheet1に Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address <> "$A$3" Then Exit Sub Call 検索 Range("A1:A2").Clear Range("A1").Activate End Sub 標準モジュールに Sub 検索()  Dim Ws1 As Worksheet, Ws2 As Worksheet  Dim strKey As Variant  Dim s As String  Dim c As Range, bln As Boolean  Dim rng1 As Range  Dim cnt As Long    Set Ws1 = Sheet1  Set Ws2 = Sheet2    Ws1.Select    With Ws2   strKey = Application.Transpose(.Range("A1").Resize(2).Value)   strKey = Join(strKey, "")  End With    If Trim(strKey) = "" Then MsgBox "検索キーが空です", vbCritical: Exit Sub      With Ws1   Set rng1 = .Range("K2", .Cells(Rows.Count, "K").End(xlUp))   For Each c In rng1.Offset(, -10)     'D,E,F,G,H,I,Kを検索    s = c.Offset(0, 3).Value & c.Offset(0, 4).Value & c.Offset(0, 5).Value & c.Offset(0, 6).Value & c.Offset(0, 7).Value & c.Offset(0, 8).Value & c.Offset(0, 10).Value &        If StrComp(s, strKey, vbTextCompare) = 0 And c.Offset(0, 2).Value = "" Then     c.End(xlToRight).Activate c.Offset(0, 2).Value = Date          c.Resize(1, 14).Interior.ColorIndex = 6     bln = True     Exit For    End If   Next c      If Not bln Then    Ws2.Select    MsgBox "リストに存在しません", vbExclamation, "NotFound"   Else '加える    Call ReSearch(Ws1.Range("M2"), c.Row)    '再設定    Set rng1 = .Range("K6", .Cells(Rows.Count, "K").End(xlUp))    MsgBox "残り" & DoubleCountBlank(rng1.Offset(, -8), rng1) & "品目です。", vbInformation   End If  End With  Application.Goto Ws2.Range("A1"), True End Sub Sub ReSearch(Rng As Range, j As Long) '最初のセル, 終わりの行数 Dim i As Long Dim Ws As Worksheet With Rng.Parent For i = j To Rng.Row Step -1 If CStr(.Cells(i, Rng.Column).Value) Like "191000####" Then MsgBox "指図番号 " & vbCrLf & CStr(.Cells(i, Rng.Column).Value) & " の部品です" Exit For End If Next i End With End Sub Function DoubleCountBlank(rng1 As Range, rng2 As Range) '横並びのセルのブランクをカウントする (セル範囲1 , セル範囲2)  Dim i As Long  Dim cnt As Long  For i = 1 To rng1.Rows.Count   If VarType(rng2.Cells(i, 1)) = vbDouble Then    If rng1.Cells(i, 1).Value = "" And rng2.Cells(i, 1).Value <> 0 Then     cnt = cnt + 1    End If   End If  Next i  DoubleCountBlank = cnt End Function 宜しくお願い致します。

専門家に質問してみよう