• ベストアンサー

If文について

よろしくお願いします。 Excelのマクロで If文を使おうとしています。 ブックAのシート1に会員No.リストがあり、 ブックBに会員Noをシート番号にしたものがあります。 そこで、会員Noに等しいシートを見つけようと、下記のようにIf文を使いました。 しかし、等しいシート番号があるのに 一致した と出ません。 シートの最後まで進んで 不一致 が出ます。 どこが悪いのでしょうか。ご指導お願いします。 For I = 1 To ActiveWorkbook.Worksheets.Count 'ワークシートの数だけ繰り返す MsgBox 会員No & Worksheets(I).Name If 会員No = Worksheets(I).Name Then MsgBox "一致した" End If Next MsgBox "不一致" 質問の補足ですが、マクロはブックAにあります。 ブックAから会員Noを読み取り、ブックBをアクティブにしてから、If文に入っています。またIf文の前のMsgBox 会員No & Worksheets(I).Name で番号が一致する時があることも確認しています。

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

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.5

実際の表やデータが分らないので うまく動くかな? Sub データ移動x() Dim パス As String Dim Ws協力者 As Worksheet Dim 行 As Long Dim 範囲 As Range Dim 列番号 As Integer Dim 利用者番号 As Integer Dim 利用者名 As String Dim I As Integer Dim Ws As Worksheet Application.ScreenUpdating = False 'ウィンドウの切り替わり停止 パス = ThisWorkbook.Path ' アクティブウィンドウのブックのパス Workbooks.Open Filename:=(パス & "\2.利用者.xlsx") 'ブックを開く For Each Ws協力者 In Workbooks("1.協力者.xlsm").Worksheets For 行 = 10 To Ws協力者.Cells(Rows.Count, 3).End(xlUp).Row '**** 利用者番号から名簿を使い利用者名を調べる **** Set 範囲 = Workbooks("1.協力者.xlsm").Worksheets("名簿").Range("E3:F361") 列番号 = 2 '名簿の名前欄 利用者番号 = Ws協力者.Cells(行, 18).Value 利用者名 = Application.WorksheetFunction.VLookup(利用者番号, 範囲, 列番号, False) For Each Ws In Workbooks("2.利用者.xlsx").Worksheets 'ワークシートの数だけ繰返す MsgBox "利用者番号 " & 利用者番号 & " " & Ws.Name & " シート番号" If 利用者番号 = Ws.Name Then MsgBox "一致した" Exit For '利用者番号のシートはあるか? End If Next Ws If Ws Is Nothing Then Set Ws = Workbooks("2.利用者.xlsx").Sheets("1").Copy(After:=Sheets("1")) 'アクティブシートの後へ追加する Ws.Name = 利用者番号 'シート名 Ws.Range("N6").Value = 利用者名 '利用者の名前を貼り付け End If Next 行 Next Ws協力者 Set Ws協力者 = Nothing Set Ws = Nothing Set 範囲 = Nothing Application.ScreenUpdating = True End Sub 以上

hotlinez
質問者

お礼

 動きました。  感激です!!  大変、本当に有難うございました。 ご指導いただいた内容は、よく理解できていませんが、とにかく動きました。 これから、それぞれのステートメントを一つづつ、理解して行こうと思っています。 それから、ご回答を頂いた時間をみると朝の6:20とありました。質問のあと回答のために朝まで費やされたこと誠にお礼の言葉もありません。 申し訳ないのですが私は翌日の仕事もあり4:00頃に寝てしまいました。本日帰宅してから、かような次第です。 hige_082さん  大変お世話になりました。 ありがとうございます。hotlinez

その他の回答 (4)

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

> 「F9でブレーク」と言うのがわかりません。 VBAを記述するエディタVBEでコード表示させてありますよね? この状態で、「例のIF文」の行をクリックして、キーボードのF9キーを押下してください。 行がまるごとレンガ色(みたいな)に白文字になります。そのことです。 もう一度F9キーを押下すると解除されます。 F5で実行開始ご、いったん止まったら、キーボードのF8キーを押下してください。押すごとに一行ずつ実行できます。 面倒になったら、F5で実行再開します。 ただし、F9でブレーク設定した行が残っているとまた止まります。 もう一度F9でブレーク解除して、F5で再開してください。 保存して閉じた場合は、F9のブレーク設定は忘れ去られます。

hotlinez
質問者

お礼

 度々ありがとうございます。 「F9」の意味が分りました。 プラスアルファまで教えていただき有難うございます。 実行してみました。一行ずつ実行しますが、数値が同じでもIf文の後の「一致した」のメッセージには行きません。  有難うございました。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.3

複数のブックを使用するときはブック名を書かないと どのブックに対して処理しているのか分らないよ 例えば >For I = 1 To ActiveWorkbook.Worksheets.Count For I = 1 To Workbooks("ブックB").Worksheets.Count の様にね それと、会員Noは変数なのかな? 変数ならば 会員No=123 と書いておく方が回答者が分りやすいと思うよ Dim 会員No As Integer 会員No=123 この様に書くともっと分りやすい それか、説明に変数 会員No には1~100までの数字が入りますとかね リストが何処にあるか分からないので ブックAのシート1のA列に会員No.リストがあると仮定します ブックBのシート名は半角の数字と仮定しています Sub test() Dim WbA As Workbook Dim WbB As Workbook Dim Ws As Worksheet Dim i As Long Set WbA = Workbooks("ブックA") Set WbB = Workbooks("ブックB") For i = 1 To WbA.Worksheets("シート1").Cells(Rows.Count, 1).End(xlUp).Row For Each Ws In WbB.Worksheets If WbA.Worksheets("シート1").Cells(i, 1).Value = Ws.Name Then MsgBox "一致した" Exit For End If Next Ws If Ws Is Nothing Then MsgBox "不一致" Next i End Sub 以上参考まで

hotlinez
質問者

お礼

 ご指導ありがとうございます。 ご指示の内容は、難しくてわかりません。 申し訳ないです。 それで、マクロの全文を載せてみます。何かご指示が頂ければ幸いです。 Sub データ移動x() Application.ScreenUpdating = False 'ウィンドウの切り替わり停止 パス = ActiveWorkbook.Path ' アクティブウィンドウのブックのパス Workbooks.Open Filename:=(パス & "\2.利用者.xlsx") 'ブックを開く Workbooks("1.協力者.xlsm").Activate '協力者のブックを開く協力者数 = ActiveWorkbook.Worksheets.Count '協力者の人数調べ For 協力者 = 1 To 協力者数 '協力者の人数だけ繰り返す Workbooks("1.協力者.xlsm").Activate '協力者のブックを開く Sheets(協力者).Select 行 = 10 '内容の最初の行 Do While Cells(行, 3) <> "" '利用が無ければ次の協力者へ '**** 利用者番号から名簿を使い利用者名を調べる **** Dim 範囲 As Range Set 範囲 = Worksheets("名簿").Range("E3:F361") 列番号 = 2 '名簿の名前欄 利用者番号 = Worksheets(協力者).Cells(行, 18) 利用者名 = Application.WorksheetFunction.VLookup(利用者番号, 範囲, 列番号, False) Windows("2.利用者.xlsx").Activate '利用者のブックに移動 For I = 1 To ActiveWorkbook.Worksheets.Count 'ワークシートの数だけ繰返す MsgBox "利用者番号 " & 利用者番号 & " " & Worksheets(I).Name & " シート番号" If 利用者番号 = Worksheets(I).Name Then MsgBox "一致した" GoTo nextriyou '利用者番号のシートはあるか? End If Next Sheets("1").Copy After:=Sheets("1") 'アクティブシートの後へ追加する ActiveSheet.Name = 利用者番号 'シート名 Range("N6") = 利用者名 '利用者の名前を貼り付け Nextriyou: Workbooks("1.協力者.xlsm").Activate '協力者のブックを開く Sheets(協力者).Select '協力者のシートへ移動 行 = 行 + 1 Loop Next End Sub

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

> 数値は何度も一致してるのを確認しています。 もう一度、確認してみてください。 IF文が「一致しない」としているから、データの問題ですよ。 F9でブレーク設定してあるなら、変数にマウスを載せると値がTipで表示されます。 「いきなり一致する」=「最初のシート名が一致する」条件を指定して実行して、 最初にIF文で停止したときに、条件文をイミディエイトウィンドウにコピーしてみてください。 ?会員No         で[Enter] ?Worksheets(I).Name    で[Enter] ?会員No = Worksheets(I).Name  で[Enter] 上2つが「一致するデータ」であれば3番目はTrueになるはず。 これが上2つが「一致するデータ」なのに3番目がFalseなるなら 思わぬ余白があるとか、全角半角の差異がある、など。 余白なら If 会員No = Worksheets(I).Name Then を If Trim(会員No) = Trim(Worksheets(I).Name) Then にしてみるとか対策ありますが、全半角だと難しいかも。

hotlinez
質問者

お礼

何度もすみません。 >思わぬ余白があるとか、全角半角の差異がある、など。 私もその事が気になり、フォントや書式を変えてみました。表示形式では「標準」や「数値」 配置では「標準」「中央」等々、 それから、すみませんが「F9でブレーク」と言うのがわかりません。ご指示通りに書いてF9を押下したのですが、何も変化しません。全く教えてもらったことも、出来なくて恥ずかしい限りです。 また気が向かれたら教えてください。

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

この書き方だと、Forループ終了時には必ず MsgBox "不一致" を通るので不一致が表示されることは「正しい」ですね。 会員No がどのようにして与えられているか、見えないのですが 「一致した」の直前のIF文で、本当に値が一致していますか? (本当に会員No.と一致するシート名がありますか?) IF文にELSEを付け足して、IF文の行でF9キー押下してブレーク設定して、F8でStep実行させて見ては? Dim str判定 as string str判定="不一致" For I = 1 To ActiveWorkbook.Worksheets.Count 'ワークシートの数だけ繰り返す  MsgBox 会員No & Worksheets(I).Name  If 会員No = Worksheets(I).Name Then   MsgBox "一致した"   str判定="一致した"  else   MsgBox "中間報告としての不一致"  End If Next MsgBox str判定

hotlinez
質問者

お礼

  ご指導ありがとうございます。 指示通りやってみましたが、 一致した と出ません。 数値は何度も一致してるのを確認しています。 どうもお世話になりました。

関連するQ&A

  • Excelでfor文とif文の操作をしたいです

    Excelについての質問です。 Excelで、画像のようにシート1のA列にアルファベットと数字のデータがあり(重複はありません)、B列に1~5の数字が入っているとします。 この時、シート2のB列に、シート2のA列で指定したものと一致する、シートAのB列の値を入力したいです。 (この例の場合、上から順に5、4、1です) プログラミング言語でいう、いわゆるfor文とif文の併用で for(i=1;i<4;i++){ for (j=1;j<8;j++){ if(シート1のセルAj==シート2のセルAi){   シート2のセルBiにシート1のセルBjを値を入れる   ループを抜ける } } } というような感じになると思います。(間違っていたら申し訳ないです。) こういった処理は、Excelのマクロで可能でしょうか? また、できればどうすれば実現できるか、教えていただけると助かります。 よろしくお願いいたします。

  • マクロif文での条件式について

    マクロ初心者です。Excel2003を使用しています。 仕事上で使用しているエクセル表より、ある値以上の項目を抽出し、その値を用いて計算結果を出すためのマクロを作成いたしました。いろいろなサイトを参考にして自分なりに書いてみたのですが、どうしてもうまくいきません。 表は簡単なもので、以下のようなものです。 1 9 2 24 3 45 4 67 1列目は使用濃度、2列目は測定値です。この測定値が30より大になった項目を抽出し、計算式にその値を代入し計算結果として出したいのです。また、全ての測定値が30以下だった場合は、計算結果の欄に”<30”とのように表示をさせたいと考えています。 以下のようにマクロを書いてみました。 Sub Macro1() For i = 1 to 4 if Worksheets("sheet1").cells(i , 2).value <=30 then Range("A5")=0 '測定値が=<30だった場合は計算をしないので、フラグとして値を入力 Elseif Worksheets("sheet1").cells(i , 2).value > 30 then Range("A5")=Cells(i , 1) Range("B5")=Cells(i , 2) Exit for Endif if Worksheets("sheet1").Range("A5").value > 0 then Range("A6").Formula ="=(50-B5) / A5" Elseif Worksheets("sheet1").Range("A5").value = 0 then Range("A6") ="<30" Else Endif Next i End Sub >30だった項目の抽出まではできたのですが、計算値をだすところがどうしてもうまくいかず、A6セルにはどんな値でも”<30”と入力されてしまいます。 マクロの基本的なルールなどがまだまだ未熟なので、基本的な構文も書けていないと思います。 全然方向性が違うかもしれないので、そういった点も含めてご教示いただけたら幸いです。 分かりにくいかもしれませんが、どうぞよろしくお願いいたします。

  • アクティブのブックのインデックスを知るプロパティ

    アクティブのブックをインデックスを取得する方法が知りたいのですが、 シートの activesheet.index のような、アクティブブックのインデックス番号を知ることができるプロパティはないでしょうか? 次のようなマクロを使って取得する方法は思いついたのですが、できればプロパティなど簡潔な文で 取得したいのです。 Public Sub tset() Dim i, s For i = 1 To Workbooks.Count If Workbooks(i).Name = ActiveWorkbook.Name Then s = i Next MsgBox s End Sub

  • IF 分岐処理がうまくできません

    エクセルVBAで、分岐がうまくできません。 A、B,Cのリンゴとみかんの3種類の仕入れパターンがあり仕入の数量を算出したいですが、適正値が算出されません。 どのようにしたら、適正値を算出できるにのか教えてください。 Sub 仕入計算() Dim i As Integer 'A リンゴは、500以下になったら1000個になるように仕入 'A みかんは、500以下になったら1000個になるように仕入 i = 2 Do While Worksheets("sheet1").Cells(i, 1) <> "" If Cells(i, 1) = "A" And Cells(i, 2) <= 500 Or Cells(i, 3) <= 500 Then Worksheets("sheet1").Cells(i, 4) = 1000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 1000 - Cells(i, 3) End If i = i + 1 Loop 'B リンゴは、400以下になったら2000個になるように仕入 'B みかんは、400以下になったら2000個になるように仕入 i = 2 Do While Worksheets("sheet1").Cells(i, 1) <> "" If Cells(i, 1) = "B" And Cells(i, 2) <= 400 Or Cells(i, 3) <= 400 Then Worksheets("sheet1").Cells(i, 4) = 2000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 2000 - Cells(i, 3) End If i = i + 1 Loop 'C リンゴは、300以下になったら3000個になるように仕入 'C みかんは、300以下になったら3000個になるように仕入 i = 2 Do While Worksheets("sheet1").Cells(i, 1) <> "" If Cells(i, 1) = "C" And Cells(i, 2) <= 300 Or Cells(i, 3) <= 300 Then Worksheets("sheet1").Cells(i, 4) = 3000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 3000 - Cells(i, 3) End If i = i + 1 Loop End Sub 結果は以下になってしまいます。 id  りんご みかん りんご仕入 みかん仕入 A 500 700   500 300 A 400 600 600 400 A 300 500 700 500 A 300 400 1700 1600 A 200 300 2800 2700 A 100 200 2900 2800 B 500 400 1500 1600 B 400 600 1600 1400 B 340 500 1660 1500 B 260 400 1740 1600 B 180 300 2820 2700 B 100 200 2900 2800 C 200 700 2800 2300 C 500 200 2500 2800 C 300 500 2700 2500 C 200 400 2800 2600 C 100 300 2900 2700 C 100 200 2900 2800 Cは、適正値ですが、A,Bの1部の計算ができません。

  • if文について

    Excel 2007 VBAを使用しています。 ↓のクリックイベントを実行するとif文のところで不具合があります。 商品シートのC列には、状況が保存されています。 該当した年月、"受取済み"、"注文中"以外の行データをリストさせます。 商品シートのJ列、W列には、該当した年月、"受取済み"、"注文中"以外の行データが存在するのですが、まったく検出してくれません。 対処方法を教えてくれませんか? ------------------------------------------- Option Explicit Private Sub CB1_Click() '変数を定義 Dim i As Long Dim maxRow As Long Dim inSheet As Worksheet Dim outSheet As Worksheet '入出力先のシートをオブジェクト変数へ格納 Set inSheet = Worksheets("商品") Set outSheet = Worksheets("結果") 'テキストボックスの内容を判定 If (Me.TextBox21.Value = "") Or (Not IsDate(Me.TextBox21.Value)) Then MsgBox "日付が入力されていません" Exit Sub End If '最終行番号を取得 maxRow = Me.Cells(Rows.Count, "A").End(xlUp).Row '商品シートの最終行番号で分岐処理 If maxRow > 3 Then '出力先を削除してヘッダーをコピー outSheet.Cells.Delete inSheet.Range("A3").EntireRow.Copy outSheet.Range("A1") Application.CutCopyMode = False Else '4行目以降にデータが入力されていなければメッセージで終了 MsgBox "該当データがありません" Exit Sub End If '4行目から最終行まで繰り返し For i = 4 To maxRow 'J列が日付であれば処理 If IsDate(inSheet.Cells(i, "J").Value) Then '--------機能しない箇所(開始) If Year(inSheet.Cells(i, "J").Value) <= Year(Me.TextBox21.Value) And _ Month(inSheet.Cells(i, "J").Value) <= Month(Me.TextBox21.Value) And _ CStr(inSheet.Cells(i, "W").Value) <> "受取済み" And CStr(inSheet.Cells(i, "W").Value) <> "注文中" Then '--------機能しない箇所(終了) inSheet.Rows(i).Copy outSheet.Rows(cnt + 2) End If End If Next i End Sub

  • IF文について

    A以上B以下という処理条件を記述しているんですが、この以外のものが来たらIF文を出るようにしたいんですが、どのように記述すれば良いのでしょうか? マクロだと、確か"Exit ~"で抜けれたと思うんですが、どなたか教えて下さい。

  • if文の中のif文・・・について

    質問させていただきます。 if文の中のif文の記述の仕方について質問があります。 例えば if ( x > 0 ){ a = b+c; if ( a > 1) d = e+f; ・・・1 if ( a < 1) d = e-f; ・・・2 if ( a = 1 ) d = 1-g; ・・・3 } h = d + i; aが1より大きい場合は、1の処理を、aが1より小さい場合は2の処理を、aが1と同じであった場合、3の処理をして最終的に、h = d + i;の式の d に代入して h を求めたいと思っているのですが、うまくゆきません。 if文の中のif文の記述はどのようにすればよいのでしょうか? よろしければご教示よろしくお願いします。

  • if文の演算子について

    if文の演算子について int a=0,b=1,c=1,d=1; if(a==1 && b==1 && c==1 ||d==1){ Printf("yes"); }else{ Printf("no"); } if((a==1 && b==1 && c==1 )||d==1){ Printf("yes2"); }else{ Printf("no2"); } } 上記のif文で出力結果が異なります。 if((a==1 && b==1 && c==1 )||d==1)の方はa=1、b=1、c=1の時もしくはd=1の時と 理解できるのですが、 if(a==1 && b==1 && c==1 ||d==1)の方は、どういう条件の時が当てはまるのでしょうか?

  • Excel VBA if文 マクロ強制終了するには?

    現在 2つのbookがあります。 ・データ data.xls ・集計 total.xls ★条件は以下 ・この2つのbookには同じ名前の 『sheet名・数』が情報保持しています。 ・sheet名は不特定の名前が付けられています。 ★処理したいマクロ内容 ・data.xls …の各sheet と total.xls 各sheet参照させて マッチしたら処理。 マッチしなかったらマクロ強制終了。 Sub match() Dim i As Integer For i = 1 To Worksheets.Count '任意のbookを指定します Windows("data.xls").Activate sheet_copy = ActiveSheet.Name Sheets(sheet_copy).Select '範囲を選択 コピーします Range("C2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy On Error Resume Next '---前後にシートが無い場合のエラーを無視 ActiveSheet.Next.Select '任意のbook と sheet を指定します Windows("total.xls").Activate sheet_paste = ActiveSheet.Name Sheets(sheet_paste).Select Range("D2").Select If sheet_copy = sheet_paste Then ActiveSheet.Paste ActiveSheet.Next.Select Else MsgBox "sheet miss match error!" '★マクロ強制終了 End If Next i End Sub ★部分に何と記述すればよろしいでしょうか? アドバイスお願い致します。

  • If文で≠の方法は?

    Visual Basic 2003 を使っています。 If文で、 If (A = Me.TextBox1.Text) And ・・・ Then・・・ のように、「=」はできるのですが、「=でないとき」はどうすればいいのでしょうか? AはTextbox1と一致・Bはtextbox2と一致しない・cはtextbox3と一致の場合は○○、 AはTextbox1と一致・BはTextbox2と一致・CはTextbox3と一致しない場合は■■・・・のような条件式を作りたいんです。 調べてはみたのですが、見当たらなくて・・・。 分かる方がいらしたら、教えてください! (もし無理な場合もそう教えていただけると嬉しいです。他の方法を考えるか、諦めます。)

専門家に質問してみよう