如何将行号转为单元格引用?VBA代码出现类型不匹配错误
问题解决:VBA中CopyFromRecordset的“类型不匹配”错误
错误原因
你遇到的类型不匹配错误,根源在于这行代码:
Sheet1.range("A" + unusedRow).CopyFromRecordset rs
在VBA里,+运算符如果同时处理字符串和数值类型,会尝试将字符串转换为数值进行加法运算。而"A"无法转换为有效数值,因此触发类型不匹配错误。
修复方案
方案1:使用字符串连接符&替代+
把字符串和行号用&拼接,确保是字符串连接操作:
Sheet1.Range("A" & unusedRow).CopyFromRecordset rs
方案2:直接用Cells指定单元格(更推荐)
用Cells(行号, 列标识)的方式引用单元格,写法更简洁且不易出错:
Sheet1.Cells(unusedRow, "A").CopyFromRecordset rs
额外优化建议
- 准确获取空行
你当前用Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 0).Row获取空行的方式有缺陷:如果之前删除过单元格内容,xlCellTypeLastCell会保留历史最后行的位置,导致获取的行号不准确。建议替换为:
unusedRow = Sheet1.Cells(Sheet1.Rows.Count, "A").End(xlUp).Offset(1, 0).Row
这个方法会从A列最后一行往上找第一个非空单元格,再偏移一行,得到真正的空行。
- 避免逻辑冲突
你代码中先执行了Sheet1.range("A1").CurrentRegion.Offset(1, 0).Clear清空现有数据,但之前已经获取了unusedRow。如果清空操作改变了实际空行位置,会导致数据写入位置错误。建议把获取空行的代码移到清空操作之后。
修正后的完整代码
Option Explicit Sub GetDataFromClosedFile() Dim cn As ADODB.Connection Dim file As FileDialog Dim sItem As String Dim GetFile As String Dim rs As ADODB.Recordset Dim unusedRow As Long '选择要提取数据的文件 Set file = Application.FileDialog(msoFileDialogFilePicker) With file .Title = "Select a File" .AllowMultiSelect = False '.InitialFileName = strPath If .Show <> -1 Then GoTo NextCode sItem = .SelectedItems(1) End With NextCode: GetFile = sItem Set file = Nothing Sheet1.Range("A1").CurrentRegion.Offset(1, 0).Clear '清空后获取准确的下一个空行 unusedRow = Sheet1.Cells(Sheet1.Rows.Count, "A").End(xlUp).Offset(1, 0).Row Set cn = New ADODB.Connection cn.ConnectionString = _ "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & GetFile & ";" & _ "Extended Properties='Excel 12.0 Xml;HDR=No';" cn.Open '读取目标文件指定区域数据 Set rs = New ADODB.Recordset rs.ActiveConnection = cn rs.Source = "SELECT * FROM [Sheet1$A2:A2]" rs.Open '将数据写入主表指定位置 Sheet1.Cells(unusedRow, "A").CopyFromRecordset rs rs.Close cn.Close End Sub
内容的提问来源于stack exchange,提问作者Teddy Hanna
相关产品推荐
相关产品推荐

