仅允许在运行另一个VBA后运行sub

仅允许在运行另一个VBA后运行sub,vba,excel,Vba,Excel,我创建了一个工作簿,该工作簿从另一个文件导入数据,然后通过查找标题字符串来删除所有行。但是,如果删除行的宏再次运行,它将删除标题,因为还有一个子标题名为Time 或者有没有一种方法可以限制Find搜索的字符数,比如说我的副标题是Real Time,而我的字符数限制是4,Find应该只返回Real,因此忽略它 我要做的是禁用行删除代码,除非有新的数据导入,并且行删除尚未运行 下面是一些psuedo代码 If (DataImport has been run){ If (rowDelete h

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

或者有没有一种方法可以限制Find搜索的字符数,比如说我的副标题是Real Time,而我的字符数限制是4,Find应该只返回Real,因此忽略它

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

下面是一些psuedo代码

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

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

您可以使用全局变量来识别,以下内容对您有用吗

确保在循环开始时调用initiparms

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

您可以使用全局变量来识别,以下内容对您有用吗

确保在循环开始时调用initiparms

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

您可以在工作表中包含一个单元格,该单元格说明自上次行删除后是否进行了导入;在更新此单元格的ImportData过程末尾包含一行代码

ThisWorkbook.Sheets(1).Range("A1") = "Imported"
然后在rowDelete过程结束时,可以更新此单元格以反映行已被删除

ThisWorkbook.Sheets1.RangeA1=已删除行

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

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

如果单元格显示ImportData过程是最后一次运行的,因为该单元格显示已导入,则可以运行rowDelete过程。

您可以在工作表中包含一个单元格,说明自上次行删除后是否已进行导入;在更新此单元格的ImportData过程末尾包含一行代码

ThisWorkbook.Sheets(1).Range("A1") = "Imported"
然后在rowDelete过程结束时,可以更新此单元格以反映行已被删除

ThisWorkbook.Sheets1.RangeA1=已删除行

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

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

如果单元格显示ImportData过程是最后运行的,因为该单元格显示已导入,则可以运行rowDelete过程。

改用CustomDocumentProperties如何。使其更不可见:

ThisWorkbook.CustomDocumentProperties("Imported")

您可以将其设置为是/否属性

改用CustomDocumentProperties如何。使其更不可见:

ThisWorkbook.CustomDocumentProperties("Imported")

您可以将其设置为“是/否”属性

您可以读取行数并将其存储在某个位置,然后检查行数是否不同?如果然后运行行删除其他操作,则您可以读取行数并将其存储在某个位置,然后检查行数是否不同?如果然后运行它们,请执行rowdelete else dont+1我比我更喜欢这样:-但是您使用的单元格应该被锁定,因此不会手动更改..正确吗?谢谢:。如果其他人将使用该文件,那么我同意。否则,我认为我们可以信任@gurdeph!非常感谢。这是可行的,并且非常简单,可以向任何想要编辑我的工作表的人解释。+1我比我更喜欢这个:-但是你正在使用的单元格应该被锁定,所以不能手动更改..正确吗?谢谢:。如果其他人将使用该文件,那么我同意。否则,我认为我们可以信任@gurdeph!非常感谢。这很有效,而且很简单,可以向任何想要编辑我的工作表的人解释。谢谢你的回答,我会按照lturner的建议去做,因为涉及的Sub更少。谢谢你的回答,我会按照lturner的建议去做,因为涉及的Sub更少。谢谢,这样更好,保持我的工作表整洁。干杯汉克斯,这样更好,让我的床单干净整洁。干杯