Sql 使用VBA在Excel中选择动态表格范围
我正在尝试选择一个动态表-我可以确定脚本的复制/粘贴部分,但无法确定最初如何选择此表 该表在行数和列数方面都是动态的。这是因为这个单独的工作簿需要被不同的业务部门使用,调用不同的SQL server表。因此,用户将其输入放入Sheet1,刷新连接,然后在Sheet2中返回一个表 以下是代码片段,包括工作部分和断开部分: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
'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,完美…非常感谢您。简单,但非常有用。非常感谢。