Excel VBAのコードのエラーについて
- Excel2010使用でVBAのコードを書いている際、特定の部分をコメントアウトするとエラーが出ます。コメントアウトしない場合は正常に動作します。なぜエラーが出るのか理由がわかりません。
- エラーが出る部分は、If文とEnd Ifの間のコメントアウトされた部分です。この部分をコメントアウトすると、「Elseに対応するIfがありません」というエラーが出ます。
- また、ほとんど同じ記述の後半ではエラーが出ないため、何か勘違いをしているのかもしれません。どなたか解決策を教えていただけると助かります。
- ベストアンサー
End Ifは不要な場合もある?
Excel2010使用で下記のVBAのコードを書きました。 Sub イフとエンドイフは組ではなかったのか() Dim Flag As Boolean Dim S As Worksheet For Each S In Worksheets If S.Name = "合計" Then Flag = True ' Else ' Flag = False ' End If Next S If Flag = True Then MsgBox "「合計」というシートはすでに存在します" Else Worksheets(1).Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = "合計" End If End Sub 前半の >' Else >' Flag = False >' End If の部分があると「Elseに対応するIfがありません」というエラーが出ます。 Elseに関する記述だけをコメントアウトすると「End Ifに対応するIfブロックがありません」というエラーが出ます。 この部分をコメントアウトすればきちんと動作するのですが、If文はちゃんと存在しているにもかかわらず、またほとんど同じ記述の後半ではエラーが出ないというのに、なぜこのようなエラーが出るのかわかりません。 なにか勘違いをしているのでしょうか。
- Angela_M
- お礼率100% (29/29)
- Excel(エクセル)
- 回答数2
- ありがとう数5
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
VBAでは、ifから始まる文を1行で書くと、if~thenの一つの命令と 解釈されます。すなわち If S.Name = "合計" Then Flag = True これで一つの命令になってしまい、次の行以降はif~endifのブロック とはみなされないんです。ブロックにしたい場合は、必ず「then」の後ろ を空欄にしないといけません。すなわち If S.Name = "合計" Then Flag = True else : : と書く必要がある・・・ということです。
その他の回答 (1)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
× If S.Name = "合計" Then Flag = True O If S.Name = "合計" Then Flag = True
お礼
ありがとうございます。 おっしゃる記述できちんと動作しました。 Thenのあとにそのまま記述を続ける場合と改行後に記述する場合とで扱いが違うのですね。
関連するQ&A
- エクセル IF について!
UserForm上にTextBoxとコマンドボタンがあり、TextBoxに数字を入れコマンドボタンをクリックすると'A.xlsをセットしてAシートの使用行を格納し検索して他のTextBoxにも反映させていくやり方でマクロを記述しています。そこでTextBoxに入力した数字がない場合はMsgBox”この数字はありません”という形にしたいのですが・・・どのようにすれば良いのか教えて下さい。 If Me.Controls("TextBox1" & Cnt).Value = "" Then MsgBox "呼出したい数字を入力して下さい" Exit Sub End If Set wbMyBook = Workbooks(ThisWorkbook.Name) If MsgBox("以前の記録を呼び戻しますか?", vbOKCancel) = vbOK Then Application.ScreenUpdating = False strMyBookPath = ThisWorkbook.Path If Dir(strMyBookPath & "\" & k1Name) <> "" Then 'あった場合そのブックが空いているか確認する。 flag = False For Each wb In Workbooks '開いていればTrue,開いていなければFalseを設定 If wb.Name = k1Name Then flag = True Exit For End If Next wb 'ブックが開いていなかった場合、ブックを開ける。 If flag = False Then Workbooks.Open strMyBookPath & "\" & k1Name End If Set k1 = Workbooks(k1Name) Set SH1 = k1.Worksheets("Sheet1") Else MsgBox WDName & "が存在していません。設置してください。", vbExclamation, "確認してください" Exit Sub End If lngYcnt_K = SH1.UsedRange.Rows.Count flag = False For lng = 1 To lngYcnt_K If CStr(TextBox1.Text) = CStr(SH1.Cells(lng, 1)) Then flag = True lngNumber = lng Exit For End If Next lng If flag = True Then TextBox3.Value = SH1.Cells(lngNumber, 2) '氏名 End If If SH1.Cells(lngNumber, 3) = "男" Then OptionButton1.Value = True ElseIf SH1.Cells(lngNumber, 3) = "女" Then OptionButton2.Value = True Else OptionButton1.Value = True OptionButton2.Value = False End If MsgBox " 記録を呼び戻しました" Else MsgBox"確認必要"⇒ここにもし数字が違っていたら表示させたいのですが・・・ End If MsgBox " 以前に記録しましたか?" Application.DisplayAlerts = False k1.Close saveChanges:=True Application.DisplayAlerts = True '-------------------------------------------------------------------------- '画面更新ON Application.ScreenUpdating = False End Sub
- ベストアンサー
- オフィス系ソフト
- もしも新規Excelファイルを開いてる場合は閉じる
Excel2003です・ ユーザーが新規Excelファイル(book1)かテスト用ファイルを開いている場合は閉じる処理を考えております。 Option Explicit Dim ws As Workbook, flag As Boolean Private Sub Workbook_Open() For Each ws In Workbooks If ws.Name = "Book1" Then flag = True Next ws If flag = True Then Workbooks("Book1.xls").Close Else End IF For Each ws In Workbooks If ws.Name = "テスト用.xls" Then flag = True Next ws If flag = True Then Workbooks("テスト用.xls").Close Else End IF End Sub このコードだとBook1を開いているのに、Trueで拾ってくれません。 ws.Name = "Book1.xls"にしても同じです。 どこかおかしい部分があるのでしょうか?
- ベストアンサー
- その他MS Office製品
- エクセル・マクロでIf Thenの使い方
このような質問は、ルール(エチケット、マナー)違反になるでしょうか? もしそうならお許し下さい。 名前ボックスに表示される名前を、マクロで非表示にし、元に戻す、という操作を次の二つのボタンで実行するように作りました。エクセル2003です。 Private Sub CommandButton1_Click() Dim tname As Name For Each tname In ThisWorkbook.Names tname.Visible = False Next End Sub Private Sub CommandButton2_Click() Dim tname As Name For Each tname In ThisWorkbook.Names tname.Visible = True Next End Sub これを一つのボタンで、If Then Elseを使い実行できるようにしたいのですが If ・・・ Then の間の書き方が分からずうまくいきません。 If Names.Visible = False Then If ThisWorkbook.Names.Visible = False Then If ThisWorkbook.tname.Visible = False Then Private Sub CommandButton3_Click() Dim tname As Name If Names.Visible = False Then 'これでは駄目 For Each tname In ThisWorkbook.Names tname.Visible = False Next Else For Each tname In ThisWorkbook.Names tname.Visible = True Next End If End Sub 苦し紛れにこんなことをやってごまかそうとしているのですがこれって邪道ですしかっこうわるいですよね。 Private Sub CommandButton3_Click() Dim tname As Name If Range("g1").Value = " " Then For Each tname In ThisWorkbook.Names tname.Visible = False Next Range("g1").Value = "1" Else For Each tname In ThisWorkbook.Names tname.Visible = True Next Range("g1").Value = " " End If End Sub ど素人ですがよろしくご教導ください。
- ベストアンサー
- オフィス系ソフト
- Excel VBA 指定シートの有無確認
指定した名前のシートがあるかないか判断させてますが、 以下のやりかたでは、 グラフ作成したシートを認識してくれません。 そのようにすれば良いでしょうか? Dim ws As Worksheet, flag As Boolean For Each ws In Worksheets If ws.Name = "シート" Then flag = True Next ws If flag = True Then msgbox "あります Else Sheets.Add ActiveSheet.Name = "シート" End If
- ベストアンサー
- Visual Basic
- Internet Explorerの起動状態をチェック
IEが起動中の時はそれを使い、未起動の場合は新規に作成する、、、というのがしたくて次のようなコードをつくってみました。 ところが、 Set myIE = myShellwindows のところでエラーになります。 これを防ぐにはどのようにするといいのでしょうか? Sub Set_IE() Dim myIE As Object Dim myShellwindows As Object Dim myObject As Object Dim Flag As Boolean Set myShellwindows = CreatmyObject("Shell.Application").Windows() Flag = False For Each myObject In myShellwindows If TypeName(myObject) = "IWebBrowser2" Then Flag = True Exit For End If Next If Flag = True Then Set myIE = myShellwindows Else Set myIE = CreatmyObject("InternetExplorer.application") myIE.Visible = True End If Set myShellwindows = Nothing Set myIE = Nothing End Sub
- ベストアンサー
- Visual Basic
- アクセスIfブロックに対応するEnd Ifエラ-
こんにちは。 アクセスで各レコードの印刷部数がそれぞれ異なるため、各レコードに入力した(フォームから)部数指定で 看板を印刷するようVBAを入力したところ。。。フォーマット時の方でIfブロックに対する End Ifがありませんとコンパイルエラーが出てEnD Ifが反転しています。 VBA初心者で、このVBA事態もネットで調べてコピペしたもので。。。エラー事態を自力で直せません。。。宜しくお願いいたします。 レポートの詳細にテキストボックスを置き名前-[cut]/可視-[いいえ[/コントロールソース-[=1]/ 集計実行-[グループ全体] 詳細のプロパティ Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) Dim 指定枚数 As Integer 指定枚数 = Forms![フォーム名]![部数指定フィールド名] If IsNull([cut]) Then [cut] = 1 If [cut] <> 指定枚数 Then Me.NextRecord = False Me.MoveLayout = True Me.PrintSection = True End If End Sub Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer) Dim 指定枚数 As Integer 指定枚数 = Forms![フォーム名]![部数指定フィールド名] If [cut] <> 指定枚数 Then [cut] = [cut] + 1 Else: [cut] = 1 End If End Sub 宜しくお願いいたします。
- ベストアンサー
- Windows 7
- if文からcase文への置き換え
ピクチャボックスをクリックしたら、チェック ボックスがチェックされるメソッドを作りたいと 思っています。 Private Sub PictureBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click,PictureBox2.Click 'ここから If sender Is PictureBox1 Then If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If ElseIf sender Is PictureBox2 Then If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End If 'ここまで End Sub 上記のif文をCase文に置き換えたくて、 'ここから Select Case sender Case PictureBox1 If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If Case PictureBox2 If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End Select 'ここまで 上記のように書き換えたのですが、エラーが出てしまいます(ビルドは通るのですが)。 Case文の使い方が間違っているんだとは思いますが、どこがどう 間違っているのがよくわかりません。 ご教授いただけないでしょうか?
- ベストアンサー
- Visual Basic
- 印刷後のVBAの実行 (3)
Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name = "Sheet1" Then If Range("D6").Value = "" Then Cancel = True MsgBox ("名前を入力してください") Range("D6").Select Exit Sub End If Else If ActiveSheet.Name = "Sheet2" Then If Range("C11").Value = "" Then Cancel = True MsgBox ("受付時間を入力してください") Range("C11").Select Exit Sub End If Else Exit Sub End If End If If Worksheets("Sheet1").Range("D5") = "不要" Then GoTo P1 ActiveSheet.Range("A70:Y70").Copy If Worksheets("Sheet3").Range("A1").Value = "" Then Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlPasteValues Else Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _ Paste:=xlPasteValues End If Application.CutCopyMode = False P1: ActiveSheet.Range("A1").Select End Sub sheet1のD5に「不要」と入っていたら 24~33行目の作業がキャンセルになりますが sheet2のD5にも「不要」と入っていたら、同じ様にキャンセルできる様に出来ますでしょうか? ご回答お願いします
- 締切済み
- オフィス系ソフト
- IF文の分岐が機能していない?
初めて投稿させて頂きます。宜しくお願いします。 殆どVBA初心者です。 特定のセルに入力すると、シート名を固定のセル(S12)の文字列に変更するコードを書きました。 (S12は他のセルからの参照値を結合したものです。 B2”受注”+P2”5月”=S12”受注5月”がシート名に入ります) ネット検索で参照エラーやシート名の重複エラーを調べて自力で組みましたが、どこかがおかしいようでちゃんと機能していません。 (1)新しいシート名ならばエラーは出ず、シート名の変更が出来る (2)S12がエラー値であれば、シート名は変更されない これは狙い通りなのですが、 (3)重複シート名の場合、(2)を付けて変更する(これはエラーでマクロが止まります) (4)同じシートを何度か名前変更した時に、下のタグに無い名前も重複シートとして認識される この、(3)と(4)でマクロが止まり困っています。 (3)は重複でなければどのような処理でも問題ありません。(4)は(3)がクリア出来れば、あまり弊害はありませんがクリアできたら幸いです。 下記コードのどこが間違っているのか、教えて頂けませんでしょうか? Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim flag As Boolean, s As Variant If Intersect(Target, Range("B2:P2")) Is Nothing Then Exit Sub Else For Each s In Sheets If IsError(ActiveSheet.Range("S12").Value) Then Exit Sub Else If s.Name = ActiveSheet.Range("S12").Value Then Sh.Name = ActiveSheet.Range("S12").Value +"(2)" Exit Sub Else Sh.Name = ActiveSheet.Range("S12").Value Exit Sub End If End If Next s End If End Sub
- 締切済み
- SE・インフラ・Webエンジニア
- エクセルVBAでShapesまたはDrawingObjects
シート上のフォームなどを表示/非表示するためtest04を書きましたが、「実行時エラー438 オブジェクトはこのプロパティまたはメッソッドをサポートしていません」となります。 しかし、Test05のように同じことをForNextで回せばうまくいきます。 また、Test06のようにShapesをDrawingObjectsに書き換えただけでもうまくいきます。 では、Test04がエラーになるのはなぜでしょうか? Sub test04() With ActiveSheet.Shapes If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub Sub test05() For Each sp In ActiveSheet.Shapes If sp.Visible = False Then sp.Visible = True Else sp.Visible = False End If Next End Sub Sub test06() With ActiveSheet.DrawingObjects If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub
- ベストアンサー
- オフィス系ソフト
お礼
なるほど納得です。 前半と後半でThen以降の記述のしかたが違っていたことに気づきませんでした。 For Each S In Worksheets If S.Name = "合計" Then flag = True Else flag = False End If できちんと狙い通りに動作しました。 For Each S In Worksheets If S.Name = "合計" Then flag = True ' Else ' flag = False ' End If では逆にエラーが発生することを確認しました。