Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Excel 2016)
複数条件を指定して入力
投稿日時: 19/02/13 17:59:38
投稿者: 和美

マクロでどうしてもできないので教えてください。
  
変更したい表は以下です。
(途中の不要列は省略しています)
 
  E : T  :V
1:記号:チェック :符号
2:F605 :済 :P1K
3:X189 :済:AEH46RAGAH61NWNNIAG
4:E555:(空) :1FRJ-1JUR22J4MNABN
5:P4X50X10:(空):P1K
6:X260 :済:A-V4
7:X183 :済:A-V4
 
・前提
E列記号が「X」で始まっているか「F」が入っていれば必ず済と入っている。
(マクロで組んでいます)
V列符号が同じものはセットとして扱う。
 
・したい事
T列チェックに済が入っている符号と同じ符号があれば、T列に済を入れたい。
 
for each 〜 if 〜 if で複数条件が指定できると知ったので、
第一条件であるT列に済が入っている、まではできましたが、
第二条件である同じ符号をどう指定したらいいのか分かりません。
 
実験用のデータは、元々1737行あるところからマクロで104行まで削っており、
全ての作業が自動化できれば他の同様のデータにも流用したいので
ピボットテーブルや関数ではなくマクロで作りたいです。
 
ご協力宜しくお願い致します。[/u]

回答
投稿日時: 19/02/13 18:07:45
投稿者: WinArrow
投稿者のウェブサイトに移動

説明が分かりにくい
 
>V列符号が同じものはセットとして扱う。
何と何が同じ・・・・なのか?丁寧に説明しましょう。
 
>T列チェックに済が入っている符号と同じ符号があれば、T列に済を入れたい。
ここも、何を言っているかわかりません。
 
for each 〜 if 〜 if で複数条件が指定できると知ったので、
> 第一条件であるT列に済が入っている、まではできましたが、
> 第二条件である同じ符号をどう指定したらいいのか分かりません。
 
第一条件とは、何か?
第二条件とは、何か?
 
他人もわかる言葉で説明しましょう。
 
 

回答
投稿日時: 19/02/13 19:56:13
投稿者: WinArrow
投稿者のウェブサイトに移動

多分、こんなことでは・・・と推測でコードを書いてみました。
  
推測した内容
V列(符号)が同じ「値」をグループとして、
T列(チェック)が空白セルを抽出し、
 同一グループの中にT列に"済"があれば、全部"済"セットしたい
  
Const SHIKIO As String = "COUNTIF($V$2:$V$7,mm)-SUMPRODUCT(($V$2:$V$7=mm)*($T$2:$T$7<>""済""))"
Dim Rx As Long, SHIKI As String
   
     For Rx = 2 To Cells(Rows.Count, "V").End(xlUp).Row
         If Cells(Rx, "T").Value = "" Then
             SHIKI = Replace(SHIKIO, "mm", Cells(Rx, "V").Address(0, 0))
             If Application.Evaluate(SHIKI) >= 1 Then
                 Cells(Rx, "T").Value = "済"
             End If
         End If
     Next
  

投稿日時: 19/02/14 16:09:55
投稿者: 和美

WinArrow様
説明が分かりにくくなってしまった件、申し訳ございません。
やりたかった事はご明察の通りです。
 
マクロもご提示頂き、誠にありがとうございます。
 
質問です。
countifの中に出てくる、検索条件?のmmはどのような意味でしょうか。
範囲指定がV2からV7となっていたので、検索範囲を広げるためとりあえずV100に数字を変更しましたが、V100のセルに数字が入っていない場合でも問題ありませんでしょうか。
できれば下で使われている変数Rxを使用したいですが、無理でしょうか。
 
ご迷惑をお掛け致しますが、宜しくお願い致します。

回答
投稿日時: 19/02/14 16:45:58
投稿者: WinArrow
投稿者のウェブサイトに移動

検索範囲も可変にする必要があった
ことを忘れていました。ごめんんさい。
↓のコードに差し替えて下さい。
 
Const SHIKI0 As String = "COUNTIF($V$2:$V$sss,mm)-SUMPRODUCT(($V$2:$V$sss=mm)*($T$2:$T$sss<>""済""))"
Dim Rx As Long, SHIKI As String
Dim SHIKI1 As String, MaxRow As Long
 
With ActiveSheet
    MaxRow = .Cells(.Rows.Count, "V").End(xlUp).Row
    SHIKI1 = Replace(SHIKI0, "sss", MaxRow)
     
    For Rx = 2 To MaxRow
        If .Cells(Rx, "T").Value = "" Then
            SHIKI = Replace(SHIKI1, "mm", .Cells(Rx, "V").Address(0, 0))
            If Application.Evaluate(SHIKI) >= 1 Then
                .Cells(Rx, "T").Value = "済"
            End If
        End If
    Next
End With
 
 
※"mm"は、文字列の中の特定部分を置き換えるための文字列です。
  "mm"でなくても"○○"でもよいです。
※検索範囲を実情に合わせる(可変にする)ために"sss"を使ってます。

投稿日時: 19/02/14 17:44:54
投稿者: 和美

WinArrow様
 
お早いご回答にご説明の上、修正マクロまでありがとうございます。
コードを実行したところ、思い通りの結果が得られました。
 
そして気づいたのですが、こちらのミスで前提条件が間違っていました。
V列が同じでも済にしてはいけない場合があるようです。
 
とりあえずV列符号を5文字以下に絞れば問題なさそうなので、
 

Const SHIKI0 As String = "COUNTIF($V$2:$V$sss,mm)-SUMPRODUCT(($V$2:$V$sss=mm)*($T$2:$T$sss<>""済"")*IF(LEN($V$2:$V$sss)<5,"")"

 
一行目のConstの部分を上記のように書き換えたところ、以下の部分で「型が一致しません」とエラーが出てしまいました。
 
If Application.Evaluate(SHIKI) >= 1 Then

 
何度もご迷惑をお掛け致します。

回答
投稿日時: 19/02/15 16:28:20
投稿者: WinArrow
投稿者のウェブサイトに移動

IF関数は不要です
 
なお、IF関数を使ってはいけないということではありません。
 
SUMPRODUCT((条件1)*(条件2)*条件3))
の「条件1」「条件2」「条件3」各々の結果は、「0」or「1]になります。
そのようなIF関数の組み立てならばOKということです。
 
今回の記述は間違っています。
>IF(LEN($V$2:$V$sss,"")"
桁数が5未満の時、""(空白文字列)になるわけです。
空白文字列は数値ではないのでエラーになります。
IF(LEN($V$2:$V$sss,1)
と書けばよかったかもしれません。
 
条件xの記述を「A="110"」と書いても「IF(A="10",1,0)」と書いても答えはおなじなので、
数式を短くするためには余分な記述ということです。
 
  
 >Const SHIKI0 As String = "COUNTIF($V$2:$V$sss,mm)-SUMPRODUCT(($V$2:$V$sss=mm)*($T$2:$T$sss<>""済""))"

 Const SHIKI0 As String = "COUNTIF($V$2:$V$sss,mm)-SUMPRODUCT(($V$2:$V$sss=mm)*($T$2:$T$sss<>""済"")*(LEN($V%2:$Vsss)<5))"
 

投稿日時: 19/03/08 15:25:15
投稿者: 和美

反応が遅くなって申し訳ございません。
(通常業務の合間に業務改善の一環でやっているのですが、通常業務が立て込んでしまいました)
 
頂いた修正を実行したのですが、「型が一致しません」と出て
 
If Application.Evaluate(SHIKI) >= 1 Then
 
の部分で引っかかってしまいました。
 
試しに差し替えた「5」の数字を変えてみたり、
エラーが出た「 >=1」の数字を変更してみたのですが、
結果は変わらずです。
 
何度もご迷惑をお掛け致します。
 

回答
投稿日時: 19/03/08 16:03:01
投稿者: WinArrow
投稿者のウェブサイトに移動

>SHIKI
も内容を掲示してみてください。

回答
投稿日時: 19/03/08 16:15:24
投稿者: WinArrow
投稿者のウェブサイトに移動

元の数式に間違いがありました。
 
> Const SHIKI0 As String = "COUNTIF($V$2:$V$sss,mm)-SUMPRODUCT(($V$2:$V$sss=mm)*($T$2:$T$sss<>""済"")*(LEN($V%2:$Vsss)<5))"
 

 
 Const SHIKI0 As String = "COUNTIF($V$2:$V$sss,mm)-SUMPRODUCT(($V$2:$V$sss=mm)*($T$2:$T$sss<>""済"")*(LEN($V$2:$V$sss)<5))"

トピックに返信