2017-09-26 85 views
0

我一直在为此工作数天,并在互联网上阅读了如此多的内容,现在我已经失明,并且没有剩余头发。非常接近解决方案,但非常需要帮助。通过Access VBA导出并格式化Excel - .Range错误

我有一个Access数据库,我做了一些查询从表中检索数据。我用一个按钮创建了一个表单,用多张表单将其导出到Excel。

我想导出格式并查看如何完成我将宏转换为Vb,我看到它是如何完成的但我不能让代码创建多张工作簿并添加一些条件格式到列F.

,将导出到Excel与访问表格式的代码看起来是这样的:

Private Sub Advance_Waiting_on_Visual_Report_Click() 
On Error GoTo Advance_Waiting_on_Visual_Report_Click_Err 

Const FileNameBase As String = "W:\Quality-Projects\RCabler\Databases\Weekly Reports\Waiting on Visual Weekly Report [CurrentDate].xlsx" 
Dim strFileName As String 
strFileName = Replace(FileNameBase, "[CurrentDate]", Format$(Date, "m-dd-yyyy")) 

DoCmd.OutputTo acOutputQuery, "AdvanceWaitVis", "ExcelWorkbook(*.xlsx)", strFileName, True, "AdvanceWaitVis", , acExportQualityPrint 

Advance_Waiting_on_Visual_Report_Click_Exit: 
Exit Sub 

Advance_Waiting_on_Visual_Report_Click_Err: 
MsgBox Error$ 
Resume Advance_Waiting_on_Visual_Report_Click_Exit 

End Sub` 

这将数据导出到Excel与Access表的格式,但我不知道如何给它添加使其通过调用其他查询来完成多个工作表,也不会有条件地格式化F列以使单元格在日期i之前变为红色年龄在14岁或以上。

此代码将导出到Excel中有多个表,但它不传输Access表格式和挂就行了

.Range("F1:F" & lngRow).Select 

正因为如此挂不设置在代码中列出的条件格式在那之后。

Code in Module named ExportFormatting 


Public Function fnLastRow(sh As Object) 
On Error Resume Next 
With sh 
fnLastRow = .Cells.Find(What:="*", _ 
After:=.Range("A1"), _ 
Lookat:=2, _ 
LookIn:=5, _ 
SearchOrder:=1, _ 
SearchDirection:=2, _ 
MatchCase:=False).row 
End With 
End Function 


Code for button 


Private Sub Command35_Click() 

Const FileNameBase As String = "W:\Quality-Projects\RCabler\Databases\Weekly Reports\Waiting on Visual Weekly Report [CurrentDate].xlsx" 
Dim strFileName As String 
strFileName = Replace(FileNameBase, "[CurrentDate]", Format$(Date, "m-dd-yyyy")) 

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "AdvanceWaitVis", strFileName, True, "AdvanceWaitVis" 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "ArcadiaWaitVis", strFileName, True, "ArcadiaWaitVis" 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "EcruWaitVis", strFileName, True, "EcruWaitVis" 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "LeesportWaitVis", strFileName, True, "LeesportWaitVis" 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "RipleyWaitVis", strFileName, True, "RipleyWaitVis" 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "WanekWaitVis", strFileName, True, "WanekWaitVis" 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "WanvogWaitVis", strFileName, True, "WanvogWaitVis" 

Dim xlWB As Object 
Dim xlObj As Object 
Dim xlSheet As Object 
Dim lngRow As Long 

Set xlObj = CreateObject("Excel.Application") 

Set xlWB = xlObj.Workbooks.Open(strFileName, False, False) 

For Each xlSheet In xlWB.Worksheets 

With xlSheet 

lngRow = fnLastRow(xlSheet) 
Debug.Print lngRow 

.Range("F1:F" & lngRow).Select 
xlObj.Selection.FormatConditions.Add Type:=2, Formula1:= _ 
       "=TODAY()-F1<13" 
    xlObj.Selection.FormatConditions(xlObj.Selection.FormatConditions.Count).SetFirstPriority 
With xlObj.Selection.FormatConditions(1).Interior 
.PatternColorIndex = -4105 
.Color = 255 
.TintAndShade = 0 
End With 
xlObj.Selection.FormatConditions(1).StopIfTrue = False 

End With 

Next 
xlWB.Close True 
Set xlSheet = Nothing 
Set xlWB = Nothing 
xlObj.Quit 
Set xlObj = Nothing 

End Sub 

有人可以帮我解决这个问题吗?

+0

我明白在上面的代码中有2个不同的按钮名称......这是因为我有2个不同的按钮尝试不同的事情来实现这个功能。我需要的代码可以是第一个或第二个......我只需要能够将格式导出到具有多个工作表的一个工作簿并有条件地格式化F列,以便在日期值为14天之前填充单元格或者年长......如果空白或少于14天,则什么都不做。提前感谢任何愿意帮助的人。 – PsyC0TiC1

+0

您不能在不是ActiveSheet的工作表上选择一个范围 –

回答

0

你不能选择在一张纸上这不是ActiveSheet一个范围,并且在任何情况下,没有必要为一个选择:

Dim rng As Object 

'... 

lngRow = fnLastRow(xlSheet) 
Debug.Print lngRow 

Set rng = xlSheet.Range("F1:F" & lngRow) 
rng.FormatConditions.Add Type:=2, Formula1:= _ 
       "=TODAY()-F1<13" 
rng .FormatConditions(xlObj.Selection.FormatConditions.Count) _ 
      .SetFirstPriority 

With rng.FormatConditions(1).Interior 
    .PatternColorIndex = -4105 
    .Color = 255 
    .TintAndShade = 0 
End With 

rng.FormatConditions(1).StopIfTrue = False 
+0

就像在您按照您的建议更改代码之前一样......它仍会在同一个地方抛出一个错误,但它是您的行,在调试器中突出显示Set rng = xlSheet.Range(“F1:F”&lngRow)'。它确实像之前一样创建了文件,但没有格式化单元格,因为它挂在那条线上。 – PsyC0TiC1

+0

lngRow失败时的价值是什么? –

0

代码看起来现在这个样子

Private Sub Command35_Click() 

Const FileNameBase As String = "W:\Quality-Projects\RCabler\Databases\Weekly Reports\Waiting on Visual Weekly Report [CurrentDate].xlsx" 
Dim strFileName As String 
strFileName = Replace(FileNameBase, "[CurrentDate]", Format$(Date, "m-dd-yyyy")) 

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "AdvanceWaitVis", strFileName, True, "AdvanceWaitVis" 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "ArcadiaWaitVis", strFileName, True, "ArcadiaWaitVis" 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "EcruWaitVis", strFileName, True, "EcruWaitVis" 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "LeesportWaitVis", strFileName, True, "LeesportWaitVis" 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "RipleyWaitVis", strFileName, True, "RipleyWaitVis" 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "WanekWaitVis", strFileName, True, "WanekWaitVis" 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "WanvogWaitVis", strFileName, True, "WanvogWaitVis" 

Dim rng As Object 
Dim xlWB As Object 
Dim xlObj As Object 
Dim xlSheet As Object 
Dim lngRow As Long 

Set xlObj = CreateObject("Excel.Application") 

Set xlWB = xlObj.Workbooks.Open(strFileName, False, False) 

For Each xlSheet In xlWB.Worksheets 

    With xlSheet 


     lngRow = fnLastRow(xlSheet) 
     Debug.Print lngRow 

     Set rng = xlSheet.Range("F1:F" & lngRow) 
rng.FormatConditions.Add Type:=2, Formula1:= _ 
      "=TODAY()-F1<13" 
rng .FormatConditions(xlObj.Selection.FormatConditions.Count) _ 
     .SetFirstPriority 

With rng.FormatConditions(1).Interior 
.PatternColorIndex = -4105 
.Color = 255 
.TintAndShade = 0 
End With 

rng.FormatConditions(1).StopIfTrue = False 

End With 

Next 
xlWB.Close True 
Set xlSheet = Nothing 
Set xlWB = Nothing 
xlObj.Quit 
Set xlObj = Nothing 

End Sub