繁体   English   中英

通过Access子例程在Excel文档上运行VBA Excel脚本

[英]Run VBA Excel script on an Excel document from an Access subroutine

我有一段代码可以找到右下角的单元格,该单元格在excel中运行,并且我希望能够通过Access子例程运行它,该子例程将返回单元格坐标(例如:J17)。 但是,我对Access不太熟悉,不确定如何翻译代码。

Sub FindLast_Message()

MsgBox FindLast(3)

End Sub

Function FindLast(lRowColCell As Long, _
                Optional sSheet As String, _
                Optional sRange As String)
'Find the last row, column, or cell using the Range.Find method
'lRowColCell: 1=Row, 2=Col, 3=Cell

Dim lRow As Long
Dim lCol As Long
Dim wsFind As Worksheet
Dim rFind As Range

'Default to ActiveSheet if none specified
On Error GoTo ErrExit

If sSheet = "" Then
    Set wsFind = ActiveSheet
Else
    Set wsFind = Worksheets(sSheet)
End If

'Default to all cells if range no specified
If sRange = "" Then
    Set rFind = wsFind.Cells
Else
    Set rFind = wsFind.Range(sRange)
End If

On Error GoTo 0

Select Case lRowColCell

    Case 1 'Find last row
        On Error Resume Next
        FindLast = rFind.Find(What:="*", _
                        After:=rFind.Cells(1), _
                        LookAt:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlPrevious, _
                        MatchCase:=False).Row
        On Error GoTo 0

    Case 2 'Find last column
        On Error Resume Next
        FindLast = rFind.Find(What:="*", _
                        After:=rFind.Cells(1), _
                        LookAt:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByColumns, _
                        SearchDirection:=xlPrevious, _
                        MatchCase:=False).Column
        On Error GoTo 0

    Case 3 'Find last cell by finding last row & col
        On Error Resume Next
        lRow = rFind.Find(What:="*", _
                       After:=rFind.Cells(1), _
                       LookAt:=xlPart, _
                       LookIn:=xlFormulas, _
                       SearchOrder:=xlByRows, _
                       SearchDirection:=xlPrevious, _
                       MatchCase:=False).Row
        On Error GoTo 0

        On Error Resume Next
        lCol = rFind.Find(What:="*", _
                        After:=rFind.Cells(1), _
                        LookAt:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByColumns, _
                        SearchDirection:=xlPrevious, _
                        MatchCase:=False).Column
        On Error GoTo 0

        On Error Resume Next
        FindLast = wsFind.Cells(lRow, lCol).Address(False, False)
        'If lRow or lCol = 0 then entire sheet is blank, return "A1"
        If Err.Number > 0 Then
            FindLast = rFind.Cells(1).Address(False, False)
            Err.Clear
        End If
        On Error GoTo 0

End Select

Exit Function

ErrExit:

MsgBox "Error setting the worksheet or range."

End Function

下面是我需要与之协调的访问代码部分。 “ J72”应为上一代码返回的右下角单元格坐标。

Sub Format_Excel_Workbook(workbook_path As String, worksheet_name As String, myRows As Integer, myColumns As Integer)
'==============================================================================
Dim objExcelApp As Object
Dim xlWbk As Object
'==============================================================================

Dim x, y As String

x = "B2"
y = "J72"
Z = x & ":" & y

'==============================================================================
Set objExcelApp = New Excel.Application

objExcelApp.Workbooks.Open (workbook_path)

objExcelApp.Worksheets("t_DATA").Columns.AutoFit

objExcelApp.Worksheets("t_DATA").Range(x).Select

objExcelApp.ActiveWindow.FreezePanes = True

objExcelApp.Worksheets("t_DATA").Range(Z).HorizontalAlignment = xlCenter

objExcelApp.Worksheets("t_DATA").Range(Z).VerticalAlignment = xlTop

objExcelApp.ActiveWorkbook.Close (True)

Set objExcelApp = Nothing
'==============================================================================

End Sub

最简单的方法可能是将FindLast()函数的参数更改为对象而不是字符串:

Function FindLast(lRowColCell As Long, _
                  Optional sSheet As Excel.Worksheet, _
                  Optional sRange As Excel.Range)

在Excel中,您可以这样调用此函数:

FindLast(3, , FindLast(3, , ThisWorkbook.Sheets(1).Range("A3:E7")))

在函数中,您必须更改使用参数sSheet和sRange的那些部分:只需使用提供的对象,而不是从字符串创建它们。

以这种方式更改功能后,您可以轻松地将其传输到其他宿主应用程序(如Access),因为函数的调用者定义了应在其上操作的对象,而不是函数本身。

在Access中,您可以调用以下函数:

FindLast(3, , objExcelApp.Worksheets("t_DATA").Range(Z))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM