【问题标题】:Copy selective columns from one sheet to another using ADO VBA使用 ADO VBA 将选定的列从一个工作表复制到另一个工作表
【发布时间】:2021-11-08 20:43:37
【问题描述】:

我有一个 Summary data 表,其中包含带有选择性列名的第一行,我想使用 ADO 填充从 Paste data 表中提取的数据。我写了以下代码:

Sub CreateSummaryData()
Dim oCon As Object, oRec As Object
Dim strSQL As String
Dim wb As Workbook, wk1 As Worksheet, wk2 As Worksheet
Dim xLastColumn As Long, xLastRow As Long, i As Integer
Dim xCell, xRng As Range

On Error Resume Next
Set wb = ThisWorkbook

Set wk1 = wb.Worksheets("Paste Data")
Set wk2 = wb.Worksheets("Summary of data")

Set oCon = CreateObject("ADODB.Connection")
Set oRec = CreateObject("ADODB.Recordset")

With oCon
    .Open Join$(Array("Provider=Microsoft.ACE.OLEDB.12.0; Data Source='" & _
    wb.FullName & "';Extended Properties=""Excel 12.0; HDR=YES;IMEX=0"""), vbNullString)
End With

With wk2
    xLastColumn = .Range("1:1").Cells(.Columns.Count).End(xlToLeft).Column
    If xLastColumn = 1 Then Exit Sub
    
    Set xRng = .Range(.Cells(1, 1), .Cells(1, xLastColumn))
    
    strSQL = ""
    strSQL = "SELECT "
    For Each xCell In xRng
        strSQL = strSQL & "[" & xCell.Value2 & "],"
    Next xCell
    strSQL = Left(strSQL, Len(strSQL) - 1)
    strSQL = strSQL & " FROM [" & wk1.Name & "$]"
End With

With oRec
    .Open strSQL, oCon, 3, 3
End With

wk2.Range("A2").CopyFromRecordset oRec

With oCon
    .Close
End With

Set oRec = Nothing
Set oCon = Nothing

End Sub

问题在于Paste Data 工作表列的名称之间包含空格或点。我认为这就是为什么 ADO 记录集显示为空并显示“对象关闭时不允许操作”错误的原因。

列名是这样的:

+-----------+---------+---------+------+------------------+-----+-----+-----+-----+-----+------------+------------+------------+------------+------------+------------+
| segmentId | segment | concept | type | metric.base.size | p.5 | p.4 | p.3 | p.2 | p.1 | fitted.p.5 | fitted.p.4 | fitted.p.3 | fitted.p.2 | fitted.p.1 | Mean Value |
+-----------+---------+---------+------+------------------+-----+-----+-----+-----+-----+------------+------------+------------+------------+------------+------------+

我尝试使用“[”或“`”来封装列名,但没有多大帮助。有没有办法在 ADO 本身中处理此问题,而无需在 Paste dataSummary of data 表中操作列名?

任何帮助将不胜感激。

编辑

评论On error resume next 后,我在换行符上收到以下错误,即当它遇到第一个带有“。”的列名时其中,metric.base.size:

我也尝试了post 中给出的解决方案,但出现以下错误:

这是我按照上述帖子格式化后的完整列名。我也尝试用“[”括号和“`”括起来,但得到了同样的错误。是不是因为有不止一个“。”还是列中的“ ”?

SELECT `segmentId`,`exerciseConceptId`,`ConceptName`,`ConceptType`,`Groups`,`Segment`,`metric#base#size`,`fitted#p#5`,`fitted#p#4`,`fitted#p#3`,`fitted#p#2`,`fitted#p#1`,`MeanFrequency`,`MeanUnitsFav`,`MeanValue` FROM [Paste Data$]

【问题讨论】:

  • 注释掉On Error Resume Next 并运行您的代码。你有什么错误,哪一行有什么错误?
  • 嗨@TimWilliams。好久不见。我已经编辑了我上面的帖子以包括进一步的发现。仍然出错...

标签: excel vba office365 ado


【解决方案1】:

这对我有用 - 将字段名称中的任何句点替换为 #

For Each xCell In xRng
    strSQL = strSQL & "[" & Replace(xCell.Value2, ".", "#") & "],"
Next xCell

这是您链接帖子中的解决方案 - 您没有为此显示所有代码,所以我不确定为什么它不适合您。

【讨论】:

  • Tim 你使用的完整代码是什么?我已经试过了。也许我错过了一些东西。顺便说一句,您要替换粘贴数据表或数据表摘要中的字段名吗?很抱歉造成混乱。
  • 我对您发布的代码所做的唯一更改是strSQL = strSQL & "[" & Replace(xCell.Value2, ".", "#") & "]," 行,其他一切都一样。我没有更改任一工作表上的标题 - 只有 SQL 字符串受到影响。因此(例如)标题为“A.B”的字段在 SQL 中需要为“A#B”。
  • 如果你需要我会分享我的工作簿。
  • 当然。谢谢。原始代码是我发布的代码。但后来,我通过在原始代码中添加额外的行来替换字符来进行反复试验。所以没有选择展示它,因为我认为它是可以理解的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多