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