在VBA中,如何将字段的设置变量名从一个子例程传递到另一个子例程?

在VBA中,如何将字段的设置变量名从一个子例程传递到另一个子例程?,vba,excel,Vba,Excel,所以,我有两个子例程 第一个用于导入工作表,第二个用于在特定条件成立时删除空行 我想将已导入的工作表的名称传递到deletebankcells()子例程。我想这就是我们正在设置的Set wsSht=.Sheets(sWSName)变量 在第二个子例程中,您可以看到硬编码的图纸值,我想用导入传入的值替换该值 这是第一个子例程: Sub ImportSheet() Dim sImportFile As String, sFile As String Dim sThisBk As Workbook D

所以,我有两个子例程

第一个用于导入工作表,第二个用于在特定条件成立时删除空行

我想将已导入的工作表的名称传递到
deletebankcells()
子例程。我想这就是我们正在设置的
Set wsSht=.Sheets(sWSName)
变量

在第二个子例程中,您可以看到硬编码的图纸值,我想用导入传入的值替换该值

这是第一个子例程:

Sub ImportSheet()
Dim sImportFile As String, sFile As String
Dim sThisBk As Workbook
Dim vfilename As Variant
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set sThisBk = ActiveWorkbook
sImportFile = Application.GetOpenFilename( _
FileFilter:="Microsoft Excel Workbooks, *.xls; *.xlsx", Title:="Open Workbook")
If sImportFile = "False" Then
    MsgBox "No File Selected!"
    Exit Sub

Else
    vfilename = Split(sImportFile, "\")
    sFile = vfilename(UBound(vfilename))
    Application.Workbooks.Open Filename:=sImportFile
    Set wbBk = Workbooks(sFile)
    With wbBk
        If SheetExists(sWSName) Then
            Set wsSht = .Sheets(sWSName)
            wsSht.Copy after:=sThisBk.Sheets("Sheet3")
        Else
            MsgBox "There is no sheet with name :Raw_Data in:" & vbCr & .Name
        End If
        wbBk.Close SaveChanges:=False
    End With
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Sheets("Sheet1").Activate
End Sub

Private Function SheetExists(sWSName) As Boolean
Dim ws As Worksheet
On Error Resume Next
sWSName = InputBox("Enter sheet name")
Set ws = Worksheets(sWSName)
If Not ws Is Nothing Then SheetExists = True
End Function
Sub DeleteBlankCells()
Dim Rng As Range

Sheets("HARDCODED SHEET NAME").Activate

Set Rng = Rows("1:1").Find(What:="HIVE_FIELD_TYPE", after:=Cells(1, 1), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)
   Sheets("HARDCODED SHEET NAME").Columns(Rng.EntireColumn.Address).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

End Sub
这是第二个子例程:

Sub ImportSheet()
Dim sImportFile As String, sFile As String
Dim sThisBk As Workbook
Dim vfilename As Variant
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set sThisBk = ActiveWorkbook
sImportFile = Application.GetOpenFilename( _
FileFilter:="Microsoft Excel Workbooks, *.xls; *.xlsx", Title:="Open Workbook")
If sImportFile = "False" Then
    MsgBox "No File Selected!"
    Exit Sub

Else
    vfilename = Split(sImportFile, "\")
    sFile = vfilename(UBound(vfilename))
    Application.Workbooks.Open Filename:=sImportFile
    Set wbBk = Workbooks(sFile)
    With wbBk
        If SheetExists(sWSName) Then
            Set wsSht = .Sheets(sWSName)
            wsSht.Copy after:=sThisBk.Sheets("Sheet3")
        Else
            MsgBox "There is no sheet with name :Raw_Data in:" & vbCr & .Name
        End If
        wbBk.Close SaveChanges:=False
    End With
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Sheets("Sheet1").Activate
End Sub

Private Function SheetExists(sWSName) As Boolean
Dim ws As Worksheet
On Error Resume Next
sWSName = InputBox("Enter sheet name")
Set ws = Worksheets(sWSName)
If Not ws Is Nothing Then SheetExists = True
End Function
Sub DeleteBlankCells()
Dim Rng As Range

Sheets("HARDCODED SHEET NAME").Activate

Set Rng = Rows("1:1").Find(What:="HIVE_FIELD_TYPE", after:=Cells(1, 1), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)
   Sheets("HARDCODED SHEET NAME").Columns(Rng.EntireColumn.Address).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

End Sub

您可以在
工作表
本身上进行搜索,无需使用工作表的名称

在第二个子菜单中,更改为:

Sub DeleteBlankCells(ws As Worksheet)

Dim Rng As Range

With ws
    Set Rng = .Rows("1:1").Find(What:="HIVE_FIELD_TYPE", after:=.Cells(1, 1), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext)
    .Columns(Rng.EntireColumn.Address).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With

End Sub
在您的第一个
Sub
中,请在之后调用它:

Set wsSht = .Sheets(sWSName)
与:


或者,可能是一个全局变量?(这是一种很难实现的方法)


我们必须在第一小节中调用它吗?只是我有两个单独的控制按钮来执行这些子程序?我想把它们隔离起来?@ToofuWarrior那么你可以将
wsSht
声明为
Global
变量,你想这样做吗?你知道怎么做吗?我不知道怎么做,但我也只是想。。。或者,我可以导入工作表,然后在导入过程中将其重命名为硬编码值?@ToofuWarrior有很多方法可以实现它,我回答你的posr,标题是“如何在VBA中将字段的设置变量名从一个子例程传递到另一个子例程?”是的,你做到了!谢谢朋友