Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
画面更新がされてしまう
投稿日時: 23/12/20 08:14:02
投稿者: サイタマ

Application.ScreenUpdating = False を指定しているが、保存の為に保存ファイルをアクティブにするとその画面に更新されてしまう。更新されない様にするためにはどうしたらよいか、分る方教えて下さい。宜しくお願い致します。

回答
投稿日時: 23/12/20 10:32:47
投稿者: Suzu

サイタマ さんの引用:
保存の為に保存ファイルをアクティブにすると

 
どうして、
ScreenUpdating = False にしておいて、アクティブにする必要があるのでしょうか?
 
保存? ファイルダイアログを表示したいと言う事でしょうか?
であれば、VBAで 保存ダイアログを表示すれば良いですよ。
 
Sub TEST()
  Dim app As Excel.Application
  Dim wbk As Excel.Workbook
  Dim wst As Excel.Worksheet

  Dim varFilePath As Variant

  Set app = Excel.Application

  '名前をつけて保存ダイアログ
  varFilePath = app.GetSaveAsFilename(FileFilter:="Excelファイル,*.xlsx")

  If varFilePath = False Then
    'ダイアログ キャンセル時 終了
    Exit Sub
  Else
    app.ScreenUpdating = False
    Set wbk = app.Workbooks.Add
    Set wst = wbk.Worksheets.Add
    wst.Range("B2").Value = "TEST"

    wbk.SaveAs varFilePath
    wbk.Close
  End If
End Sub

回答
投稿日時: 23/12/20 18:58:26
投稿者: WinArrow

サイタマ さんの引用:

保存の為に保存ファイルをアクティブにすると

アクティブにしなくても保存できると思いますが、
 
アクティブにする本当の目的は?
 
 

回答
投稿日時: 23/12/20 21:02:36
投稿者: simple

既にコメントいただいているとおりだと思います。
 
もし問題がまだ解決していないのであれば、
事象(想定と異なる動作になってしまう)が再現するコードを示して貰えますか?
一般論でこうなるのが普通です、いやそうならないんです、ということなら
コードを提示していただかないと議論になりません。
 
Sub Test()
から
End Subまで、変数の宣言とか、On Errorなども省略せずに書いてください。
事象再現するできるだけ短いコードを希望します。

投稿日時: 23/12/21 08:31:34
投稿者: サイタマ

コードを開示しました。保存する為、Workbooks(FileName1).Save と ActiveWorkbook.SaveCopyAs ServeSaitaYamaPath & "\" + FileName2 を使い保存しています。その為に SAVE の前に 保存するファイル、
"ネットワークユーザーDataBase.xls" を アクティブ@とA にしています。どうぞ宜しくお願いします。
 
Sub End2()
 
    Dim EndMsg As String
    Dim ServeSaitaYamaPath As String
    Dim FileName1 As String
    Dim FileName2 As String
 
 
    FileName1 = "ネットワークユーザーDataBase.xls"
    FileName2 = "ネットワークユーザーDataBaseLookFile.xls"
 
    Range("A1").Select
    ActiveWindow.FreezePanes = False
    ActiveCell.Activate
    With Application
        .Calculation = xlAutomatic
        .MaxChange = 0.001
    End With
    ActiveWorkbook.PrecisionAsDisplayed = False
    Calculate
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.ScreenUpdating = True
    If ThisWorkbook.Worksheets("CurrentData").Range("ユーザー登録").Value = "閲覧" Then
        Range("注意事項").ClearContents
        Range("ユーザーデータソート範囲1").ClearContents
        ThisWorkbook.Worksheets("CurrentData").Range("ユーザー登録").ClearContents
        GoTo Jump1
    End If
    EndMsg = MsgBox(" 現在の情報を保存しますか ? メニュー に戻ります。", vbYesNoCancel, "保存")
    Application.ScreenUpdating = True
    Application.ScreenUpdating = False
    Select Case EndMsg
        Case vbYes
            Application.ScreenUpdating = False
            ServeSaitaYamaPath = "\\sai02_sv\system"
            Range("A1").Select
            Range("ユーザーデータソート範囲1").Select
            ActiveSheet.Unprotect
            Selection.SortSpecial SortMethod:=xlSyllabary, Key1:=Range("キー部署"), _
                Order1:=xlAscending, Key2:=Range("キーユーザー"), Order2:=xlAscending, Header:=xlGuess, _
                OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
            ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
            Range("A1").Select
            Range("ユーザーデータソート範囲1").Select
            Selection.Copy
            Application.ScreenUpdating = False
            Windows(FileName1).Activate --------------- @
            Sheets("ネットワークユーザー").Select
            Range("部署頭").Select
            Selection.PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
                False, Transpose:=False
            Range("A1").Select
            Application.ScreenUpdating = False
            Windows(FileName1).Activate
            Range("A1").Select
            Application.CutCopyMode = False
            Workbooks(FileName1).Save
ReStart1:
            On Error GoTo ReTry1
            Open ServeSaitaYamaPath & "\" + FileName2 For Binary Lock Read Write As #1
            Close #1
            On Error GoTo 0
            Application.ScreenUpdating = False
            Windows(FileName1).Activate --------------- A
            ActiveWorkbook.SaveCopyAs ServeSaitaYamaPath & "\" + FileName2
            Workbooks(FileName1).Close
            Windows("システムVer20.xls").Activate
            Range("ユーザーデータソート範囲1").ClearContents
            Range("注意事項").ClearContents
            ThisWorkbook.Worksheets("CurrentData").Range("ユーザー登録").ClearContents
            Range("A1").Select
        Case vbNo
            Workbooks(FileName1).Close
            Range("ユーザーデータソート範囲1").ClearContents
            Range("注意事項").ClearContents
            ThisWorkbook.Worksheets("CurrentData").Range("ユーザー登録").ClearContents
            Range("A1").Select
        Case vbCancel
            Range("A1").Select
            Range("認証頭").Select
            ActiveWindow.FreezePanes = True
            Application.ScreenUpdating = False
            Exit Sub
    End Select
Jump1:
    If Range("ActiveSheet") = "Menu1280" Then
        Sheets("Menu1280").Select '18インチ(1280X600) 957ポイント X 429ポイント
        Range("ユーザー登録start") = ""
    ElseIf Range("ActiveSheet") = "Menu1024" Then
        Sheets("Menu1024").Select
        Range("ユーザー登録start2") = ""
    End If
    Range("A1").Select
 
Exit Sub
 
 
ReTry1:
    On Error GoTo 0
    Windows("システムVer20.xls").Activate
    Range("A1").Select
    Application.ScreenUpdating = True
    MsgBox "保存 ファイル に、アクセス が重複しました。1〜2分後 「 OK 」 を クリック して下さい。"
    Application.ScreenUpdating = True
    Application.ScreenUpdating = False
    Resume ReStart1
End Sub

回答
投稿日時: 23/12/21 09:49:40
投稿者: WinArrow

コードに対する感想
 
(1)ブック、シート、セルの指定にActive〜〜が多すぎる。
 Activeworkbook
 Activeworksheet
 ActiveCell
  これらを多用する(意識せずに)使用すると、
 意図しないエラーにつながります。
 コードを読むときにも、常に意識する必要があり、コードを読むのにつかれてます。
 可読性を上げるためにも、極力使用しないことです。
 
→ActivateやSelectメソッドを使わない工夫をお勧めします。
 Workbooks(ブック名)を使えば、Activateしなくても処理可能です。
 必要ならば、オブジェウト変更を使えば、簡略化できます。
  Set BOOK1 = Workbooks(ブック名)
 

投稿日時: 23/12/21 14:39:12
投稿者: サイタマ

いろいろご指導ありがとうございます。
Aファイルのセル情報をBファイルのシートに複写する場合、Activate、Select とか使わずに複写できる別な方法がありましたらご教示ください。宜しくお願い致します。

回答
投稿日時: 23/12/21 15:36:22
投稿者: WinArrow

サイタマ さんの引用:

Aファイルのセル情報をBファイルのシートに複写する場合、Activate、Select とか使わずに複写できる別な方法がありましたらご教示ください。宜しくお願い致します。

 
単純な例
Dim BOOKA As Workbook
Dim WS1 As Worksheet
Dim BOOKB As Workbook
Dim WS2 As Worksheet


    Set BOOKA = Workbooks.Open("D:\パス\Filea.xlsx")
    Set BOOKB = Workbooks.Open("D:\パス\FileB.xlsx")
    
    Set WS1 = BOOKA.Sheets("シート1")
    Set WS2 = BOOKB.Sheets("シート2")
    
    WS2.Range("H10:H12").Value = WS1.Range("B21:B23").Value
    
    BOOKB.Close True
    BOOKA.Close False
    
    Set WS1 = Nothing
    Set WS2 = Nothing
    Set BOOKA = Nothing
    Set BOOKB = Nothing

回答
投稿日時: 23/12/22 12:21:38
投稿者: simple

数年前に、同種の質問(今回とは逆に、Activateが機能しないというものでした)をされていますね。
Excel2000からExcel2016にバージョンアップした直後だということでした。
色々議論したものの解決せず、むりやりMsgBox表示をして実質的にActivateすることにした、とのことでした。
今回も同じ環境(Version等)ですか?
もしそうだとすると、アプリケーション自体になんらかの異常があるのかもしれません。
 
個人的な意見ですが、そうした画面表示、非表示の課題にとりくまれるよりも、
逐一Active,Selectなどを多用する習慣を変更されたほうが、よほど実り多い気がします。
(Range("A1").Selectを頻繁に書いたりすることも含め。前回も同趣旨のコメントが複数の方からありました。)
 
お力になれませんでした。私はこれで失礼します。

投稿日時: 23/12/22 13:43:10
投稿者: サイタマ

いろいろご指導ありがとうございます。
Activate、Select をほぼ外すしてみました。 Case vbYes 以降、実行では、やはり見せたくない
ファイル、FileName1 が見えてしまいます。コメントできる方いらっしゃいましたら、宜しくお願い致します。
 
Sub End2()
     
    Dim EndMsg As String
    Dim ServeSaitaYamaPath As String
    Dim FileName0 As String
    Dim FileName1 As String
    Dim FileName2 As String
 
 
 
    FileName0 = ActiveWorkbook.Name
    FileName1 = "ネットワークユーザーDataBaseV2.xls"
    FileName2 = "ネットワークユーザーDataBaseLookFileV2.xls"
 
    Range("A1").Select
    ActiveWindow.FreezePanes = False
    With Application
        .Calculation = xlAutomatic
        .MaxChange = 0.001
    End With
    Calculate
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    If ThisWorkbook.Worksheets("CurrentData").Range("ユーザー登録").Value = "閲覧" Then
        Range("注意事項").ClearContents
        Range("ユーザーデータソート範囲1").ClearContents
        ThisWorkbook.Worksheets("CurrentData").Range("ユーザー登録").ClearContents
        GoTo Jump1
    End If
    EndMsg = MsgBox(" 現在の情報を保存しますか ? メニュー に戻ります。", vbYesNoCancel, "保存")
    Select Case EndMsg
        Case vbYes
            ServeSaitaYamaPath = "\\sai02_sv\サイタ山積\system"
            Range("A1").Select
            Range("ユーザーデータソート範囲1").Select
            Sheets("ネットワークユーザー").Unprotect
            Selection.SortSpecial SortMethod:=xlSyllabary, Key1:=Range("キー部署"), _
                Order1:=xlAscending, Key2:=Range("キーユーザー"), Order2:=xlAscending, Header:=xlGuess, _
                OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
            Workbooks(FileName1).Sheets("ネットワークユーザー").Range("ユーザーデータ範囲1").Value = Workbooks(FileName0).Sheets("ネットワークユーザー").Range("ユーザーデータソート範囲1").Value
            Application.ScreenUpdating = False
            Workbooks(FileName1).Save
ReStart1:
            On Error GoTo ReTry1
            Open ServeSaitaYamaPath & "\" + FileName2 For Binary Lock Read Write As #1
            Close #1
            On Error GoTo 0
            Application.ScreenUpdating = False
            Workbooks(FileName1).SaveCopyAs ServeSaitaYamaPath & "\" + FileName2
            Workbooks(FileName1).Close
            Range("ユーザーデータソート範囲1").ClearContents
            Range("注意事項").ClearContents
            ThisWorkbook.Worksheets("CurrentData").Range("ユーザー登録").ClearContents
        Case vbNo
            Workbooks(FileName1).Close
            Range("ユーザーデータソート範囲1").ClearContents
            Range("注意事項").ClearContents
            ThisWorkbook.Worksheets("CurrentData").Range("ユーザー登録").ClearContents
            Range("A1").Select
        Case vbCancel
            Range("A1").Select
            Range("認証頭").Select
            ActiveWindow.FreezePanes = True
            Application.ScreenUpdating = True
            Exit Sub
    End Select
Jump1:
    If Range("ActiveSheet") = "Menu1280" Then
        Sheets("Menu1280").Select '18インチ(1280X600) 957ポイント X 429ポイント
        Range("ユーザー登録start") = ""
    ElseIf Range("ActiveSheet") = "Menu1024" Then
        Sheets("Menu1024").Select
        Range("ユーザー登録start2") = ""
    End If
    Range("A1").Select
 
Exit Sub
 
 
ReTry1:
    On Error GoTo 0
    Windows(FileName0).Activate
    Range("A1").Select
    MsgBox "保存 ファイル に、アクセス が重複しました。1〜2分後 「 OK 」 を クリック して下さい。"
    Resume ReStart1
End Sub

回答
投稿日時: 23/12/22 15:27:58
投稿者: Suzu

サイタマ さんの引用:
Activate、Select をほぼ外すしてみました。

 
ほぼ ではなく、基本全て外せるはずです。
 
Range(〜〜) の様な書き方ですと、アクティブシートの Range(〜〜) が対象となります。
 
ワークシート名や、Range の名前付き定義範囲 も File0〜File2 で重複するのではありませんか?
その場合、アクティブな ブック、シートの Rangeに対し操作されるので
いちいち Active にし、その後、操作を行っています。
 
ではなく、
きちんと上位オブジェクトを明確に指示すれば、ワークシートをアクティブにしたり
Range を Select しなくとも、操作できるのです。
 
それが、先の WinArrow さん の回答の意図です。
 
それを踏まえ、コードの見直しを行ってみてください。
 
変に Select をしなくなれば、Book1 が アクティブにならないかもしれませんよ。
 
 
直接関係ないと思われますが
ClearContents や
Application.ScreenUpdating = False
Application.ScreenUpdating = True
が重複していませんか?

回答
投稿日時: 23/12/22 15:49:05
投稿者: WinArrow

引用:

Activate、Select をほぼ外すしてみました。

 
何処を修正したんですか?
まだ、いっぱい、残っていますよ。
 
Activate、Selectを外す
という意味が伝わっていないようですね・・・・
 
Activate、Selectを外す
とは、Range(^^)はシートで修飾する
シートはブックで修飾する
ということです。
単に単語だけ消せばよいということではありません。
 
コード全行見直しです。
慌てるとろくなことありません、
ステップ実行を使いながら、じっくり、取り組むことです。
 
 
そもそもですが、
本プロシジャが開始する時点では、
アクティブになっているブックは?
アクティブになっているシートは?
なんですか?
 
 

回答
投稿日時: 23/12/23 10:09:21
投稿者: WinArrow

追加レス
 
変数:Filename0
を追加し、
[quote]
    FileName0 = ActiveWorkbook.Name
 /quote]
↑は、どのような意味があるのだろう?
 
以下のコードの中では、
「FileName0」と「FileName1」
が同じものと思われますが、
どのように使い分けしているのだろうか?
(混乱していませんか?)

投稿日時: 23/12/25 07:28:49
投稿者: サイタマ

いろいろとご指導ありがとうございました。更に勉強していきます。今後とも宜しくお願い致します。