2017-12-15 8 views
2

1つのブックから別のブックにデータを転送するマクロを作成しました。ソースブックが開かれていない場合はマクロが開き、データがコピーされて閉じられ、ユーザーは何が起こったのか分かりません。今問題がある - ソースブックが既に開かれている場合は、操作後に開いたままにする必要があります。だから、私は私がここにあり、この機能を使用する場合の声明を発表した。Excel vbaでソースブックを変更した後でワークブックが開いているかどうかをチェック

Function IsWorkBookOpen(FileName As String) 
Dim ff As Long, ErrNo As Long 

On Error Resume Next 
ff = FreeFile() 
Open FileName For Input Lock Read As #ff 
Close ff 
ErrNo = Err 
On Error GoTo 0 

Select Case ErrNo 
Case 0: IsWorkBookOpen = False 
Case 70: IsWorkBookOpen = True 
Case Else: Error ErrNo 
End Select 
End Function 

、それは最初の時間を動作しますが、私は再びマクロを起動した場合、それはファイルのような役割を果たし最初の時間が開いていない直後とそれは操作を終了したときに

If IsWorkBookOpen(ActiveSheet.Range("AA1").Value) Then 

Set Invoice = Workbooks(ActiveSheet.Range("AA4").Value) 
openF = True 

Else 
openF = False 

Set Invoice = Workbooks.Open(ActiveSheet.Range("AA1").Value, True, True) 
End If 

For Each sheet In Invoice.Worksheets 
If sheet.Range("B2").Value = "active" Then 
    newD = vbNull 
    lRow = sheet.Cells(2000, 7).End(xlUp).Row 
    counter = sheet.Cells(2000, 1).End(xlUp).Row 

totalR = num 

For k = 7 To counter 

     If sheet.Cells(k, 6).Value = "n" Then 

      sheet.Range("A" & k, "F" & k).Copy 
      rep.Range("A" & num, "F" & num).PasteSpecial Paste:=xlPasteValuesAndNumberFormats 

      rep.Cells(num, 7) = newD 
      If Year(rep.Cells(num, 7).Value) = Year(1) Then rep.Cells(num, 7).Clear 
      newD = DateAdd("d", sheet.Cells(3, 2).Value, newD) 
      num = num + 1 
     End If 

Next k 

rep.Cells(num, 4) = "Total" 
rep.Cells(num, 5) = Application.Sum(rep.Range("E" & totalR, "E" & (num - 1))) 
rep.Cells(num, 5).NumberFormat = "$#,###0" 

num = num + 3 

End If 

Next sheet 

If openF = False Then 
    Invoice.Close False 
    Set Invoice = Nothing 
End If 
Application.ScreenUpdating = True 

...それを閉じた質問です:関数がオープン」としてそれを見ないように、マクロコードの最初のラウンドは何とかステータスやソースブックの名前を変更しません'?

+0

あなたが表示しているコードは、すべてのブックを開いたり閉じたりしません。したがって、その部分を追加する必要があります。開閉を扱う重要な部分がありません。 –

+0

私はコードを編集してオープニングとクロージングの部分を表示しました。そのために残念。 – Bobster

答えて

1

ブック内をループして名前を確認して、ファイルがExcel内で開いているかどうかを確認できます。ワークブックthroughtループ、または(ERR <> 0が開かれていない場合)、エラーハンドリングと変数にSETING

Public Function IsWorkbookOpen(WorkbookName) As Boolean 
    Dim i As Long 

    For i = 1 To Workbooks.Count 
     If Workbooks(i).Name = WorkbookName Then 
      IsWorkbookOpen = True 
      Exit Function 
     End If 
    Next i 
End Function 
+0

それは魅力のように働いた!ありがとうございました!一時ファイルのためにファイル名が変更されたように見えますが、ブック名は変わりません。 – Bobster

+0

@Bobsterこの問題が解決された場合、解答として解答をマークすることを検討してください。 –

+1

申し訳ありません、マーク済みです – Bobster

0

2つの簡単な方法があります。

別のExcelアプリケーションインスタンスがある場合は、getobjectを使用してExcelアプリケーションをループして前の選択肢を適用する場合があります。

私は明日コンピュータからコードを追加します。

関連する問題