2017-03-12 1 views
0

私が作業しているExcelファイルのマクロコードを書き込もうとしています(Office 2016 for Mac)。Excel VBAファイルが開いているときにエラーが発生した場合 - Mac Office

コードは2つの部分で構成されています: 1.特定のセルが変更されたときに、csvファイルを開き、読み込んだ後、それを操作する関数を起動するWorkbook_SheetChangeリスナー。この部分はうまく動作します。 2.上記の同じcsvファイルから読み込み、それに従ってブック内のセルを変更する必要があるボタン。私は上記の機能を追加するまで働いていた。

ここで、csvから読み取るためにボタンを押すと、エラーが「ファイルはすでに開いています」とジャンプし、デバッグを押して失敗した箇所を確認すると、シート変更されたマクロ内の関数まったく誘発されるべきではない)。

読み取り機能は次のとおりです。

とリスナーの機能サブ

Private Sub ReadCSV_Click() 
Dim serial As String 
Dim signer As String 
loc_idx = -1 
Dim FilePath As String 
FilePath = ThisWorkbook.Path + "/test.csv" 
Open FilePath For Input As #1 
row_number = 0 

Do Until EOF(1) 
    Line Input #1, LineFromFile 
    LineItems = Split(LineFromFile, ",") 
    signer = Replace(LineItems(0), Chr(34), vbNullString) 'Location 
    If Not signer = vbNullString Then 
     serial = Replace(CStr(LineItems(1)), Chr(34), vbNullString) 'SN 
     Call SearchCell(serial) 'Search the SN 
     Call SearchLocationCol(f_ws_idx) 'Search Location column in the relevant sheet 
     Worksheets(f_ws_idx).Cells(f_row, loc_idx).Value = signer 
    End If 
    row_number = row_number + 1 
Loop 

Close #1 
MsgBox "Done Updating" 

エンドは、次のとおりです。

Option Explicit 

Public Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
     If Not Sh.Name = "Macros" Then 
      Call InsertChange("test", "1111") 
     End If 
    End Sub 

    Private Sub InsertChange(n_loc As String, n_ser As String) 
     Dim LineFromFile As String 
     Dim LineItems() As String 
     Dim split_new_csv() As String 
     Dim is_new As Boolean 
     Dim serial_changed As String 
     Dim location_changed As String 
     Dim new_csv_str As String 
     Dim signer As String 
     Dim serial As String 
     Dim row_number As Integer 
     Dim rec As Variant 
     Dim rec_item As Variant 
     is_new = True 
     new_csv_str = "" 
     serial_changed = n_ser 
     location_changed = n_loc 

     Dim FilePath As String 
     FilePath = ThisWorkbook.Path + "/test.csv" 

     Dim FilePathTemp As String 
     Dim scriptstr As String 

     scriptstr = "return posix path of (path to desktop folder) as string" 

     FilePathTemp = MacScript(scriptstr) + "s.csv" 
     Open FilePath For Input As #1 
      row_number = 0 
      Do Until EOF(1) 'Go Through all of the lines in the csv 
       Line Input #1, LineFromFile 
       LineItems = Split(LineFromFile, ",") 
       signer = Replace(LineItems(0), Chr(34), vbNullString) 'Location 
       If Not signer = vbNullString Then 
        serial = Replace(CStr(LineItems(1)), Chr(34), vbNullString) 'SN 
        If serial = serial_changed Then 
         is_new = False 
         signer = location_changed 
        End If 
        new_csv_str = new_csv_str + signer + "," + serial + "\n" 
        row_number = row_number + 1 
       End If 
      Loop 
     Close #1 

     MsgBox "Done updating" 
     End Sub 

はい、コードは、クリーンアップが必要ですが、デバッグエラーがいい私に:

Open FilePath For Input As #1 

リスナーコード内で、それはまったくアクティブ化されるべきではありません。私は、リスナーに複製を作成し、それを他のファイルとして扱うために変数名を変更しようとしましたが、それでも動作しません。

これを解決する方法はありますか?

ありがとうございました。

答えて

0

イベントがworksheet_changeの実行を再トリガーすると思われます。私はinsertchangeを入力するときにイベントを無効にします。しかし、あなたが投稿したコードは、ワークシートと対話していないようです。

Public Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
     If Not Sh.Name = "Macros" Then 
      application.enableevents=False 
      Call InsertChange("test", "1111") 
      application.enableevents=true 
     End If 
End Sub 
+0

ありがとう!これは、ReadCell関数を正しく起動させるようです。 – Jonathan

関連する問題