【发布时间】:2017-05-18 18:46:09
【问题描述】:
我有两个问题。
因为 Var3 有时可能为空白,这取决于 Sub,我收到 424 错误,并且“未定义”一词被复制到网站上的文本框中 - 但是我需要将其留空并且不要在其中粘贴任何内容案子。
我在 Excel 中有一个下拉框来选择要调用的 Sub。我想将其合并到如下所示的 IF 语句中,但是当我尝试代码时,没有任何反应。
这是我的尝试:
Public Sub Populate()
Dim Var1 As String
Dim Var2 As String
Dim Var3 As String
Dim User_Name As String
Dim StrFile1 As String
Dim StrFile2 As String
Dim Filename As String
Dim strFilename As String
Dim IE As Object
If ComboBox1.Value = "Data1" Then
Call Data1 (Filename, Var1, Var2, Var3)
End If
If ComboBox1.Value = "Data2" Then
Call Data2 (Filename, Var1, Var2, Var3)
End If
'If ComboBox1.Value = Data3, Data4, etc...
User_Name = Environ("UserName")
StrFile1 = "C:\Users\"
StrFile2 = "\Desktop\"
strFilename = StrFile1 & User_Name & StrFile2 & Filename
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & strFilename, Destination _
:=Range("$A$22"))
.Name = Filename
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = False
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 437
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
ActiveWindow.SmallScroll Down:=-27
DoEvents
'FillInternetForm
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "https://website.com"
IE.Visible = True
While IE.busy
DoEvents 'wait until IE is done loading page.
Wend
IE.Document.All(Var1).Value = ThisWorkbook.Sheets("Sheet1").Range("B5")
IE.Document.All(Var2).Value = ThisWorkbook.Sheets("Sheet1").Range("B6")
IE.Document.All(Var3).Value = ThisWorkbook.Sheets("Sheet1").Range("B7")
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Public Sub Data1 (ByRef Filename As String, ByRef Var1 As String, ByRef Var2 As String, ByRef Var3 As String)
Filename = "FILE1.CSV"
Var1 = "Response123"
Var2 = "Response456"
Var3 = "Response789"
End Sub
Public Sub Data2 (ByRef Filename As String, ByRef Var1 As String, ByRef Var2 As String, ByRef Var3 As String)
Filename = "FILE2.CSV"
Var1 = "Response987"
Var2 = "Response654"
Var3 = "Response321"
End Sub
'Public Sub Data3, Data4, etc...
【问题讨论】:
-
Var是一个局部变量,只能从 Populate 子中访问。 Variable1 sub 无权访问Var。如果您使用Option Explicit 语句,则您的代码不应编译(即使在开始时更正Dim错字。我建议您始终使用Option Explicit,并使用Function来返回值而不是Sub和共享变量。 -
" & Var & "是一个字符串常量,而不是进行任何连接的代码。你想用什么连接Var?请参阅msdn.microsoft.com/en-us/library/office/gg264104.aspx 了解如何使用&运算符进行连接。 -
感谢 Vincent G 50,我正在尝试用 IE.Document.All(" ... ").Value 之后的变量替换引号“...”内的文本框 ID ,但发现使用 &..& 不起作用。还纠正了错字-在我的实际代码中没有这样拼写:)
-
如果我想在 Variable1() 中包含基于 Excel 工作表值的计算...您是否仍建议将其设为函数而不是子函数?我想用它来返回值,但也可以进行计算和做其他事情。
-
见@Comintern 的回答。恕我直言,函数是返回单个值的最佳等待。当需要返回多个值时,可以平等地使用带有 ByRef 参数的 Function 或 Sub。我想不出在 sub 中完成的任何事情不能在函数中完成。