[[20210405211137]] 『フィルタで絞り込んだ行に対して処理を行う。』(u) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『フィルタで絞り込んだ行に対して処理を行う。』(u)

こんばんは。
フィルタで絞り込んだ行に対して処理を行うコードについて困っています
fNmTx = ThisWorkbook.Path & "\出庫リスト\" & iDx(i)(2) & ".xlsx"

        If zWbExists(fNmTx) Then
         Application.DisplayAlerts = False
        Application.ScreenUpdating = False
            Dim dstWS1 As Worksheet
                Set dstWS1 = ThisWorkbook.Worksheets("機種間共通部品検索")
                Dim srcWS1 As Workbook
                Set srcWS1 = Workbooks.Open(fNmTx)
                With srcWS1.Worksheets(1)
                Dim c As Range
                With srcWS1.Worksheets(1)
                srcWS1.Worksheets(1).Range("B6:AJ359"). _
                AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=dstWS1.Range("D6:E7"), _
                Unique:=True
                For Each c In .AutoFilter.Range.SpecialCells(xlCellTypeVisible)
                x = Application.Match(iDx(i)(3), srcWS1.Worksheets(1).Range("B:B"), 0)
                If Not IsError(x) Then
                .Cells(x, "A") = tMp(5)
                srcWS1.Worksheets(1).Cells(x, "A").EntireColumn.AutoFit
                .Cells(x, "C") = dAtaBk
                    dAtaBk = ""
                End If
            Next c
              End With
            End With
            srcWS1.Close True
            Set srcW1 = Nothing
            Application.DisplayAlerts = True
            Application.ScreenUpdating = True
        Else
            MsgBox "行き先機種F Non" & Chr(13) & iDx(i)(2) & ".xlsx"
            Exit For
        End If
        If i Mod 30 = 0 Then DoEvents
    Next
    Set zTb = Nothing
    Erase v, iDx, tMp

End Sub
で行うと
For Each c In .AutoFilter.Range.SpecialCells(xlCellTypeVisible)
でエラー91対応方法(オブジェクト変数または With ブロック変数が設定されていません。)と出ます。
どこをどう直せばよいかわからないのでご教授いただけると幸いです。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


前にも言ったような気がしますが、インデントを付けて自己検証してみてはどうですか?
   With srcWS1.Worksheets(1)
     .AutoFilter.Range〜
    ^^^^^^^↑^^^^^^^^
        オートフィルタが設定されてないと取得できないと思いますが・・・

(もこな2) 2021/04/05(月) 21:41


AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=dstWS1.Range("D6:E7"), _
とは違うのですか?
(u) 2021/04/05(月) 21:48

こちらも、前にも言ったような気がしますが、聞く前に試してみませんか?

それでもわからなければ、【マクロの記録】をつかって、「フィルタオプション」と「オートフィルタ」をそれぞれ設定してみて、どのような命令が記録されるか確認してください。

(もこな2) 2021/04/05(月) 21:55


すみません。
コードをデバックしていくと、
AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=dstWS1.Range("D6:E7"), _
で、dstWS1.Range("D6:E7")でフィルタはかけている所までは確認しました。
その後のコードがおかしいはずなのですが、
ネットで調べて現状のコードを書いた所存です。

ちなみに、マクロの記録でやった際のコードは
Range("A6:AN154").AdvancedFilter Action:=xlFilterInPlace, Unique:=False
でした。
(u) 2021/04/05(月) 22:09


 こんばんは ^^
いや〜。。。どこかで見たことがあるコードだなぁ????
とか、おもっていました。。。ハンドル名がおなじ方だったもので
おやっ?とか思い、拝見させていただきました。^^;
無理やり、フイルター、かけなくても。。。テーブルにしておくのも
一手かも、何もせずとも、何時でもフイルター、かけれますよ。^^;
(隠居じーさん) 2021/04/05(月) 22:27

こんばんは。
先日はありがとうございました。
フィルタを掛ける理由としましては
同じファイルの中で同一セル内容「前回だと棚番」のものがあることに気づきました。
同一セル内容でも唯一違うのが生産順番でして、その内容でフィルタを掛けるところまではできました。
前機種と行き先機種のファイル名が違うのであれば問題はないのですが。
同じファイル名だとフィルタをかけて絞りこんだ行だけ書き込むことを行おうと思っています。

(u) 2021/04/05(月) 22:40


 フイルターをかけようとしているのは
マクロの有る、既に開いているブックですか
コードで開いて書き込むブックでしょうか。
変更されたコードを拝見していますと、何やら
矛盾を感じます。
(u) 2021/04/05(月) 22:40
のご説明ですと、フイルターをかけずとも、一意なキーを
作成して、条件文で、書込めば良いように思うのですが。
ファイルレイアウトが不明な為、これ以上は具体的な事は
申し上げられません。m(__)m
(隠居じーさん) 2021/04/05(月) 23:13

おはよう御座います。
フィルターをかけようとしているのは
先日教えていただいた。
行き先機種ファイル名のファイルです。
ファイルレイアウトは後ほど送らせてもらいます。
(u) 2021/04/06(火) 06:03

     |[A]        |[B] |[C]       |[D]   |[E]       |[F]   |[G]   |[H]                 |[I]   |[J]        |[K]           
 [2] |           |棚番|引当数+保|出庫数|理論戻入数|戻入数|仕損数|戻入場所            |所要量|上位品番   |投入工程      
 [3] |           |A---|       100|      |         0|     0|     0|                    |   100|ZY-33260000|マウント(裏)
 [4] |           |A151|          |   200|         0|     0|     0|                    |   200|ZY-33260000|マウント(裏)
 [5] |           |A614|          |   552|       452|   452|     0|                    |   100|ZY-33260000|マウント(裏)
 [6] |           |A615|      1659|  1459|      2918|  1259| -1659|                    |   200|ZY-33260000|マウント(裏)
 [7] |           |A633|      2822|      |      2622|  2622|     0|                    |   200|ZY-33260000|マウント(裏)
 [8] |           |A686|       379|      |       179|   179|     0|                    |   200|ZY-33260000|マウント(裏)
 [9] |           |A705|      1798|  2298|      3596|  1798|     0|HC-Y01A OMOTE(1LINE)|   500|ZY-33260000|マウント(裏)
 [10]|           |A901|          |  1686|      1586|  1586|     0|                    |   100|ZY-33260000|マウント(裏)
 [11]|HC-Y01A URA|A705|      1798|      |      1298|  1298|     0|                    |   500|ZY-33260000|マウント(表)
 [12]|           |A727|          |   117|        17|    17|     0|                    |   100|ZY-33260000|マウント(表)
 [13]|           |A894|          |   992|       892|   892|     0|                    |   100|ZY-33260000|マウント(表)
 [14]|           |A900|          |  1674|      1574|  1574|     0|                    |   100|ZY-33260000|マウント(表)
 [15]|           |AB62|          |  1900|      1800|  1800|     0|                    |   100|ZY-33260000|マウント(表)
フィルタをかけようとしているのはコードで開いたブックです。
フィルタ条件はJ列とK列です。
J列は上位品番が入りますが、生産ファイルによって毎回違います。
K列はマウント(裏)、マウント(表)、マウントのうちどれか一つ入ります。

マクロが組み込んであるブックの機種間共通部品検索シートに配置してある上位品番と投入工程
は上位品番はD6セルに見出しD7セルに実際の品番、投入工程はE6セルに見出し、E7セルに実際の内容が入ります。配置間隔は13列間隔です。
昨日掲示したコードは試作段階ですので
AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=dstWS1.Range("D6:E7"), _
dstWS1.Range("D6:E7"), _の異なります。

(u) 2021/04/06(火) 07:32


残念ながら無視されちゃったようなので、説明だけしておきます。
 Rangeオブジェクト.AdvancedFilter ・・・・・フィルタオプション
 Rangeオブジェクト.AutoFilter     ・・・・・オートフィルタ

↑のように、それぞれ【別もの】です。
なので、オートフィルタが設定されてないにも関わらず「srcWS1.Worksheets(1).AutoFilter.Range」を取得しようとしてもダメなのではというのが「2021/04/05(月) 21:41」の指摘の趣旨です。

開く前からオートフィルタが設定されているとかであれば話は変わりますので、そうであれば説明を追加されたほうが良いでしょう。

(もこな2) 2021/04/06(火) 07:34


すみません。
全く別物なんですね。
勉強にらなります。
オートフィルターは開いた後に設定してしますので開く前は何もされていない
状態です。
(u) 2021/04/06(火) 07:55

>オートフィルターは開いた後に設定してします
少なくとも提示されたコード中にその記述はないです。
いつ設定してるのですか?
 (フィルタオプションはしてますけど)

あまり書き込むと、隠居じーさんさんのじゃまをしそうなので、一度だけ再掲します。

【マクロの記録】をつかって、「フィルタオプション」と「オートフィルタ」をそれぞれ設定してみて、どのような命令が記録されるか確認してください。

(もこな2 ) 2021/04/06(火) 08:52


オートフィルターとアドバイスフィルターを勘違いしてました。
オートフィルターはしてません。
両方確認してみます。
(u) 2021/04/06(火) 09:12

 おはようございます ^^
ご提示の表からは、同じ、棚番は、発見できませんし
マクロブックのほうは
>>配置間隔は13列間隔です。
12列じゃなかったのですか。^^; 前回とレイアウトが変わっているなら
ご提示のコードは使えないかと??。。。m(_ _)m と私が思うだけで。。。 
でも、フイルターかけて、うまく行くのなら、もこな2さんのご案内の通り
お調べになって、フイルターかけてくださいね。
棚番とは本来、一意な物なのでは、
何が、どう、変更に、なって、何をどうすれば、良いのか、なかなか
ピント、来ませんので、私は、ここまでと、させて戴きます。他の回答者
様の、アドバイスをお待ちください。また、閃きましたら、現れるかもしれません。
前回のコードに関して、ご不明な点が有れば、その箇所の説明を質問してください。
それに関しましては、できうる限りご説明させて戴きます。m(__)m
(隠居じーさん) 2021/04/06(火) 10:10

掲示したレイアウト図だとA705という棚番
が9行目に11行目が同じ棚番です。
前回ご教授いただいたコードは前と行き先のファイル名は違う場合は有効で、
今悩んでいるのが開くファイルが前と行き先で同一の場合どうするかということです。
同じファイルに上位品番がJ列、投入工程がK列にあってみんな一つに入っているので
アドバンスフィルターを使って対象となる行だけ抽出してA列に前機種名ファイル名
C列に前機種ファイル名のE列の値を書き込む。
同じファイルに多数上位品番や投入工程があるのは
簡単に言うと
一つのものを作るのにいくつもの工程を得てできるからとでも言えばわかりやすいでしょうか。
(u) 2021/04/06(火) 10:49

デバッグてアドバイスフィルターにより対象の行まてば抽出まではうまくいさかました。
しかし、前機種ファイル名を書き込む際に対象となる棚番が2つある場合
同じ棚番でも抽出した行以外(非表示部分)を先に書き込んでしまう。
本来なら書き込みたい行(抽出した行)のみを対象として書き込みを行いたいのが
やりたい事です。
先程は提示したレイアウトがやりたい事のレイアウト図になります。
(u) 2021/04/06(火) 10:59

こんにちは ^^
あ!、なるほど、すみません。確かに、同じですね。
裏表が違うのですね。。。

ちょっと考えてみますね。m(__)m
(隠居じーさん) 2021/04/06(火) 12:05


ご迷惑おかけします。
参考に現在のマクロが組んであるシートのレイアウトを掲示します。行は途中までですが、前回と同様最大154行です。
     |[C]         |[D]                   |[E]                   |[F]   |[G]            |[H]        |[I]                   |[J]        |[K]|[L]|[M]   |[N]|[O]|[P]         |[Q]                   |[R]                 |[S]   |[T]                     |[U]                 |[V]                  |[W]                 |[X]|[Y]|[Z]   |[AA]
 [1] |1機種名     |                      |                      |      |               |           |                      |           |   |   |      |   |   |            |                      |2機種目             |      |                        |                    |                     |                    |   |   |      |    
 [2] |HC-Y01A URA |                      |                      |      |               |           |                      |           |   |   |      |   |   |            |                      |HC-Y01A OMOTE(1LINE)|      |                        |                    |                     |                    |   |   |      |    
 [3] |現ファイル名|HC-Y01A(151A690R)100台|                      |      |               |           |                      |           |   |   |      |   |   |現ファイル名|HC-Y01A(151A690R)100台|                    |      |                        |                    |                     |                    |   |   |      |    
 [4] |前機種      |上位品番              |投入工程              |      |               |           |                      |           |   |   |      |   |   |前機種      |上位品番              |投入工程            |      |                        |                    |                     |                    |   |   |      |    
 [5] |            |                      |マウント(裏)        |      |               |           |                      |           |   |   |      |   |   |            |                      |マウント(表)      |      |                        |                    |                     |                    |   |   |      |    
 [6] |行き先機種  |上位品番              |投入工程              |      |               |           |                      |           |   |   |      |   |   |行き先機種  |上位品番              |投入工程            |      |                        |                    |                     |                    |   |   |      |    
 [7] |            |                      |マウント(表)        |      |               |           |                      |           |   |   |      |   |   |            |                      |                    |      |                        |                    |                     |                    |   |   |      |    
 [8] |現機種名    |HC-Y01A URA           |                      |      |               |           |                      |HC-Y01A URA|   |→ |      |   |   |現機種名    |HC-Y01A OMOTE(1LINE)  |                    |      |                        |                    |                     |HC-Y01A OMOTE(1LINE)|   |→ |      |    
 [9] |            |                      |                      |現機種|               |           |                      |           |   |   |次機種|   |   |            |                      |                    |現機種|                        |                    |                     |                    |   |   |次機種|    
 [10]|前機種      |行き先機種名          |行き先機種ファイル    |棚番  |結合           |現機種名   |部品名                |M          |Z  |   |M     |Z |   |前機種      |行き先機種名          |行き先機種ファイル  |棚番  |結合                    |現機種名            |部品名               |M                   |Z  |   |M     |Z   
 [11]|            |                      |                      |A---  |A---HC-Y01A URA|HC-Y01A URA|                      |           |   |→ |      |   |   |            |                      |                    |A162  |A162HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|KPL-3015CGCK         |                   1|  2|→ |      |    
 [12]|            |                      |                      |A151  |A151HC-Y01A URA|HC-Y01A URA|FA5510N-D1-TE1        |          3| 28|→ |      |   |   |            |                      |                    |A203  |A203HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|KPL-3015SURCK        |                   2|127|→ |      |    
 [13]|            |                      |                      |A614  |A614HC-Y01A URA|HC-Y01A URA|S1WB(A)60-7062        |          2| 13|→ |      |   |   |            |                      |                    |A219  |A219HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|MP2565DN-C578-LF-Z   |                   2|132|→ |      |    
 [14]|            |                      |                      |A615  |A615HC-Y01A URA|HC-Y01A URA|TJ30S06M3L(T6L1,NQ    |          3| 18|→ |      |   |   |HC-Y01A URA |                      |                    |A705  |A705HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|ERZVF2M470           |                   3| 15|→ |      |    
 [15]|            |                      |                      |A633  |A633HC-Y01A URA|HC-Y01A URA|PS2381-1Y-F3-AX/L     |          3| 25|→ |      |   |   |            |                      |                    |A727  |A727HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|SHP1045P-F101A       |                   2|137|→ |      |    
 [16]|            |                      |                      |A686  |A686HC-Y01A URA|HC-Y01A URA|2SD1584-Z-E1-AZ L.Kランク|          3| 22|→ |      |   |   |            |                      |                    |AE62  |AE62HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|ERJ3EKF3602V         |                   2|130|→ |      |    
 [17]|            |HC-Y01A OMOTE(1LINE)  |HC-Y01A(151A690R)100台|A705  |A705HC-Y01A URA|HC-Y01A URA|ERZVF2M470            |          3| 15|→ |     3| 15|   |            |                      |                    |A900  |A900HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|LM2901DR             |                   2|134|→ |      |    
 [18]|            |                      |                      |A901  |A901HC-Y01A URA|HC-Y01A URA|MCZ5207SG-3072        |          2| 18|→ |      |   |   |            |                      |                    |AB62  |AB62HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|D1FK60-5053          |                   2|115|→ |      |    
 [19]|            |                      |                      |A909  |A909HC-Y01A URA|HC-Y01A URA|PS2801C-1-F3-A(PLP)   |          3| 20|→ |      |   |   |HC-Y01A URA |                      |                    |AB84  |AB84HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|C1206X105K101T       |                   1| 13|→ |      |    
 [20]|            |                      |                      |A994  |A994HC-Y01A URA|HC-Y01A URA|MCZ5303SH-5072        |          3| 30|→ |      |   |   |HC-Y01A URA |                      |                    |AC01  |AC01HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|CC0603KRX7R9BB102    |                   1|  9|→ |      |    
 [21]|            |                      |                      |AA14  |AA14HC-Y01A URA|HC-Y01A URA|CC0805KKX7R8BB475     |          1|123|→ |      |   |   |            |                      |                    |AZ14  |AZ14HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|GRM188R71H273KA61D   |                   2|128|→ |      |    
 [22]|            |                      |                      |AA33  |AA33HC-Y01A URA|HC-Y01A URA|DZ2W30000L            |          1|118|→ |      |   |   |HC-Y01A URA |                      |                    |AD02  |AD02HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|ERJ3GEYJ103V         |                   1| 11|→ |      |    
 [23]|            |                      |                      |AA43  |AA43HC-Y01A URA|HC-Y01A URA|RC0603JR-0727K        |          1| 37|→ |      |   |   |HC-Y01A URA |                      |                    |AT68  |AT68HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|ERJ3EKF3301V         |                   1| 28|→ |      |    
 [24]|            |                      |                      |AA70  |AA70HC-Y01A URA|HC-Y01A URA|RC0603FR-07820R       |          1|110|→ |      |   |   |HC-Y01A URA |                      |                    |AS88  |AS88HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|ERJ3EKF4702V         |                   1|114|→ |      |    
 [25]|            |                      |                      |AB32  |AB32HC-Y01A URA|HC-Y01A URA|                      |           |   |→ |      |   |   |            |                      |                    |AT14  |AT14HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|ERJ3EKF3302V         |                   2|117|→ |      |    
 [26]|            |                      |                      |AB37  |AB37HC-Y01A URA|HC-Y01A URA|ERJ3EKF2702V          |          1|  6|→ |      |   |   |            |                      |                    |AT28  |AT28HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|ERJ6GEYJ563V         |                   2|126|→ |      |    
 [27]|            |                      |                      |AB38  |AB38HC-Y01A URA|HC-Y01A URA|ERJ6GEYJ1R0V          |          1|125|→ |      |   |   |            |                      |                    |A894  |A894HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|DF13EA-30DP-1.25V(51)|                   2|122|→ |      |    
 [28]|            |                      |                      |AB52  |AB52HC-Y01A URA|HC-Y01A URA|CC1206JKNPOZBN471     |          1|128|→ |      |   |   |HC-Y01A URA |                      |                    |AC14  |AC14HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|CC0603KRX7R9BB103    |                   2| 25|→ |      |    
 [29]|            |                      |                      |AB78  |AB78HC-Y01A URA|HC-Y01A URA|ERJ6ENF6803V          |          2|  3|→ |      |   |   |HC-Y01A URA |                      |                    |AY90  |AY90HC-Y01A OMOTE(1LINE)|HC-Y01A OMOTE(1LINE)|GRM31BR73A102KW01L   |                   1|129|→ |      |    

現状のコードも掲示ます
Private Sub CommandButton1_Click()

 Application.ScreenUpdating = False
    Const zProgramID  As String = "機種間共通部品,Z軸検索改良版??7.xlsm"
    Dim zTb           As Workbook
    Dim i             As Long
    Dim j             As Long
    Dim n             As Long
    Dim v()           As Variant
    Dim tMp()         As Variant
    Dim iDx()         As Variant
    Dim leadB         As Workbook
    Dim beforeB       As Workbook
    Dim x             As Variant
    Dim bFnm          As String  '現ファイル名
    Dim bFnm1         As String  '現機種名
    Dim bFnm2         As String  '前機種上位品番
    Dim bFnm3         As String  '行き先機種上位品番
    Dim bFnm4         As String  '前機種投入工程
    Dim bFnm5         As String  '行き先機種投入工程
    Dim fNmTx         As String
    Dim dAtaBk        As Variant
    Dim t             As Double
    t = Timer
    Set zTb = Workbooks(zProgramID)
    With zTb.Worksheets("機種間共通部品検索")
        v = .Range("D1:YA154").Value
    End With
    For i = 2 To UBound(v, 2) Step 13
        bFnm = v(3, i - 1) '現ファイル名
        bFnm1 = v(8, i - 1) '現機種名
         = v(5, i - 1) '前機種上位品番
        bnFm3 = v(7, i - 1) '行き先機種上位品番
        bnFm4 = v(5, i + 1) '前機種投入工程
        bnFm5 = v(7, i + 1) '行き先機種投入工程
        For j = 11 To UBound(v, 1)
            If v(j, i) <> "" Then
                ReDim tMp(1 To 5)
                tMp(1) = bFnm '現ファイル名
                tMp(2) = v(j, i)  '前機種ファイル名
                tMp(3) = v(j, i + 1)  '前機種と次機種共通部品 棚番
                tMp(4) = v(j, i - 1) '行き先機種名
                tMp(5) = bFnm1 '現機種名
                ReDim Preserve iDx(n)
                iDx(n) = tMp
                n = n + 1
            End If
        Next
    Next

    For i = LBound(iDx) To UBound(iDx)
        '前機種名

        If iDx(i)(1) <> "" Then
            fNmTx = ThisWorkbook.Path & "\出庫リスト\" & iDx(i)(1) & ".xlsx"
            If zWbExists(fNmTx) Then
           Application.DisplayAlerts = False
            Application.ScreenUpdating = False
             Dim srcWS As Workbook
                Dim dstWS As Worksheet
                Set dstWS = ThisWorkbook.Worksheets("機種間共通部品検索")
                Set srcWS = Workbooks.Open(fNmTx)

               With srcWS.Worksheets(1)
                srcWS.Worksheets(1).Range("B6:AJ359"). _
                AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=dstWS.Range("D4:E5"), _
                Unique:=True

                    x = Application.Match(iDx(i)(3), srcWS.Worksheets(1).Range("B:B"), 0)
                    If Not IsError(x) Then
                    If srcWS.Worksheets(1).Cells(x, "H") = "" Then srcWS.Worksheets(1).Cells(x, "H") = tMp(4)
                        srcWS.Worksheets(1).Cells(x, "H").EntireColumn.AutoFit
                        dAtaBk = srcWS.Worksheets(1).Cells(x, "E").Value
                    End If
                End With
                srcWS.Close True
                Set srcWS = Nothing
                Application.DisplayAlerts = True
                Application.ScreenUpdating = True
            Else
                MsgBox "前機種F Non" & Chr(13) & iDx(i)(1) & ".xlsx"
                Exit For
            End If
        End If
        '行き先機種名

        fNmTx = ThisWorkbook.Path & "\出庫リスト\" & iDx(i)(2) & ".xlsx"
        If zWbExists(fNmTx) Then
         Application.DisplayAlerts = False
        Application.ScreenUpdating = False
            Dim dstWS1 As Worksheet
                Set dstWS1 = ThisWorkbook.Worksheets("機種間共通部品検索")
                Dim srcWS1 As Workbook
                Set srcWS1 = Workbooks.Open(fNmTx)
                With srcWS1.Worksheets(1)
                Dim c As Range
                With srcWS1.Worksheets(1)
                srcWS1.Worksheets(1).Range("B6:AJ359"). _
                AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=dstWS1.Range("D6:E7"), _
                Unique:=True
                For Each c In .AutoFilter.Range.SpecialCells(xlCellTypeVisible)
                Next c

                x = Application.Match(iDx(i)(3), srcWS1.Worksheets(1).Range("B:B"), 0)
                If Not IsError(x) Then
                If srcWS1.Worksheets(1).Cells(x, "A") = "" Then srcWS1.Worksheets(1).Cells(x, "A") = tMp(5)
                srcWS1.Worksheets(1).Cells(x, "A").EntireColumn.AutoFit
                If srcWS1.Worksheets(1).Cells(x, "C") = "" Then srcWS1.Worksheets(1).Cells(x, "C") = dAtaBk
                    dAtaBk = ""
                End If
            End With
            End With
            srcWS1.Close True
            Set srcW1 = Nothing
            Application.DisplayAlerts = True
            Application.ScreenUpdating = True
        Else
            MsgBox "行き先機種F Non" & Chr(13) & iDx(i)(2) & ".xlsx"
            Exit For
        End If
        If i Mod 30 = 0 Then DoEvents
    Next
    Set zTb = Nothing
    Erase v, iDx, tMp

End Sub
Private Function zWbExists(ByVal fp As String) As Boolean

    zWbExists = False
    If Dir(fp) <> "" Then zWbExists = True
End Function
補足
AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=dstWS.Range("D4:E5"), _
AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=dstWS1.Range("D6:E7"), _
のdstWS.Range("D4:E5")とdstWS1.Range("D6:E7")は
dstWS.Range("bFnm2",bFnm4") 
dstWS.Range("bFnm3",bFnm5") が入ると予測されます。

(u) 2021/04/06(火) 12:33


 >>前回ご教授いただいたコードは前と行き先のファイル名は違う場合は有効で、 
 >>今悩んでいるのが開くファイルが前と行き先で同一の場合どうするかということです。 
  ↑

 と棚番が重複とは、別問題だとおもうのですが。
 やはり、よくわかりません。

 棚番、   j列、   K列
 A705   ZY-33260000 マウント(表)
 A705   ZY-33260000 マウント(表)

 のように全く同じになることはないのでしょうか。  

(隠居じーさん) 2021/04/06(火) 12:49


同じになることはないです。
J列、K列は変わります。
J列の説明
一つのものを一枚の板を使って表裏に部材を使う場合はJ列は同じ値が入ります。
しかし、一つのものを複数の板を使って作る場合はJ列に板事の品番が入ります。
K列の説明
一つのものを一枚、複数の板を使って表裏に部材を使う場合に
マウント表、マウント裏、マウントのどれかが入ります。
よって棚番が重複していてたらJ列かK列、もしくは両方が必ず異なります。
(u) 2021/04/06(火) 13:19

では例えば、
J列、K列をフイルターの際、j列はどちらの品番、k列は(表、裏)、どちら
でフイルターをかけるかの判断は何を基準に、お決めになられますか。教えて下さい。

(隠居じーさん) 2021/04/06(火) 14:05


隠居じーさんさんの邪魔しちゃわるいなぁと思いますが、気になって仕方ないのでちょっとだけお邪魔します。

■1
↓すごい違和感があります。

 Dim srcWS As Workbook
 Set srcWS = Workbooks.Open(fNmTx)

WSって普通に考えるとWowksheetの略だとおもうんですが、Workbookの変数名に使っちゃったら混乱しませんか?

■2
ユーザー定義関数の「zWbExists」は理解できてるんですか?
個人的には、別建てにすることでかえって複雑になってるような気がします。

■3
真面目にインデントを付けてみてはどうですか?
部分的に取り出してインデントを付けて若干整理してみると↓のようになるわけですが

    Dim c As Range

    With srcWS1.Worksheets(1)
        With srcWS1.Worksheets(1)
            srcWS1.Worksheets(1).Range("B6:AJ359").AdvancedFilter _
              Action:=xlFilterInPlace, CriteriaRange:=dstWS1.Range("D6:E7"), Unique:=True

            For Each c In .AutoFilter.Range.SpecialCells(xlCellTypeVisible)
            Next c

            x = Application.Match(iDx(i)(3), srcWS1.Worksheets(1).Range("B:B"), 0)

            If Not IsError(x) Then
                If srcWS1.Worksheets(1).Cells(x, "A") = "" Then srcWS1.Worksheets(1).Cells(x, "A") = tMp(5)
                srcWS1.Worksheets(1).Cells(x, "A").EntireColumn.AutoFit
                If srcWS1.Worksheets(1).Cells(x, "C") = "" Then srcWS1.Worksheets(1).Cells(x, "C") = dAtaBk
                dAtaBk = ""
            End If
        End With
    End With

 ・意味のないループがある
 ・なぜか「With srcWS1.Worksheets(1)」が2段構えになっている(しかも意味のないループ部分以外では使ってない)

のようなツッコミ所が見受けられます。

(もこな2 ) 2021/04/06(火) 15:07


隠居じーさん様
遅れてすみません。
1機種目を例に申し上げます
前機種は
J列の上位品番は機種間共通検索シートのD6、K列の投入工程は機種間共通検索シートのE5を基準にしています。
行き先機種は
J列の上位品番は機種間共通検索シートのD7、K列の投入工程は機種間共通検索シートのE7を基準にしています
上位品番、投入工程は
その際のコードは13列間隔です。
現在は
前機種はAdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=dstWS.Range(""), _
                Unique:=True
行き先機種は
AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=dstWS1.Range(""), _
となっています。

もこな2様
突っ込みどころあるのはご容赦ください。
隠居じーさん様のコードを今回追加したい部分を自分なりに書いた結果がこれになります。
すみません。エラーが出なかったのでOKかなと思ったのが本音です。
不要な部分が多いですね。誠にすみません。
質問の答えになっていないかもしれませんがご容赦願います

                Unique:=True
(u) 2021/04/06(火) 15:22

 >>J列の上位品番は機種間共通検索シートのD6、K列の投入工程は機種間共
 >>通検索シートのE5を基準にしています。~~~                
 >> 行き先機種は 
 >>J列の上位品番は機種間共通検索シートのD7、K列の投入工程は機種間共通検索シートのE7を基準にしてます
 両方とも、5行目、7行目の、間違いでは。。。ご確認を。m(__)m

もこな2さん、ありがとうございます。 ^^
再度、確認してみます。他にもいろいろありそぉな。。。^^;
もうすこし、考えてみます。
m(__)m
(隠居じーさん) 2021/04/06(火) 15:40


見間違えました。
両方とも5行目、7行目です。
失礼しました。
(u) 2021/04/06(火) 15:47

 こんばんは ^^
了解です。只今、勘案中。。。まとまりましたら
また、ご連絡いたします。。。半分、忘れかけてて。。。
思い出すのに、お時間がかかるかも。。。( ̄▽ ̄;)
でわ。。。m(__)m
(隠居じーさん) 2021/04/06(火) 17:15

こんばんは ^^
え〜と。。。全機種D3、Q3〜が無い場合の機種間共通検索シートの
1〜11行までのレイアウトはどうなっていますか。

(隠居じーさん) 2021/04/06(火) 20:35


こんばんは。
2機種目以降のレイアウトということでしょうか?
1機種目のレイアウトがそのまま13列間隔で入っています。
これで大丈夫でしょうか?
13列間隔といいましたけどよく見たら12列でした。
必要な情報
現ファイル名
先頭 D3でセル以降12列間隔で最終列XQ3セル
前機種 上位品番
先頭 D5セル以降12列間隔で最終列XQ5セル
前機種投入工程
先頭 E5セル以降12列間隔で最終列XR5セル
行き先機種 上位品番
先頭 D7セル以降12列間隔で最終列XQ7セル
行き先機種投入工程
先頭 E7セル以降12列間隔で最終列XR7セル
現機種名
先頭 D8セル以降12列間隔で最終列XR7セル

前機種、行き先機種上位品番ですが、空白の場合もあります。
投入工程は必ず入ります。
空白の場合は投入工程でフィルタを掛け
上位品番、投入工程両方入っている場合は
上位品番でフィルタを掛け次に投入工程でフィルタを掛けます。

(u) 2021/04/06(火) 21:28


 あ。。。はい。。。w
自信がなくなってきました。。。^^;。。。。
お仕事の内容が、畑違いもあり、全くわからないので、断言は出来ませんが
棚番って、如何なる場合でも、一意に設計するべきだと、思っていたのですが。
システム全体が脆弱なような気がしてきました。なんともなければ、幸いですが
。。。私の勘違いでしたらお許しを。
余談はこれくらいにして、その、列も、一列づつ、ふえているよ〜ですし、実験
データーも作り直さないと、いけないようなきがいたしますので。
あまり、期待せずに、気長にお待ちください。
同時に、他の回答者様のアドバイスもお待ちくださいね。
でわでわ。。。m(__)m
(隠居じーさん) 2021/04/06(火) 23:33

おはようございます。
言葉足らずですみません、
棚番というのは部品をしまっとおく棚の場所の事を意味してます。
よって部品名一つに棚番が一つあるという認識です。
商品棚みたいなものです。
(u) 2021/04/07(水) 06:36

 >>ちなみに、マクロの記録でやった際のコードは 
Range("A6:AN154").AdvancedFilter Action:=xlFilterInPlace, Unique:=False 
>>でした。 
>> (u) 2021/04/05(月) 22:09
と
(u) 2021/04/06(火) 07:32 
で
ご提示の表と範囲の開始行、並びに
範囲その物が相違します。
どちらが、本当なのでしょう。^^;
m(_ _)m
(隠居じーさん) 2021/04/07(水) 19:53

こんばんは。
掲示したレイアウトはAからHまでは一緒なのですが
それいこうは簡略しました。
失礼しました。
実際のレイアウトは
上位品番はAE6が見出し行でAE7から下に最大359行まであります。
投入工程はAJ6が見出し行でAJ7から下に最大359行まであります。
HからADまでは基本非表示になっていたのを忘れてました。
失礼しました。
(u) 2021/04/07(水) 20:13

 全体は Range("A6:AN359")が正解でよろしいですか。
(隠居じーさん) 2021/04/07(水) 20:36

誠に恐縮ですがB6からAJ359でお願いします。
(u) 2021/04/07(水) 20:46

 この質問者あれこれ希望書いているだけで、自分で考える事はしないのかね。
 回答者は良く付き合ってられますね。
(pl) 2021/04/07(水) 20:57

 おはようございます ^^
フイルターは使っていませんが、同じ効果はあるはずです。
なにせ、回し好きなもので。。。^^;
範囲とかエトセトラ、そちらの環境に合わせて下さいね。
とりあえずこんな方法でもできるかなぁ?。。。みたいな
程度で、何かの参考の足しにでも。。。← ならないかも。。。( ̄▽ ̄;)
出来たら、横並びは、御止めになって、一件、一行で縦方向
に入力して、テーブルにしておくと、後々すごぉ〜く、楽な
のではと、私は思います。
余計なお世話でしたらお許しを。。。m(__)m
という事で。わたしは、ここまで。とさせて戴きます。m(__)m

 Option Explicit
Sub OneInstanceMain03()
    Const zProgramID  As String = "機種間共通部品Z軸検索Filter編.xlsm"
    Dim zTb           As Workbook
    Dim i             As Long
    Dim j             As Long
    Dim k             As Long
    Dim n             As Long
    Dim v()           As Variant
    Dim tMp()         As Variant
    Dim iDx()         As Variant
    Dim leadB         As Workbook
    Dim beforeB       As Workbook
    Dim x             As Variant
    Dim fNmTx         As String
    Dim fNmBk         As String
    Dim dAtaBk        As Variant
    Dim rr            As Range
    Dim t             As Double
    t = Timer
    Set zTb = Workbooks(zProgramID)
    With zTb.Worksheets("機種間共通検索")
        v = .Range("D1:YC154").Value
    End With
    For i = 2 To UBound(v, 2) Step 13
        For j = 12 To UBound(v, 1)
            If v(j, i) <> "" Then
                ReDim tMp(1 To 3 + 2)
                tMp(1) = v(3, i - 1)
                tMp(2) = v(j, i)
                tMp(3) = v(j, i + 1)
                tMp(4) = v(7, i - 1)    '先行機種 上位品番
                tMp(5) = v(7, i)        '先行機種 投入工程
                ReDim Preserve iDx(n)
                iDx(n) = tMp
                n = n + 1
            End If
        Next
    Next
    n = 0
    For i = LBound(iDx) To UBound(iDx)
        fNmTx = ThisWorkbook.Path & "\" & iDx(i)(2) & ".xlsx"
        If zWbExists(fNmTx) Then
            Set leadB = Workbooks.Open(fNmTx)
            With leadB.Worksheets(1)
                Set rr = .Range("B6:AJ359")
                For k = 2 To rr.Rows.Count
                    If iDx(i)(4) = "" Then
                        If rr(k, 1) = iDx(i)(3) And rr(k, 35) = iDx(i)(5) Then
                            n = rr(k, 1).Row
                        End If
                    Else
                        If rr(k, 1) = iDx(i)(3) And rr(k, 35) = iDx(i)(5) And rr(k, 30) = iDx(i)(4) Then
                            n = rr(k, 1).Row
                        End If
                    End If
                Next
                If n > 0 Then
                    If iDx(i)(1) <> "" Then .Cells(n, "A") = iDx(i)(1)
                    fNmBk = iDx(i)(2)
                    dAtaBk = .Cells(n, "F").Value
                End If
                n = 0
            End With
            leadB.Close True
            Set rr = Nothing
            Set leadB = Nothing
        Else
            MsgBox "行き先機種F Non" & Chr(13) & iDx(i)(2) & ".xlsx"
            Exit For
        End If
        '前機種名
        If iDx(i)(1) <> "" Then
            fNmTx = ThisWorkbook.Path & "\" & iDx(i)(1) & ".xlsx"
            If zWbExists(fNmTx) Then
                Set beforeB = Workbooks.Open(fNmTx)
                With beforeB.Worksheets(1)
                    x = Application.Match(iDx(i)(3), .Range("B:B"), 0)
                    If Not IsError(x) Then
                        If fNmBk <> "" Then
                            .Cells(x, "H") = fNmBk
                            fNmBk = ""
                        End If
                        If dAtaBk <> "" Then
                            .Cells(x, "C") = dAtaBk
                            dAtaBk = ""
                        End If
                    End If
                End With
                beforeB.Close True
                Set beforeB = Nothing
            Else
                MsgBox "前機種F Non" & Chr(13) & iDx(i)(1) & ".xlsx"
                Exit For
            End If
        End If
        If i Mod 30 = 0 Then DoEvents
    Next
    Set zTb = Nothing
    Erase v, iDx, tMp
    MsgBox "終了 " & Format(Int(Timer - t) / 24 / 60 / 60, "hh : mm : ss") & _
                      Format((Timer - t) - Int(Timer - t), ".000") & " 秒"
End Sub
Private Function zWbExists(ByVal fp As String) As Boolean
    zWbExists = False
    If Dir(fp) <> "" Then zWbExists = True
End Function
(隠居じーさん) 2021/04/08(木) 08:59

返信遅くなり申し訳ございません。。
無事希望通りの動作ができました。
今はコードの意味を理解しようとしています。
この度はありがとうございました。
失礼します。
(u) 2021/04/08(木) 21:08

こんばんは。
一点今悩んでいます。
現状はコードを実行すると前回書き込んだファイルも再度開いてしまうため
下記のコードで
ファイルを開いたらファイル名が表示されているセルの背景色を黄色にして次実行する際はセルの
背景が黄色いだったらセルに表示されているファイル名は開かないという事は可能なのでしょうか?
For i = LBound(iDx) To UBound(iDx)
        fNmTx = ThisWorkbook.Path & "\" & iDx(i)(2) & ".xlsx"
        If zWbExists(fNmTx) Then
            Set leadB = Workbooks.Open(fNmTx)
            With leadB.Worksheets(1)
                Set rr = .Range("B6:AJ359")
                For k = 2 To rr.Rows.Count
                    If iDx(i)(4) = "" Then
                        If rr(k, 1) = iDx(i)(3) And rr(k, 35) = iDx(i)(5) Then
                            n = rr(k, 1).Row
                        End If
                    Else
                        If rr(k, 1) = iDx(i)(3) And rr(k, 35) = iDx(i)(5) And rr(k, 30) = iDx(i)(4) Then
                            n = rr(k, 1).Row
                        End If
                    End If
                Next
                If n > 0 Then
                    If iDx(i)(1) <> "" Then .Cells(n, "A") = iDx(i)(1)
                    fNmBk = iDx(i)(2)
                    dAtaBk = .Cells(n, "F").Value
                End If
                n = 0
            End With
            leadB.Close True
            Set rr = Nothing
            Set leadB = Nothing
        Else
            MsgBox "行き先機種F Non" & Chr(13) & iDx(i)(2) & ".xlsx"
            Exit For
        End If
Private Function zWbExists(ByVal fp As String) As Boolean
    zWbExists = False
    If Dir(fp) <> "" Then zWbExists = True
End Function
ご教授願います。
(u) 2021/04/14(水) 17:49

>背景が黄色いだったらセルに表示されているファイル名は開かないという事は可能なのでしょうか?
可能です。
(もこな2) 2021/04/14(水) 19:09

とりあえずマクロ記録でセルの背景色を黄色にするまではできました。
        With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
        End With
これをどこにいれるべきかわかりません。
ご教授願います。
(u) 2021/04/14(水) 21:13

>これをどこにいれるべきかわかりません。
セルの背景色を黄色にしたいところに(タイミングで)入れてください。

ちなみに↓の1行で同じことになるでしょう。

 Selection.Interior.Color = 65535

(もこな2) 2021/04/14(水) 21:17


書き忘れ。
「iDx」を配列にしてしまっているから、セル番地にもどさないとダメですよ。

(もこな2) 2021/04/14(水) 21:20


Selection.Interior.Color = 65535だと選択したセルに対してでしたので、Selectionの部分は
どうしたらよいでしょうか?
ちなみにご指摘いただいたセル番地に戻すとはどういう意味でしょうか?
(u) 2021/04/14(水) 21:43

Selectionの部分はどうしたらよいでしょうか?
ちなみにご指摘いただいたセル番地に戻すとはどういう意味でしょうか?

いや、まさにその部分ですよ。
ブック名は「iDx(i)(1)」なわけですよね。
なら、それが書いてあったのはどの【セル】なのか特定して、その【セル】を操作しないとダメですよね?

(もこな2) 2021/04/14(水) 22:05


Dim U As Variant
   Set U = iDx(i)(2)
      U.Interior.Color = 65535
としましたが、U.Interior.Color = 65535のUで型が一致しませんとでます。
iDx(i)(2)でファイル名が表示されているセルは取得しています。
どうすればよいでしょうか?

(u) 2021/04/14(水) 22:28


>iDx(i)(2)でファイル名が表示されているセルは取得しています。
いえ、取得してないと思いますよ。

ちなみに、取得したと思っているセル番地はどこですか?
(なぜ、取得したとおもわれたのか確認のために聞いてます)

(もこな2) 2021/04/15(木) 04:22


Application.ScreenUpdating = False
    Const zProgramID  As String = "機種間共通部品,Z軸検索改良版??6(YDS)TRAY無し.xlsm"
    Dim zTb           As Workbook
    Dim i             As Long
    Dim j             As Long
    Dim k             As Long
    Dim n             As Long
    Dim v()           As Variant
    Dim tMp()         As Variant
    Dim iDx()         As Variant
    Dim leadB         As Workbook
    Dim leadB1         As Workbook
    Dim beforeB       As Workbook
    Dim x             As Variant
    Dim fNmTx         As String
    Dim fNmBk         As String
    Dim dAtaBk        As Variant
    Dim rr            As Range
    Dim t             As Double
    t = Timer
    Set zTb = Workbooks(zProgramID)
    With zTb.Worksheets("機種間共通部品検索")
        v = .Range("D1:ABW154").Value
    End With
    For i = 2 To UBound(v, 2) Step 15
        For j = 11 To UBound(v, 1)
            If v(j, i) <> "" Then
                ReDim tMp(1 To 5 + 2)
                tMp(1) = v(3, i + 1) '現ファイル名
                tMp(2) = v(j, i + 2) '行き先ファイル名
                tMp(3) = v(j, i + 3)  '棚番
                tMp(4) = v(j, i - 1)    '行き先機種 上位品番
                tMp(5) = v(j, i)      '行き先機種 投入工程
                tMp(6) = v(4, i + 1)  '現機種名
                tMp(7) = v(j, i + 1)  '行き先機種名
                ReDim Preserve iDx(n)
                iDx(n) = tMp
                n = n + 1
            End If
        Next
    Next

    For i = LBound(iDx) To UBound(iDx)
        '前機種名
        If iDx(i)(1) <> "" Then
            fNmTx = ThisWorkbook.Path & "\出庫リスト\" & iDx(i)(1) & ".xlsx"
            If zWbExists(fNmTx) Then
            Application.DisplayAlerts = False
            Application.ScreenUpdating = False
                Set beforeB = Workbooks.Open(fNmTx)
                With beforeB.Worksheets(1)
                Set rr = .Range("B6:AJ359")
                    x = Application.Match(iDx(i)(3), .Range("B:B"), 0)
                    If Not IsError(x) Then
                    If .Cells(x, "H") = "" Then .Cells(x, "H") = iDx(i)(7) '空白なら書き込む 文字があったら何もしない
                           .Cells(x, "H").EntireColumn.AutoFit
                        dAtaBk = .Cells(x, "E").Value
                        End If
                End With
                beforeB.Close True
                Set beforeB = Nothing
                 Application.DisplayAlerts = True
                Application.ScreenUpdating = True
            Else
                MsgBox "前機種F Non" & Chr(13) & iDx(i)(1) & ".xlsx"
                Exit For
            End If
        End If
            '行き先機種名
        fNmTx = ThisWorkbook.Path & "\出庫リスト\" & iDx(i)(2) & ".xlsx"

        If zWbExists(fNmTx) Then
        Application.DisplayAlerts = False
        Application.ScreenUpdating = False
            Set leadB = Workbooks.Open(fNmTx)
            With leadB.Worksheets(1)
             x = Application.Match(iDx(i)(3), .Range("B:B"), 0)
             If Not IsError(x) Then
                    If iDx(i)(1) <> "" Then .Cells(x, "A") = iDx(i)(6)
                    .Cells(x, "A").EntireColumn.AutoFit
                     If .Cells(x, "C") = "" Then .Cells(x, "C") = dAtaBk
                    dAtaBk = ""
               End If

            End With

            leadB.Close True
            Set leadB = iDx(i)(2)
          leadB.Interior.Color = 65535
            Set lead = Nothing
             Application.DisplayAlerts = True
             Application.ScreenUpdating = True

        Else
            MsgBox "行き先機種F Non" & Chr(13) & iDx(i)(2) & ".xlsx"

            Exit For

        End If

        If i Mod 30 = 0 Then DoEvents

    Next

    Set zTb = Nothing

    Erase v, iDx, tMp

    MsgBox "終了 " & Format(Int(Timer - t) / 24 / 60 / 60, "hh : mm : ss") & _
                      Format((Timer - t) - Int(Timer - t), ".000") & " 秒"
End Sub
Private Function zWbExists(ByVal fp As String) As Boolean
    zWbExists = False
    If Dir(fp) <> "" Then zWbExists = True
End Function

 セル番地はtMp(2) = v(j, i + 2) です。
デバックでiDx(i)(2)にカーソルを当ててファイル名が表示されているのを確認しました。
(u) 2021/04/15(木) 06:06

■4
聞き方が悪かったですかね。
取得したと思っている【セル】はどこですか?以下のように答えてください。
 回答例:○○シートのB12セル

■5
要は↓のようにしているのですから

 セル範囲 → 配列

↓のように、もう一度セル範囲に戻して「iDx(i)(2)」に相当するセルを考えないとダメですよってことです。配列の中身を聞いているんじゃありません。

 セル範囲 → 配列 → セル範囲

あと、どうでもいいですが【デバッグ】とは、プログラム修正作業のことです。エラーが発生する状況のことではありません。
 

(もこな2) 2021/04/15(木) 07:35


すみません。
1番初めにファイル名が表示されているセルは
機種間共通部品検索シートのG12です。
(u) 2021/04/15(木) 07:46

■6
>機種間共通部品検索シートのG12です。
では、その【セル】を操作すればよいですね。
つまり最終的には↓のような命令になればよいわけです。
 Worksheets("機種間共通部品検索").Range("G12").Interior.Color = 65535

ちなみにどうやって特定したのですか?目視で確認したとかは無しですよ。
「 v(j, i + 2) 」なり「iDx(i)(2)」から戻す方法が分からないとExcel君に指示できないですよね?

(もこな2) 2021/04/15(木) 07:54


目視ではなく、
ステップインで確認しました。

(u) 2021/04/15(木) 07:57


>ステップインで確認しました。
なにを確認したんですか?

(もこな2 ) 2021/04/15(木) 08:49


該当の箇所までステップインでもっていき、iDx(i)(2)にカーソルを当て
ファイルを確認しました。
(u) 2021/04/15(木) 09:34

私の力では答えは導きだせません。
もしよろしければ、ご教授願います。
(u) 2021/04/15(木) 11:04

    v = .Range("D1:ABW154").Value
  して、
    tMp(2) = v(j, i + 2) '行き先ファイル名 
  で    
    iDx(n) = tMp

    なので、iDx(i)(2) は、行き先ファイル名が、文字列の値として入ってる
  
  ステップ実行したとき、iDx(i)(2)の値を調べたとして、
  ファイル名は分かっても、その値が入っていたセルがどこなのか分かる訳ないでしょ
  ということ。

    iDx(i)(2)の値(ファイル名)見て→ G12 です ってどうやって回答したんですか??
(とおりすがり) 2021/04/15(木) 11:13

確かにおっしゃる通りですね。
ファイル名が表示されていてもセル番地まではなかったです。
これじゃ、目視と同じですね。
すみません。
(u) 2021/04/15(木) 11:26

■7
既にコメントがありますが。「iDx」という配列の正体って↓なわけですよね。
    For i = 2 To UBound(v, 2) Step 15
        For j = 11 To UBound(v, 1)
            If v(j, i) <> "" Then
                ReDim tMp(1 To 5 + 2)
                tMp(1) = v(3, i + 1) '現ファイル名
                tMp(2) = v(j, i + 2) '行き先ファイル名
                tMp(3) = v(j, i + 3)  '棚番
                tMp(4) = v(j, i - 1)    '行き先機種 上位品番
                tMp(5) = v(j, i)      '行き先機種 投入工程
                tMp(6) = v(4, i + 1)  '現機種名
                tMp(7) = v(j, i + 1)  '行き先機種名
                ReDim Preserve iDx(n)
                iDx(n) = tMp   '←★★★ ここに注目 ★★★
                n = n + 1
            End If
        Next

で、「v」という配列の正体は↓ですよね

 v = Workbooks("機種間共通部品,Z軸検索改良版??6(YDS)TRAY無し.xlsm").Worksheets("機種間共通検索").Range("D1:ABW154").Value

なので、
iDx(i)(2) の正体は tMp(2)(n) ということになり
tMp(2)(n) の正体は v(j, i + 2)(n)ということですから、目的のセルは

 【機種間共通部品,Z軸検索改良版??6(YDS)TRAY無し.xlsm"】というブックの
 【機種間共通部品検索】というシートの
 【D1:ABW154】のどこか

なんだろうなとはおもいますけど、「tMp(2)(n)」からどうやって求めましょう?というお話です。

ちなみに「iDx(i)(2) 」ではなく、「 v(j, i + 2)」から求めるのであればぐっと簡単になりますね。
↓のようなことになるわけですから。

 zTb.Worksheets("機種間共通部品検索").Range("D1:ABW154").Cells(j, i + 2)

■8
余談ですが、配列にしたことでかえってごちゃごちゃしてるような気がするので、初めから配列にせずRangeオブジェクトとして扱ったほうがよかったんじゃないかなぁなんて思います。
(好みの問題でしょうが)

(もこな2 ) 2021/04/15(木) 12:25


 こんにちは ^^...解決案。。。極簡単バージョン!(#^.^#)
レンジ変数r追加で、vと同じ範囲をほり込んどいて。
tMpを拡張して、行列情報をidxで対比表に追加して
idx作成時、色付きは排除して、
書込み時に、r(j,i)で同期取れてますので、色なり
なんなり、付けてやってください。
r(iDx(i)(6), iDx(i)(7)).Interior.Color = vbYellow
みたいな感じになるかと。。。添え字は現在の設定により
変化致します。[あたりまえですが^^;]。。。m(__)m

(隠居じーさん) 2021/04/15(木) 14:17


ご指摘ありがとうございます。
難しそうなので、試行錯誤してみます。
いつもありがとうございます。
(u) 2021/04/15(木) 14:34

レンジ変数r追加はvと同じ宣言をすれば良いでしょうか?

(u) 2021/04/15(木) 17:21


 いえ
Set
が
いります
.value
は
いりません
 Dim r             As Range
 With zTb.Worksheets("機種間共通検索")
     Set r = .Range("D1:YC154")
     v = r.Value
 End With
みたいに、します。
これで、v、r
は同じ行、列、に対応する、要素数、番号等で、[jとかi]
同じ値が参照できます。

(隠居じーさん) 2021/04/15(木) 19:09


Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
    Const zProgramID  As String = "機種間共通部品,Z軸検索改良版??6(YDS)TRAY無し.xlsm"
    Dim zTb           As Workbook
    Dim i             As Long
    Dim j             As Long
    Dim k             As Long
    Dim n             As Long
    Dim v()           As Variant
    Dim r             As Range
    Dim tMp()         As Variant
    Dim iDx()         As Variant
    Dim leadB         As Workbook
    Dim beforeB       As Workbook
    Dim x             As Variant
    Dim fNmTx         As String
    Dim fNmBk         As String
    Dim dAtaBk        As Variant
    Dim rr            As Range
    Dim t             As Double
    t = Timer
    Set zTb = Workbooks(zProgramID)
    With zTb.Worksheets("機種間共通部品検索")
        v = .Range("D1:ABW154").Value
    End With
     With zTb.Worksheets("機種間共通部品検索")
     Set r = .Range("D1:ABW154")
     v = r.Value
 End With
    For i = 2 To UBound(v, 2) Step 15
        For j = 11 To UBound(v, 1)
            If v(j, i) <> "" Then
                ReDim tMp(1 To 6 + 2)
                tMp(1) = v(3, i + 1) '現ファイル名
                tMp(2) = v(j, i + 2) '行き先ファイル名
                tMp(3) = v(j, i + 3)  '棚番
                tMp(4) = v(j, i - 1)    '行き先機種 上位品番
                tMp(5) = v(j, i)      '行き先機種 投入工程
                tMp(6) = v(4, i + 1)  '現機種名
                tMp(7) = v(j, i + 1)  '行き先機種名
                tMp(8) = r(j, i + 2) '行き先ファイル名
                ReDim Preserve iDx(n)
                iDx(n) = tMp
                n = n + 1
            End If
        Next
    Next

    For i = LBound(iDx) To UBound(iDx)
        '前機種名
        If iDx(i)(1) <> "" Then
            fNmTx = ThisWorkbook.Path & "\出庫リスト\" & iDx(i)(1) & ".xlsx"
            If zWbExists(fNmTx) Then
            Application.DisplayAlerts = False
            Application.ScreenUpdating = False
                Set beforeB = Workbooks.Open(fNmTx)
                With beforeB.Worksheets(1)
                Set rr = .Range("B6:AJ359")
                    x = Application.Match(iDx(i)(3), .Range("B:B"), 0)
                    If Not IsError(x) Then
                    If .Cells(x, "H") = "" Then .Cells(x, "H") = iDx(i)(7) '空白なら書き込む 文字があったら何もしない
                           .Cells(x, "H").EntireColumn.AutoFit
                        dAtaBk = .Cells(x, "E").Value
                        End If
                End With
                beforeB.Close True
                Set beforeB = Nothing
                 Application.DisplayAlerts = True
                Application.ScreenUpdating = True
            Else
                MsgBox "前機種F Non" & Chr(13) & iDx(i)(1) & ".xlsx"
                Exit For
            End If
        End If
            '行き先機種名
        fNmTx = ThisWorkbook.Path & "\出庫リスト\" & iDx(i)(2) & ".xlsx"

        If zWbExists(fNmTx) Then
        Application.DisplayAlerts = False
        Application.ScreenUpdating = False
            Set leadB = Workbooks.Open(fNmTx)
            With leadB.Worksheets(1)
             x = Application.Match(iDx(i)(3), .Range("B:B"), 0)
             If Not IsError(x) Then
                    If iDx(i)(1) <> "" Then .Cells(x, "A") = iDx(i)(6)
                    .Cells(x, "A").EntireColumn.AutoFit
                     If .Cells(x, "C") = "" Then .Cells(x, "C") = dAtaBk
                    dAtaBk = ""
               End If

            End With

            leadB.Close True
      r(iDx(i)(2), iDx(i)(8)).Interior.Color = vbYellow

            Set lead = Nothing
             Application.DisplayAlerts = True
             Application.ScreenUpdating = True

        Else
            MsgBox "行き先機種F Non" & Chr(13) & iDx(i)(2) & ".xlsx"

            Exit For

        End If

        If i Mod 30 = 0 Then DoEvents

    Next

    Set zTb = Nothing

    Erase v, iDx, tMp

    MsgBox "終了 " & Format(Int(Timer - t) / 24 / 60 / 60, "hh : mm : ss") & _
                      Format((Timer - t) - Int(Timer - t), ".000") & " 秒"
End Sub
Private Function zWbExists(ByVal fp As String) As Boolean
    zWbExists = False
    If Dir(fp) <> "" Then zWbExists = True
End Function
現状はこのコードで実行すると
r(iDx(i)(2), iDx(i)(8)).Interior.Color = vbYellow
で型が一致しませんと出ます。
色を付けたいのはファイルを開き、書き込んで閉じたら色を付けたいです。
入れる場所はあっていますでしょうか?
(u) 2021/04/15(木) 19:57

 こんばんは ^^
なにか。。。勘違いをされているようなのですが。。。
一部、範囲、及び、iDx配列への格納項目等、変更されていましたので。
コメントは、差し引けておりました。
当方のテスト環境のままで、恐縮ですが、同じようにそちらでご必要なように、
変更してください、ただ、色付けと2回目上書き防止は出来ていると思いますので
参考程度にして下さい。一度も処理されない場合対応処理も追加しています。
Option Explicit
Sub OneInstanceMain05()
    Const zProgramID  As String = "機種間共通部品Z軸検索Filter編改01.xlsm"
    Dim zTb           As Workbook
    Dim i             As Long
    Dim j             As Long
    Dim k             As Long
    Dim n             As Long
    Dim v()           As Variant
    Dim tMp()         As Variant
    Dim iDx()         As Variant
    Dim leadB         As Workbook
    Dim beforeB       As Workbook
    Dim x             As Variant
    Dim fnmtx         As String
    Dim fNmBk         As String
    Dim dAtaBk        As Variant
    Dim rr            As Range
    Dim r             As Range
    Dim flgcnt        As Long
    Dim t             As Double
    t = Timer
    Set zTb = Workbooks(zProgramID)
    With zTb.Worksheets("機種間共通検索")
        Set r = .Range("D1:YC154")
        v = r.Value
    End With
    For i = 2 To UBound(v, 2) Step 13
        For j = 12 To UBound(v, 1)
            If v(j, i) <> "" And r(j, i).DisplayFormat.Interior.Color = 16777215 Then
                ReDim tMp(1 To 7)
                flgcnt = flgcnt + 1
                tMp(1) = v(3, i - 1)
                tMp(2) = v(j, i)
                tMp(3) = v(j, i + 1)
                tMp(4) = v(7, i - 1)    '先行機種 上位品番
                tMp(5) = v(7, i)        '先行機種 投入工程
                tMp(6) = j
                tMp(7) = i
                ReDim Preserve iDx(n)
                iDx(n) = tMp
                n = n + 1
            End If
        Next
    Next
    If flgcnt = 0 Then
        Erase v, iDx
        Set r = Nothing
        Set zTb = Nothing
        MsgBox "全て処理済みです"
        Exit Sub
    End If
    n = 0
    For i = LBound(iDx) To UBound(iDx)
        fnmtx = ThisWorkbook.Path & "\" & iDx(i)(2) & ".xlsx"
        If zWbExists(fnmtx) Then
            Set leadB = Workbooks.Open(fnmtx)
            r(iDx(i)(6), iDx(i)(7)).Interior.Color = vbYellow
            With leadB.Worksheets(1)
                Set rr = .Range("B6:AJ359")
                For k = 2 To rr.Rows.Count
                    If iDx(i)(4) = "" Then
                        If rr(k, 1) = iDx(i)(3) And rr(k, 35) = iDx(i)(5) Then
                            n = rr(k, 1).Row
                        End If
                    Else
                        If rr(k, 1) = iDx(i)(3) And rr(k, 35) = iDx(i)(5) And rr(k, 30) = iDx(i)(4) Then
                            n = rr(k, 1).Row
                        End If
                    End If
                Next
                If n > 0 Then
                    If iDx(i)(1) <> "" Then .Cells(n, "A") = iDx(i)(1)
                    fNmBk = iDx(i)(2)
                    dAtaBk = .Cells(n, "F").Value
                End If
                n = 0
            End With
            leadB.Close True
            Set rr = Nothing
            Set leadB = Nothing
        Else
            MsgBox "行き先機種F Non" & Chr(13) & iDx(i)(2) & ".xlsx"
            Exit For
        End If
        '前機種名
        If iDx(i)(1) <> "" Then
            fnmtx = ThisWorkbook.Path & "\" & iDx(i)(1) & ".xlsx"
            If zWbExists(fnmtx) Then
                Set beforeB = Workbooks.Open(fnmtx)
                With beforeB.Worksheets(1)
                    x = Application.Match(iDx(i)(3), .Range("B:B"), 0)
                    If Not IsError(x) Then
                        If fNmBk <> "" Then
                            .Cells(x, "H") = fNmBk
                            fNmBk = ""
                        End If
                        If dAtaBk <> "" Then
                            .Cells(x, "C") = dAtaBk
                            dAtaBk = ""
                        End If
                    End If
                End With
                beforeB.Close True
                Set beforeB = Nothing
            Else
                MsgBox "前機種F Non" & Chr(13) & iDx(i)(1) & ".xlsx"
                Exit For
            End If
        End If
        If i Mod 30 = 0 Then DoEvents
    Next
    Set zTb = Nothing
    Set r = Nothing
    Erase v, iDx, tMp
    MsgBox "終了 " & Format(Int(Timer - t) / 24 / 60 / 60, "hh : mm : ss") & _
                      Format((Timer - t) - Int(Timer - t), ".000") & " 秒"
End Sub
Private Function zWbExists(ByVal fp As String) As Boolean
    zWbExists = False
    If Dir(fp) <> "" Then zWbExists = True
End Function
(隠居じーさん) 2021/04/15(木) 20:53

無事希望通りに動作しました。
勘違いしていてすみませんでした。
追加かと思っていました。
いつもご教授いただいてまことに恐縮です。

では失礼します。
(u) 2021/04/15(木) 22:11


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.