2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VBAの備忘録 隠しシートに値を書込み、別ブックにしてデスクトップに保存

Last updated at Posted at 2019-02-14

【流れ】
ブランクフォームとして隠しているシートに値を書込み、別ブックにしてデスクトップに保存する。

呼び出し元シートのプロシージャ内の一部
  
    Application.ScreenUpdating = False      '-------画面更新停止(パラパラ画面が変わるので、これ重要!!!)

    '事前に隠しシートに値を書込む=================================================
  Dim ws As Worksheet
  Set ws = ThisWorkbook.Worksheets("隠しシート名")   '←書込み先

    '
    '   省略
    '

    'ファイル出力=================================================================
    'デスクトップにファイルを生成する
    
    'デスクトップのパスを調べる------------------------------------
    Dim Path As String
    Dim フルPath As String
    Dim WSH As Variant
    Set WSH = CreateObject("Wscript.Shell")
    Path = WSH.SpecialFolders("Desktop") & "\"

    'ファイル名の確定----------------------------------------------
    Dim ファイル名 As String
    ファイル名 = "新しいファイル名称_" & Format(Now, "yyyy年mm月dd日") & ".xlsx"

    MsgBox ("不動在庫一覧表をデスクトップに出力します。" & vbCrLf & " パス⇒ " & Path & vbCrLf & " ファイル名⇒ " & ファイル名)
    

    '!!!!!!!!!!!!!!!!ファイルの事前チェック!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    '①ファイルは存在するのか?
    If Dir(Path & ファイル名) = "" Then

        'MsgBox ("ファイルは存在しません。")

    Else
        'MsgBox ("ファイルが存在します。" & vbCrLf & "引き続き、開かれてるかをチェックします。")
        '次に開かれてるかをチェック
        '②ファイルは開いているか?
        If IsBookOpened(Path & ファイル名) = True Then
            
            MsgBox (ファイル名 & " が開かれています。このファイルを閉じて再度ボタンを押してください。")
            ThisWorkbook.Worksheets("不動").Activate
            Exit Sub
            
        Else
            'MsgBox ("ファイルは開かれていません。")
        End If
        
    End If

    'MsgBox ("ファイルの事前チェック完了。")

    
    ws.Visible = xlSheetVisible    '【重要】隠したままでは、コピーできない!
    ws.Copy
    
    ActiveWorkbook.ActiveSheet.Name = "新シート名"    'シート名を変更する【重要】.CopyしたシートがActiveになっている


      '!!!!!!!!!!!!!!!!ファイル出力!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    '【参考】http://officetanaka.net/excel/vba/file/file09.htm
    
    Dim 出力結果 As String
    出力結果 = "NG"
    
    Dim フルパス As String, re As Long
    If ActiveWorkbook.Path = "" Then
        ''まだ保存されたことがないブック
        'MsgBox ("まだ保存されたことがないブック!!!")
        フルパス = Path & ファイル名
        
        If Dir(フルパス) <> "" Then
            'MsgBox ("既存ファイル有る!!!")
            re = MsgBox("この場所に" & vbCrLf & "  " & ファイル名 & vbCrLf & _
                        "という名前のファイルが既にあります。置き換えますか?", _
                        vbInformation + vbYesNoCancel + vbDefaultButton2)
                        
            If re = vbYes Then

                Application.DisplayAlerts = False   '【!!!ポイント!!!】保存しますかのメッセージを出さない。
                On Error Resume Next '【!!!ポイント!!!】エラー無視!!!
                
                ActiveWorkbook.SaveAs _
                FileName:=Path & ファイル名, _
                FileFormat:=xlOpenXMLWorkbook
                
                On Err GoTo Err  'エラー対策戻し
                Application.DisplayAlerts = True
                
                出力結果 = "OK"

            End If
        Else
            'MsgBox ("既存ファイル無し!!!")
            ActiveWorkbook.SaveAs _
                FileName:=Path & ファイル名, _
                FileFormat:=xlOpenXMLWorkbook
                 
            出力結果 = "OK"

        End If
    Else
        '【注意】今回のケースではここには来ないが残しておく。
        'すでに保存されたブック
        ActiveWorkbook.SaveAs _
            FileName:=Path & ファイル名, _
            FileFormat:=xlOpenXMLWorkbook
    End If


    Application.DisplayAlerts = False   '【!!!重要!!!】保存しますかのメッセージを出さない。
    ActiveWorkbook.Close
    Application.DisplayAlerts = True  '【!!!重要!!!】戻しておくっ。
    

    ws.Visible = xlSheetVeryHidden   '隠しファイルを隠した状態に戻す。
    
    ThisWorkbook.Worksheets("呼び出し元シート").Activate '呼び出し元のシートをアクティブに。
    
    Set ws = Nothing           '最後の始末もお忘れなく。

    Application.ScreenUpdating = True   '-----------------やっとここで、画面更新再開!


そしてファイルが開いているかチェックするファンクションは…


Function IsBookOpened(フルパス As String) As Boolean
    On Error Resume Next
    
    '【注意】ブックが存在しない場合、ファイルを中途半端に作成してしまう。
    '   だから、事前にブックが存在しないことを確認して使う
    
    
    ' 保存済みのブックか判定
    Open フルパス For Append As #1
    Close #1
    
    If Err.Number > 0 Then
        ' 既に開かれている場合
        IsBookOpened = True
    Else
        ' 開かれていない場合
        IsBookOpened = False
    End If
End Function


 これだと別エクセルで開かれていると判らないのでボツ↓

Function IsBookOpened2(ファイル名 As String) As Boolean
    
    '【ボツ】これだと、他のエクセルで開かれていると判別できない
    
    Dim myChkBook As Workbook

    On Error GoTo Err
    Set myChkBook = Workbooks(ファイル名)

    'MsgBox "開かれています。"
    ファイルは開いているか = True
    Exit Function
    
Err:
    'MsgBox "開かれていません。"
    ファイルは開いているか = False
End Function

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?