我正在尝试创建一个单独的PDF文件,其中包含我在“控制”工作表的单元格J2中列出的每个选项卡的工作表,但是我不断收到下标超出范围错误。
当我记录动作时,我看到它创建了一个工作表名称数组,然后选择导出该工作表名称,因此我有一个For循环,该循环遍历列表,并创建一个添加到其自身的数组,直到到达结尾列表-目的是创建一个长字符串,然后我将其选择为数组。
一切似乎都很好(变量PDFArray以似乎正确的格式显示了选项卡名称的字符串),但是当我到达'Worksheets(Array(PDF(PDFarray)))。Select'行时,我得到了错误。我确保工作表名称不包含任何不需要的字符或空格,但仍然没有任何乐趣。任何帮助将不胜感激。谢谢
$.ajax({
type: 'POST',
url: 'file.php',
data: {check_button: '1', email: 'user@email.com'},
success: function(data)
{
window.location.href=data;
}
});
答案 0 :(得分:1)
我不明白为什么MS将默认情况下不要求变量声明。选择Tools/Options/Editor
并选中Require Variable Declaration
。这会将Option Explicit
放在任何新模块的开头。要更正此模块,请在开头手动输入。
这样做将使您能够查找和更正代码中的错字。
您还应该避免使用Select
,Selection
和Activate
。它们很少有任何用途,并且会导致多种问题,因为它们会避免避免显式声明所需的工作簿,工作表等。参见How to avoid using Select in Excel VBA
但是在使用ExportAsFixedFormat
方法导出所选工作表时,似乎需要Selection
和ActiveSheet
才能起作用。
Array(str_variable)
返回带有单个条目的数组,该条目包含整个字符串变量。它不会解释字符串变量,以便将其拆分为单独的元素。
因此,以某种方式重写您的代码(我将留给您清理PDF文档):
Option Explicit
Sub B_PDFs()
Dim PDFarray As Variant, PDFName As String, PLFile As String, PDFLoc As String
Dim wsControl As Worksheet
Dim WB As Workbook
'Consider wheter you want to use ThisWorkbook or a specific workbook
Set WB = ThisWorkbook
With WB
Set wsControl = .Worksheets("Control")
PLFile = .Name
PDFLoc = .Path & "\"
End With
With wsControl
PDFName = .Range("A20")
'create PDFarray
'This will be a 1-based 2D array starting at J1
'If you need to start at J2, alter the initial cell
PDFarray = .Range(.Cells(1, 10), .Cells(.Rows.Count, 10).End(xlUp))
End With
'convert to a 1D array
PDFarray = WorksheetFunction.Transpose(PDFarray)
'Note the use of `Select` and `ActiveSheet` when using this `ExportAsFixedFormat` method
Worksheets(PDFarray).Select
'Create PDF from the array above
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=PDFLoc & PDFName, Quality:= _
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
End Sub
答案 1 :(得分:0)
@RonRosenfeld提出的关于select
和selection
的建议是正确的。您要构建的表达式是字符串,而Excel希望它是实数组。
因此,原则上,以下方法将为您工作,它将创建一个数组进行处理,并且可以随便使用。
Dim shtNames As Variant
Dim pdfArray
shtNames = Range("J2:J" & Range("J1").Offset(Rows.Count - 1, 0).End(xlUp).Row).Value
pdfArray = Application.Transpose(shtNames)