• ベストアンサー

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