- ベストアンサー
VBAでIFの複数条件がうまく動きません。
エラー表示がなくローカルでも見れませんでした。 修正箇所が分からずにいます。 詳しい方教えてください。 何卒よろしくお願いいたします。 ※S、T列に★は入るのですがA列の条件(10000以下)やS列の条件(空白以外)を無視して★が入っています。 作業内容 '(1)A列<従業員ID>のフィルターを数字フィルターで10000以上に設定 '(2)I列<所属>のフィルターを「秋田・長野・栃木・本社」以外に設定 '(3)L列<就労状況>のフィルターを「退職」以外に設定 '(4)M列<勤務形態>のフィルターを「常勤」以外に設定 '(5)S列<資格者>のフィルターを「(空白)」に設定 '(6)J列<エントリー時の保有資格>のフィルターを「aaa・bbb・ccc・ddd」に設定 For r = Cells(Rows.Count, 1).End(xlUp).Row To 4 Step -1 If Cells(r, "A") >= 10000 And _ Not Cells(r, "I") Like "*秋田*" Or Not Cells(r, "I") Like "*長野*" Or _ Not Cells(r, "I") Like "*栃木*" Or Not Cells(r, "I") Like "*本社*" And _ Not Cells(r, "L") Like "退職" And _ Not Cells(r, "M") Like "常勤" And _ Cells(r, "S") Like "" And _ Cells(r, "J") Like "*aaa*" Or Cells(r, "J") Like "*bbb*" Or Cells(r, "J") Like "*ccc*" Or Cells(r, "J") Like "*ddd*" Then Cells(r, "S") = "★" Cells(r, "T") = "★" End If Next r End Sub
- emimaru888
- お礼率5% (7/122)
- Visual Basic
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
修正も何も、1つのIF文は1つの作業しかしません。 6つの作業が必要なら、6つのIF~THEN~ENDIF、が必要になります。 ご質問にあるものは、すべての条件判断を1つのIF文に詰め込んでいますから、すべての条件が成立したときのみに THEN 以下を実行する、というプログラムになってしまっています。 また、AND と OR、NOT には結合の優先度があります。 NOT が一番高い優先順位となり、次にAND、そしてOR が一番弱いです(この3つの中では)。 そうすると、ご質問に書かれた条件式にカッコを付けて結合を明記すると、 If( (Cells(r, "A") >= 10000) And _ (Not Cells(r, "I") Like "*秋田*") ) Or (Not Cells(r, "I") Like "*長野*") Or _ (Not Cells(r, "I") Like "*栃木*") Or ( (Not Cells(r, "I") Like "*本社*") And _ (Not Cells(r, "L") Like "退職") And _ (Not Cells(r, "M") Like "常勤") And _ (Cells(r, "S") Like "" And) _ (Cells(r, "J") Like "*aaa*") ) Or (Cells(r, "J") Like "*bbb*) Or (Cells(r, "J") Like "*ccc*") Or (Cells(r, "J") Like "*ddd*") Then こうなります。 これを OR で改行しなおしてわかりやすくすると、 If( (Cells(r, "A") >= 10000) And (Not Cells(r, "I") Like "*秋田*") ) Or _ (Not Cells(r, "I") Like "*長野*") Or _ (Not Cells(r, "I") Like "*栃木*") Or _ ( (Not Cells(r, "I") Like "*本社*") And _ (Not Cells(r, "L") Like "退職") And _ (Not Cells(r, "M") Like "常勤") And _ (Cells(r, "S") Like "") And _ (Cells(r, "J") Like "*aaa*") ) Or _ (Cells(r, "J") Like "*bbb*) Or _ (Cells(r, "J") Like "*ccc*") Or _ (Cells(r, "J") Like "*ddd*") Then という結合をしていることになります。改行とは無関係に、演算子の強さで結合していますので、1行目から2行目にかかっているカッコと、3行目から7行目までがカッコでまとまっていることに、あなたの考えとの食い違いがあるでしょう。 つまり、あなたの組んだIF文はてんでデタラメなものになってしまっているので、まともに動くはずもないわけです。 ---- ご質問の(1)~(6)は、条件なのですか? 作業なのですか? 作業であるならば、(1)~(6)それぞれで、「IF (条件1) THEN (作業1) END IF」「IF (条件2) THEN (作業2) END IF」…と書いてください。 (1)~(6)が条件であるならば、それぞれの条件をカッコでくくり、ANDで結合して、 IF (条件1) and (条件2) and (条件3) and (条件4) and (条件5) and (条件6) then (作業) end if というように書いてください。
その他の回答 (1)
- kkkkkm
- ベストアンサー率65% (1615/2454)
設定の1項目ごとに条件式を()で囲ってみてください。 If A and B or C Then の場合CがTrueであればAとBが何であっても結果はTrueになると思います。 If A and (B or C) Then だとAがTrueでかつBかCがTrueであれば結果がTrueになると思います。
関連するQ&A
- VBAが動きません。
VBAのコードが動きません。 エラーも出ないので、どこで動かないかわからずにいます。 どこに原因があるか教えていただけないでしょうか? お手数ですが何卒よろしくお願いいたします。 ※画像参照 '①B列<社員番号>のフィルターを「(空白)」を外す '(1)F列<住所都道府県>のフィルターを「茨城・栃木・群馬・埼玉・千葉・東京・神奈川・新潟・山梨・長野・福島・大阪・兵庫」以外で設定 '(2)H列<エリア>のフィルターを「茨城・栃木・群馬・埼玉・千葉・東京・神奈川・新潟・山梨・長野・福島・大阪・兵庫」以外で設定 Sub フィルタ削除1_1() Dim pref As Variant pref = Array("茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "新潟県", "山梨県", "長野県", "福島県", "大阪府", "兵庫県", "静岡県") Dim r As Long, i As Integer, j As Integer For r = Cells(Rows.Count, 3).End(xlUp).Row To 4 Step -1 If Cells(r, "B") <> "" Then For i = 0 To UBound(pref) If InStr(Cells(r, "F"), pref(i)) > 0 Then Exit For End If Next i For j = 0 To UBound(pref) If InStr(Cells(r, "H"), pref(j)) > 0 Then Exit For End If Next j If (i > UBound(pref)) And (j > UBound(pref)) Then Rows(r).Delete End If End If Next r End Sub
- 締切済み
- Visual Basic
- 複数項目が同じ値である場合いくつかの条件の下で処理方法を変えたいのですが、どうしたらよいでしょうか。
参照は1行ずつ下に移行します。6行目の列1から列11までが表1となっており、6行目の列13から列30までが表2になっています。列の項目内容は似ていますが、表2のほうが項目数は多くなっています。要は表1の行と表2の行の指定内容が一致した場合に、条件によって処理をするということがしたいのです。 列1(A) 2 3 4... 11(K) 列13(M) 14 15 16... 30(AD) 日付 時刻 コード 委託者名 ... 日付 時刻 コード 委託者名... マクロの内容としては 条件1. 列1と25M、列2と列26、列3と列15、列7と列S19が同じ値である場合 a 列8+列22=列9+列23 である場合・・・列1~列11・列13~列30を上方向に削除 b 列8+列22>列9+列33 であり、かつ列8>列9 である場合 r=列23の値 列8-r 列13~列30のみを上方向に消去 c 列8+列22>列9+列33であり、かつ列8<列9である場合 r=列23の値 列9-r 列13~列30のみを上方向に消去 d 列8+列22<列9+列33であり、かつ列22>列23である場合 r=列8の値 列22-r 列1~列11のみを上方向に消去 e 列8+列22<列9+列33であり、かつ列22<列23である場合 r=列8の値 列9-r 列1~列23のみを上方向に消去 条件2. 条件1以外は、次の行(n)へ移行する。 エラーにはならないのですが、マクロを作動させても、画面に反応がありません。基礎的な事がまだよく分かっていないので、単純なことかもしれませんが、どうしてもわかりません(涙)。 分かる方に教えていただこうと思い投稿させていただきました。よろしくお願いします。下記に、一応自分で作ったマクロを添付しています。 Sub Open_Positions2() Dim n As Long Dim i As Long Dim r As Range With Sheets("未決済") For i = 6 To .Cells(Rows.Count, 1).End(xlUp).Row For n = 6 To .Cells(Rows.Count, 13).End(xlUp).Row If .Cells(i, 1).Value = .Cells(n, 25).Value And .Cells(i, 2).Value = .Cells(n, 26).Value And .Cells(i, 3).Value = .Cells(n, 14).Value And .Cells(i, 7).Value = .Cells(n, 19).Value Then If .Cells(i, 8).Value + .Cells(n, 22).Value = .Cells(i, 9).Value + Cells(n, 23).Value Then .Cells(i, 1).Resize(11).Delete Shift:=xlUp .Cells(n, 13).Resize(18).Delete Shift:=xlUp GoTo xyz ElseIf .Cells(i, 8).Value + .Cells(n, 22).Value > .Cells(i, 9).Value + .Cells(n, 23).Value And .Cells(i, 8).Value > .Cells(i, 9) Then Set r = .Cells(n, 23).Value .Cells(i, 8).Value -r .Cells(n, 13).Resize(18).Delete Shift:=xlUp GoTo xyz ElseIf .Cells(i, 8).Value + .Cells(n, 22).Value > .Cells(i, 9).Value + .Cells(n, 23).Value And .Cells(i, 8).Value < .Cells(i, 9) Then Set r = .Cells(n, 23).Value .Cells(i, 9).Value -r .Cells(n, 13).Resize(18).Delete Shift:=xlUp GoTo xyz ElseIf .Cells(i, 8).Value + .Cells(n, 22).Value < .Cells(i, 9).Value + Cells(n, 23).Value And .Cells(n, 22).Value > .Cells(n, 23).Value Then Set r = .Cells(i, 8).Value .Cells(n, 22).Value -r .Cells(i, 1).Resize(11).Delete Shift:=xlUp ElseIf .Cells(i, 8).Value + .Cells(n, 22).Value < .Cells(i, 9).Value + Cells(n, 23).Value And .Cells(n, 22).Value < .Cells(n, 23).Value Then Set r = .Cells(i, 8).Value .Cells(n, 23).Value -r .Cells(i, 1).Resize(11).Delete Shift:=xlUp GoTo xyz End If Else Debug.Print "Not Found" End If Next n xyz: Next i End With End Sub
- ベストアンサー
- Visual Basic
- VBA 任意の複数列の実行方法について
現在、次のような任意の列を参照し、任意の列へ日付を入力しています。 Private Sub Worksheet_Calculate() For i = 1 To 100 If (Cells(i, "J") = 1) And (Cells(i, "L") = "") Then Cells(i, "L") = Now() End If Next i End Sub このJ-Lの組み合わせで実行させたい列が他にも4組ほどあるのですが、 指定したい複数の任意の列への実行方法がわかりません。 どなたかおわかりになられたらご教授いただけないでしょうか。 よろしくお願いします。
- 締切済み
- オフィス系ソフト
- エクセルVBAの質問です。
次のようなマクロを作ったのですがエラーにはならないのですが、うまく働きません。 Else if の行が悪いと思うのですがどうなおせばいいのかわかりません。 どなたか教えてください、よろしくお願いします。 Sub 判定() Application.ScreenUpdating = False '処理中の表示をさせない lastrow = (Range("B4").End(xlDown).Row) 'B列の一番最後の行番号を代入 length(1) = Range("S2") For i = length(1) + 4 + 1 To lastrow If Cells(i - 1, 8) = "" And Cells(i - 1, 15) = "GC3" Or Cells(i - 1, 15) = "GC2" Then Cells(i, 8) = Cells(i, 2) * Cells(1, 5) + Cells(1, 7) ElseIf Cells(i - 1, 8) <> "" And Cells(i - 1, 15) = "DC3" Or Cells(i - 1, 15) = "DC2" Or Cells(i - 1, 15) = "DC1" Then Cells(i, 9) = Cells(i, 2) * Cells(1, 5) - Cells(1, 7) Else: Cells(i, 8) = Cells(i - 1, 8) End If Next End Sub
- ベストアンサー
- Visual Basic
- VBAのプログラムでうまく動かなくて困っています。
VBA初心者です。 エクセルのVBAのプログラムでうまく動かなくて困っています。教えていただける方がいらしたら、ぜひ教えて下さい!よろしくお願いします。エクセルの内容は以下のとおりです。 (内容) セル E H J L N P R・・・ 8行目100 200 50 40 30 80 9行目130 350 10 50 60 120 110 ・ ・ (1)列Hの値が列Eの値より大きい場合その下に行を追加します。 (2)セルJ+セルL+セルN+・・をしてセルEの値を超えたセル以降の値を追加した行のセルJ列から順にコピペする処理です。 上のセルの1行目の内容でいいますと、 (1)列Hの値「200」が列Eの値「100」より大きいのでその下に行追加 (2)セルJ、L、N「50」+「40」+「30」でセルEの値「100」より大きいので、追加した行のセルJ列にセルN、Pの値をコピペするです。 以下が私が書いたプログラムです。 Sub test() Dim x As Integer Dim s As Integer Dim t As Integer x = Range("B8").End(xlDown).Row r = Range("J8").End(xlToRight).Column '8行目から最終行までループ For i = x To 9 Step -1 If Cells(i, 5) < Cells(i, 8) Then ☆【For r = y To 11 Step -2 Cells(s, t).Value = Cells(i, r) + Cells(i, r + 2) If Cells(i, 5).Value < Cells(s, t).Value Then Exit For Next】 Rows(i + 1).Insert Shift:=xlDown '超えたセルをコピーして、1行下の"J列以降"に代入 ★ x = x + 1 End If Next i 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 わかる方がいらっしゃいましたら、お願いします。
- 締切済み
- Visual Basic
- エクセルVBAのIFとLikeについて
現在下記の様なコードを作成しましたが、ヒットする時と漏れが発生する時があります。原因がいくら悩んでも不明な為、コードの記載が変なのかもしれないと投稿しました。 初心者に毛が生えた位しか知識がないので、実際のコードを記載します。 '// 入力が含まれている最終行までをFor Eachで対象にする。 For Each Rr In .Range("A2:A" & .Cells(1000000, 1).End(xlUp).Row) If Cells(Rr.Row, 2).Value Like "re:*" Or _ Cells(Rr.Row, 2).Value Like "Re:*" Or _ Cells(Rr.Row, 2).Value Like "RE:*" Or _ Cells(Rr.Row, 2).Value Like "fwd:*" Or _ Cells(Rr.Row, 2).Value Like "Fwd:*" Or _ Cells(Rr.Row, 2).Value Like "FWD:*" Or _ Cells(Rr.Row, 2).Value Like "*決定*" Or _ Cells(Rr.Row, 2).Value Like "*募集*" Then ※上記のElse以外の下記内容が含まれる場合は処理を実行って意味で記載してます。 ElseIf Cells(Rr.Row, 2).Value Like "*要員*" Or _ Cells(Rr.Row, 2).Value Like "*人材*" Or _ Cells(Rr.Row, 2).Value Like "*紹介*" Or _ Cells(Rr.Row, 2).Value Like "*事業主*" Or _ Cells(Rr.Row, 2).Value Like "*技術者*" Then '// 対象アイテムの代入 Hizuke = .Cells(Rr.Row, 1) Aite = .Cells(Rr.Row, 3) kenmei = .Cells(Rr.Row, 2) どうか宜しくお願い致します。
- ベストアンサー
- Excel(エクセル)
- vbaプログラミング
excelのsheet1のF列とj列には5桁の文字列がはいっていて、それぞれ1文字目から3文字目の3文字分を判定して、値をsheet3に出力しています。下記がプログラムです。6しか出力されないんです。 間違い、ご指摘点があればよろしくお願いします。 For i = 3 To 100 If CStr(Mid(Sheets("sheet1").Cells(i, 6), 1, 3)) = "089" And (Sheets("sheet1").Cells(i, 10) = "033") Or (Sheets("sheet1").Cells(i, 10) = "036") Then Sheets("Sheet3").Cells(j, 2).Value = 0 ElseIf CStr(Mid(Sheets("sheet1").Cells(i, 6), 1, 3)) = "090" And (Sheets("sheet1").Cells(i, 10) = "033") Or (Sheets("sheet1").Cells(i, 10) = "036") Then Sheets("Sheet3").Cells(j, 2).Value = 3 ElseIf CStr(Mid(Sheets("sheet1").Cells(i, 6), 1, 3)) = "093" Then Sheets("Sheet3").Cells(j, 2).Value =6
- ベストアンサー
- その他(プログラミング・開発)
- エクセルVBAのIF・・・Else文について
A列に日付が入っていて、それが12月の時はF列に"○"、 それ以外は"×"と表示したいのですが、下記を実行すると、 A列の空白セルの時もF列に"○"が表示されます。 何故でしょうか。Offsetを使って作成したいのですが、 すみませんが、宜しく御願いします。 Sub Test() Dim i For i = 2 To 20 If Month(Cells(i, 1)) = 12 Then Cells(i, 1).Offset(0, 6) = "○" Else Cells(i, 1).Offset(0, 6) = "×" End If Next End Sub
- ベストアンサー
- オフィス系ソフト
- ExcelのVBAで質問です。
以下のようなシートがあります。 A列 B列 C列 D列 E列 F列 G列 H列 NO 名前 確認 日付1 日付2 確認 日付1 日付2 6行目からデータを入れる予定です。 C列には○印を入力します。 C列~E列までデータが入った行は、 F列~H列まで同じ処理をします。 (セルの背景色を変えます。) 以後同じことを列方向で繰り返します。 以下のようなVBAを組みましたが、 ○の個数を数える部分でエラーがでます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim staff As String Dim kakunin As String Dim date1 As Date Dim date2 As Date Dim i As Long Dim j As Long Dim cnt As Long '100件分ループ For i = 6 To 105 '○の数をカウント cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(i, 2), Cells(i, 256)), "○") 'jとは確認の列番号のこと j = 3 * cnt staff = Cells(i, 2) kakunin = Cells(i, j) date1 = Cells(i, j + 1) date2 = Cells(i, j + 2) 'スタッフ名が入力されたら If staff = "" Then Range(Cells(i, j), Cells(i, j + 50)).Interior.ColorIndex = 15 Else Cells(i, j).Interior.ColorIndex = xlNone '○が入力されたら If kakunin = "○" Then Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = xlNone Else Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = 15 End If If Cells(i, j + 1) <> "" And Cells(i, j + 2) <> "" Then Cells(i, j + 3).Interior.ColorIndex = xlNone End If End If Next i End Sub ご教授いただけたら、幸いです。 よろしくお願いいたします。
- ベストアンサー
- その他MS Office製品
お礼
補足
すみません。使ってみましたが同じ結果になりました。使えなかったです。