只允许sub在另一个运行VBA之后运行

时间:2015-07-27 10:05:32

标签: excel vba excel-vba

我创建了一个从另一个文件导入数据的工作簿,然后通过查找标题字符串“Time”来删除任何行。但是,如果再次运行删除行的宏,它将删除标题,因为还有一个名为“Time”的子标题。

OR有没有办法限制字符查找搜索,即说我的副标题是实时,我的字符限制是4,查找应该只返回“真实”,因此忽略它?

我想要做的是禁用行删除代码,除非有新数据导入且行删除尚未运行。

下面的一些伪代码

If (DataImport has been run){
   If (rowDelete has been run since DataImport){
          return;
   }
   else{
   run rowDelete
   }
}

Excel VBA

Sub ImportData()

Dim wb1 As Workbook
Dim wb2 As Workbook
Dim sheet As Worksheet
Dim pastestart As Range

Set wb1 = ActiveWorkbook 'Sheets("Data")
Set pastestart = [Data!A1]

FileToOpen = Application.GetOpenFilename _
(Title:="Please choose a data file")

If FileToOpen = False Then
    MsgBox "No File Specified.", vbExclamation, "error"
    Exit Sub
Else
    Set wb2 = Workbooks.Open(Filename:=FileToOpen)

    For Each sheet In wb2.Sheets
        With sheet.UsedRange
            .Copy pastestart
            Set pastestart = pastestart.Offset(.Rows.Count)
        End With
    Next sheet
End If

    wb2.Close
End Sub

_____________________________________________________________________

Sub rowDelete()

    Dim FindRow As Range

    On Error Resume Next
    With Sheets("Data")
        Set FindRow = Cells.Find(What:="Time", After:=.Cells(1, 1), LookIn:=xlValues, LookAt:= _
        xlPart, MatchCase:=False)
    End With

    On Error GoTo 0

    Range("A1", FindRow).EntireRow.Delete

End Sub

3 个答案:

答案 0 :(得分:3)

您可以在工作表中包含一个单元格,该单元格指出自上一行删除后是否已导入;在ImportData过程的最后添加一行代码,用于更新此单元格。

ThisWorkbook.Sheets(1).Range("A1") = "Imported"

然后在rowDelete过程结束时,您可以更新此单元格以反映行已被删除。

ThisWorkbook.Sheets(1).Range("A1") = "Rows deleted"

然后在rowDelete过程中,您可以检查要运行的最后一个过程是rowDelete。如果是,请不要运行该程序。

If ThisWorkbook.Sheets(1).Range("A1") = "Rows deleted" Then
    Exit Sub
End If

如果单元格显示最后一次运行ImportData过程(因为单元格显示“已导入”),则rowDelete过程可以运行。

答案 1 :(得分:1)

如何使用CustomDocumentProperties代替。使它更加隐形:

ThisWorkbook.CustomDocumentProperties("Imported")

您可以将此设为是/否属性

答案 2 :(得分:0)

你可以使用全局变量进行识别,下面的工作是否适用于你?

确保在循环开始时调用InitiParams

Dim Option Explicit
'Module Level Variables
Dim boolDataImportComplete as boolean
Dim boolRowDeleteRunComplete as boolean    

Sub InitParams()
   boolDataImportComplete = False
   boolRowDeleteRunComplete = False
End Sub

Sub ImportData()
    ''' Your Code here

    boolDataImportComplete  = True
End Sub

Sub RowDelete()
    ''' YOUR Code here
    boolRowDeleteRunComplete  = True
End Sub