[[20210118163459]] 『exit subのとび先(ファイルを開かないときは作業』(せれん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『exit subのとび先(ファイルを開かないときは作業を中断)』(せれん)

googleから式をコピペしているだけの初心者です。

以下のようなマクロを作っているのですが、
ファイルを選択しなかったときに☆にとんでほしいのですが、
すぐ下の行の
Workbooks.Open Filename:=Excelfile, Password:="×××"
を実行しようとしています。
どのようにすればよいのでしょうか。
Exit subがよくわかっていないのですが、elseの作業をとばしてくれるわけではないのでしょうか。

Sub ファイルを選択してコピペする

With Application

    .ScreenUpdating = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
    .CutCopyMode = False
    .DisplayAlerts = False
End With

'ファイルを選択して開く
Dim Excelfile
Excelfile = Application.GetOpenFilename(Title:="選択して下さい。") '選択ボックスを立ち上げ、選んだファイルの名前を取得する

If TypeName(Excelfile) = "boolean" Then 'ファイルが選択されなければ
Exit Sub '処理を終了する
Else
Workbooks.Open Filename:=Excelfile, Password:="×××"
'選択ボックスで選んだ名前のファイルを開く

 Set Excelfile = ActiveWorkbook
 
End If

☆With Application

    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = xlCalculationAutomatic
    .CutCopyMode = True
    .DisplayAlerts = True
End With

End Sub

< 使用 Excel:Excel2019、使用 OS:Windows10 >


[[20210115133238]] 『罫線を反映させずに値貼り付け』(せれん) >>BOT
 こちらは解決されました?

 ご質問の内容ですが、Exit Subはプロシージャそのものを抜けます。
 Ifを抜ける方法は、何もしなければ、最後まで実行されます。

 With Application〜〜の内容については、処理の前後に挟むのが一般的かと思います。

    Sub ファイルを選択してコピペする()
        Dim Excelfile As String
        Dim Excelfile As Workbook

        'ファイルを選択して開く
        '選択ボックスを立ち上げ、選んだファイルの名前を取得する
        Excelfile = Application.GetOpenFilename(Title:="選択して下さい。")

        If Not Excelfile = "False" Then 'ファイルが選択されていれば
            With Application
                .ScreenUpdating = False
                .EnableEvents = False
                .Calculation = xlCalculationManual
                .CutCopyMode = False
                .DisplayAlerts = False
            End With
            'ファイルを開いて、変数にセットする
            Set Excelfile = Workbooks.Open(Filename:=Excelfile)  ', Password:="×××"

            'いろんな処理をして

            '締め処理
            With Application
                .ScreenUpdating = True
                .EnableEvents = True
                .Calculation = xlCalculationAutomatic
                .CutCopyMode = True
                .DisplayAlerts = True
            End With
        End If
    End Sub

(稲葉) 2021/01/18(月) 16:54


ご返信ありがとうございます。
何点か伺いたいのですが、
?@
Dim Excelfile As String
Dim Excelfile As Workbook
のように定義は2つできるのでしょうか。

?AExit Subはプロシージャそのものを抜けます。
とは、どこにとぶということでしょうか。

?BIfを抜ける方法は、何もしなければ、最後まで実行されます。
ifに当てはまるときでもelseの作業を実行するのでしょうか。
ファイルを開かないときにはthenにとび、elseはしない。
ファイルを開くときにはelseにとぶのイメージを持っています。
(せれん) 2021/01/18(月) 17:07


 × If TypeName(Excelfile) = "boolean" Then
 ○ If TypeName(Excelfile) = "Boolean" Then

 = なので、大文字小文字も正確でなくてはいけません。
 条件が成立してません。
(とおりすがり) 2021/01/18(月) 17:09

 >のように定義は2つできるのでしょうか。 
 定義は私の知る限りいくらでもできます。
 逆に、定義をしないほうが、トラブルの温床になりますので、これから勉強される場合は
 まず変数宣言の強制設定をお勧めします。
https://www.vba-ie.net/foundation/structure.php

 >Exit Subはプロシージャそのものを抜けます。 
 >とは、どこにとぶということでしょうか。 
 飛ぶという表現が正確かわかりませんが、「End Subに飛ぶ」とお考えいただければ理解できると思われます。
 Sub 〜 End SubをSubプロシージャといい、一つの区切りです。
https://www.vba-ie.net/foundation/structure.php

 >ifに当てはまるときでもelseの作業を実行するのでしょうか。 
 実行しません。

 >ファイルを開くときにはelseにとぶのイメージを持っています。
 IfはTrueの場合、Thenの後を実行し、Falseの場合、ElseがあればElseを実行します。
 ですので、私が提示したコードの場合、Elseを使用してなくとも、ブックを開いていると思います。

 以下のテストを準備しました。
 a = 1 の数値を変更して、F8を押してステップ実行してみてください。
https://www.239-programing.com/excel-vba/basic/basic023.html

    Sub test()
        Dim a As Long
        a = 1
        If a = 1 Then
            MsgBox "aは1です"

        ElseIf a = 2 Then
            MsgBox "aは2です"

        Else
            MsgBox "aは1でも2でもありません"

        End If
        MsgBox "処理が完了しました"
    End Sub

(稲葉) 2021/01/18(月) 17:33


稲葉様、詳しくご解説いただきありがとうございました。

通りすがり様、誤りのご指摘ありがとうございます。
大文字記載でなかったのでifが働いていなかったのですね。
なのでファイルを開かない場合でもelseの後の作業を実行しようとしてしまっていたのですね、
理解できました。

お二方ともありがとうございました。
(せれん) 2021/01/18(月) 17:47


 横から失礼します。

 >通りすがり様、誤りのご指摘ありがとうございます。

 回答付けてくれたのは「とおりすがり」さんですね。
(OK) 2021/01/18(月) 18:10

| Dim Excelfile As String
| Dim Excelfile As Workbook
| のように定義は2つできるのでしょうか。
二つ定義したい理由は何ですか?
実行したらわかると思うが、コンパイルエラーになりますよ。
これは仕様だから変えられない。

[[20210115133238]] 『罫線を反映させずに値貼り付け』(せれん) >>BOT
| こちらは解決されました?
回答を無視する理由はなんですか?
質問したのをすっかり忘れているとかですか?
なんらかの返事くらいするのが最低限の礼儀と思う。
 
(γ) 2021/01/18(月) 21:18


 γさん せれんさん ごめんなさい
 私の確認漏れでした。

 >Excelfile = Application.GetOpenFilename(Title:="選択して下さい。")
 と
 >If TypeName(Excelfile) = "boolean" Then 'ファイルが選択されなければ 
 みて、別の文字列だと思い込みコピペしただけで、チェックしておりませんでした。

 申し訳ないです。

(稲葉) 2021/01/19(火) 08:37


プログラムを書くときは
書く前に処理の手順をしっかり考えましょう。

 >ファイルを選択しなかったときに☆にとんでほしいのですが、

Goto文で飛んでもいいですが、
美しくないので、飛ばなくてもいいように、手順を再考してみてください。

Sub ファイルを選択してコピペする()

    Dim strFullPath As String
    Dim wbk As Workbook

    'ファイルを選択しフルパス(文字列)を取得
    strFullPath = Application.GetOpenFilename(Title:="選択して下さい。")
    'Falseならプログラムを抜ける
    If strFullPath = "False" Then Exit Sub

    '準備
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    'ファイルを開く
    Set wbk = Workbooks.Open(Filename:=strFullPath, _
                            UpdateLinks:=False, _
                            ReadOnly:=True, _
                            Password:="×××")
    'セルのコピー
    wbk.Sheets(1).UsedRange.Copy ThisWorkbook.Sheets(1).Range("A1")
    'ファイルを閉じる
    wbk.Close False

    '後片付け
    Application.EnableEvents = True
End Sub

GetOpenFilenameは、
ファイルのフルパスを返すだけで、ファイルを開いているわけではありません。
なので、それより前に何もしてなければ、そのままプログラムを抜ける(終了する)と良いです。

.ScreenUpdating のプロパティはプログラムが終了すると勝手にTrueになるので、
最後の処理としては書かなくても問題ありません。
.CutCopyModeのプロパティもプログラム終了後、セルの枠が点滅しているのが
気にならないなら書く必要がありません。
今回の場合は、コピー元のブックは閉じるのですから書かなくても問題ないかと思われます。
(使い方もおかしいし)
.Calculation = xlCalculationManualも再計算が行われないなら意味がないかと思います。
万全を期すなら書いておいても問題ないです。

余分なことは書いてない方が個人的に好きではない(あとで読みにくくなる)ですが、
分からないなら、書いておいてもいいかもしれません。
(まっつわん) 2021/01/19(火) 12:04


必要なことは、皆さんが仰っているとおりなので省略するとして、ややこしくなりますのでお勧めはしませんが最初に提示されたようにExcelfileをVariant型(なんでも型)にしてしまえば、使い回しも可能ですね。
    Sub さんぷる()
        Dim Excelfile As Variant

        '▼ファイルが選択されたときはファイルのフルパス(String型)、選択されなかったときはFalse(Boolean型)になる
        Excelfile = Application.GetOpenFilename(Title:="選択して下さい。")

        '▼False(Boolean型)ならファイル選択されなかったということなので終了させる
        If Excelfile = False Then
            MsgBox "ファイルが選択されませんでした"
            Exit Sub
        End If

        Application.ScreenUpdating = False
        Application.EnableEvents = False
        Application.Calculation = xlCalculationManual

        '▼セットした段階でWorkbook型(オブジェクト型)になる
        Set Excelfile = Workbooks.Open(Filename:=Excelfile, Password:="×××")
        With Excelfile
            MsgBox .Name & " に対してやりたいことを書く"
        End With
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        Application.Calculation = xlCalculationAutomatic
    End Sub

(もこな2) 2021/01/19(火) 14:53


↑画面更新の抑制等の位置がおかしかったのを修正しました。

(もこな2) 2021/01/20(水) 01:54


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.