Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用VBA在Excel中选择动态表格范围_Sql_Vba_Excel_Dynamic - Fatal编程技术网

Sql 使用VBA在Excel中选择动态表格范围

Sql 使用VBA在Excel中选择动态表格范围,sql,vba,excel,dynamic,Sql,Vba,Excel,Dynamic,我正在尝试选择一个动态表-我可以确定脚本的复制/粘贴部分,但无法确定最初如何选择此表 该表在行数和列数方面都是动态的。这是因为这个单独的工作簿需要被不同的业务部门使用,调用不同的SQL server表。因此,用户将其输入放入Sheet1,刷新连接,然后在Sheet2中返回一个表 以下是代码片段,包括工作部分和断开部分: 'Variable designations Dim rowcount As String Dim columncount As String D

我正在尝试选择一个动态表-我可以确定脚本的复制/粘贴部分,但无法确定最初如何选择此表

该表在行数和列数方面都是动态的。这是因为这个单独的工作簿需要被不同的业务部门使用,调用不同的SQL server表。因此,用户将其输入放入Sheet1,刷新连接,然后在Sheet2中返回一个表

以下是代码片段,包括工作部分和断开部分:

    'Variable designations
    Dim rowcount As String
    Dim columncount As String
    Dim sheetref1 As String
    Dim sheetref2 As String
    Dim rangeselect1 As String
    Dim rangeselect2 As String

    rowcount = Cells(Rows.Count, 1).End(xlUp).Row
    columncount = Cells(1, Columns.Count).End(xlToLeft).Column
    sheetref1 = "Sheet1"
    sheetref2 = "Sheet2"
    rangeselect1 = "A2:A" & rowcount
    rangeselect2 = "A1:" & columncount & rowcount '<--BROKEN

    'Copy column with populated rows
    Sheets(sheetref1).Range(rangeselect1).Copy '<--WORKING

    'Copy table with populated rows and columns
    Sheets(sheetref2).Range(rangeselect2).Copy '<--BROKEN
变量名称 将行计数设为字符串 Dim列计数为字符串 尺寸表REF1为字符串 尺寸表REF2作为字符串 Dim范围选择1作为字符串 Dim范围选择2作为字符串 rowcount=单元格(Rows.Count,1).End(xlUp).Row columncount=单元格(1,Columns.Count).End(xlToLeft).Column sheetref1=“Sheet1” sheetref2=“Sheet2” rangeselect1=“A2:A”&行数
rangeselect2=“A1:”&columncount&rowcount'这将查找并选择从A1到包含代码所在工作簿Sheet1上数据的最后一个单元格的所有单元格:

Sub SelectDynamicTable()

    Dim rFinalRange As Range
    Dim lLastRow As Long
    Dim lLastCol As Long

    With ThisWorkbook.Worksheets("Sheet1")
        lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
        lLastRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row

        If lLastCol = 0 Then lLastCol = 1
        If lLastRow = 0 Then lLastRow = 1

        Set rFinalRange = .Range(.Cells(1, 1), .Cells(lLastRow, lLastCol))
    End With

    rFinalRange.Select

End Sub
使用单元格而不是范围-单元格可以接受行号和列号,而不是alpha名称

当给定工作表引用和要查看的可选列时,此函数将返回对最后一个单元格的引用

Public Function LastCell(wrkSht As Worksheet, Optional Col As Long = 0) As Range

    Dim lLastCol As Long, lLastRow As Long

    On Error Resume Next

    With wrkSht
        If Col = 0 Then
            lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
            lLastRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
        Else
            lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
            lLastRow = .Columns(Col).Find("*", , , , xlByColumns, xlPrevious).Row
        End If

        If lLastCol = 0 Then lLastCol = 1
        If lLastRow = 0 Then lLastRow = 1

        Set LastCell = wrkSht.Cells(lLastRow, lLastCol)
    End With
    On Error GoTo 0

End Function
此测试过程将显示Active工作簿第2列中最后一个单元格的地址:

Public Sub TestLastCell()

    MsgBox LastCell(ActiveWorkbook.Worksheets("Sheet2"), 2).Address

End Sub
如果要查找第一个单元格,请在代码中使用xlNext而不是xlPrevious

您的
范围选择2=“A1:”&columncount&rowcount
不起作用,因为
columncount
rowcount
作为指示行和列的数字返回。如果要将
columncount
rowcount
转换为A1地址(例如,第2列和第5行是
B5
),则可以使用
单元格(rowcount,columncount).address
,它返回该坐标的绝对参考


rangeselect2=“A1:”&Cells(rowcount,columncount)。Address
应该适用于您在此处尝试执行的操作。

您的第一条断行代码将返回A1:513(如果最后一列是5,最后一行是13,或者最后一列是51,最后一行是3)。请看下面我的回答。埃塞尔,非常感谢你的回答。因此,我在rangeselect2行中进行了简单的编辑,但它返回“应用程序定义或对象定义错误”-有什么建议吗?@Chase可能是因为
columncount
rowcount
设置为字符串,Cells()接受整数。您只需更改顶部的两个模糊语句,就可以使它们都成为整数,而不是StringsWow,完美…非常感谢您。简单,但非常有用。非常感谢。