ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2166|回复: 9

VBA 标准表达式中数据类型不匹配- 将一个工作表的数据分割在几个不同的工作表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-9-29 11:41 | 显示全部楼层 |阅读模式
我想使用VBA将一个工作表中的数据按照不同的代号分割在多个工作表,但是在运行VBA时提示,有创建一个新的工作表,但是数据未拷贝到新生成的工作表中,且运行以下这一语句时提示“标准表达式中数据类型不匹配”, 程序无法往以下执行。
.Range("A2").CopyFromRecordsetconn.Execute(Sql)


数据分割的要求是将工作表中的数据按照一列中不同的编号将所有数据分成单独的工作表


根据第一列的数据编号,将该表格的数据分割成不同工作表

根据第一列的数据编号,将该表格的数据分割成不同工作表

lab_raw_data_for_single_coil.rar

176.01 KB, 下载次数: 16

头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2019-9-29 11:45 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-9-29 11:50 | 显示全部楼层
Sub a()
Application.ScreenUpdating = False
Dim sht As Worksheet
Application.DisplayAlerts = False
    If Sheets.Count > 1 Then    '工作簿必须,至少有一个工作表
        For Each sht In Sheets
            If sht.Name <> Sheets(1).Name Then sht.Delete           '删除工作表,除第一个表外的所有表
        Next
    End If
Application.DisplayAlerts = True
'整列,存入字典
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
Dim arr, i%
arr = [a1].CurrentRegion    '数据源
For i = 2 To UBound(arr)     '不含标题
        d(arr(i, 1)) = ""
Next
'拆分
Set sht = ActiveSheet     '当前工作表
With sht
    For i = 0 To d.Count - 1
        Worksheets.Add(after:=Sheets(Sheets.Count)).Name = d.keys()(i)        '新建,工作表并命名
        .[a1].CurrentRegion.AutoFilter Field:=1, Criteria1:=d.keys()(i)        '筛选
        .[a1].CurrentRegion.Copy [a1]
    Next
    .[a1].CurrentRegion.AutoFilter          '取消筛选
    .Select          '显示当前表
End With
Set d = Nothing
Application.ScreenUpdating = True
MsgBox prompt:="按【" & Cells(1, 1).Value & "】,拆分完成!", Title:="提示"
End Sub

TA的精华主题

TA的得分主题

发表于 2019-9-29 12:30 | 显示全部楼层
  1. Option Explicit

  2. Sub Test()
  3.     Dim sh As Worksheet, strShName As String, strAddress As String
  4.     Dim Conn As Object, Rst As Object, strPath As String
  5.     Dim strConn As String, strSQL As String
  6.     Dim lngRows As Long, lngCols As Long
  7.     Dim arrTitle As Variant '标题区域
  8.     Dim arrType As Variant '类型,用于命名工作表
  9.     Dim lngID As Long, strFind As String
  10.    
  11.     strShName = "数据源"
  12.     Set sh = Sheets(strShName)
  13.     lngRows = sh.Range("A1").CurrentRegion.Rows.Count - 1 '采用无标题行的方式,所以总行数要减1
  14.     lngCols = sh.Range("A1").CurrentRegion.Columns.Count
  15.    
  16.     arrTitle = sh.Range("A1").Resize(1, lngCols) '读取标题行
  17.     strAddress = sh.Range("A2").Resize(lngRows, lngCols).Address(0, 0) '获取数据区域地址
  18.    
  19.     Set Conn = CreateObject("ADODB.Connection")
  20.     Set Rst = CreateObject("ADODB.Recordset")
  21.     strPath = ThisWorkbook.FullName
  22.     Select Case Application.Version * 1
  23.         Case Is <= 11
  24.             strConn = "Provider=Microsoft.Jet.Oledb.4.0;Extended Properties=excel 8.0;Data source=" & strPath
  25.         Case Is >= 12
  26.             strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath & ";Extended Properties=""Excel 12.0;HDR=NO"";"""
  27.     End Select
  28.     Conn.Open strConn

  29.     '获取代号
  30.     strSQL = "SELECT [F1] FROM [" & strShName & "$" & strAddress & "]  GROUP BY [F1];"
  31.     If Rst.State = 1 Then Rst.Close
  32.     Rst.Open strSQL, Conn, 3, 1 '执行查询,并将结果输出到记录集对象
  33.    
  34.     If Rst.RecordCount = 0 Then
  35.         Set Rst = Nothing
  36.         Set Conn = Nothing
  37.         MsgBox "无数据!", vbInformation + vbOKOnly, "提示"
  38.         Exit Sub
  39.     End If
  40.    
  41.     arrType = Rst.GetRows
  42.    
  43.     For lngID = LBound(arrType, 2) To UBound(arrType, 2)
  44.         strFind = arrType(0, lngID)
  45.         '逐个类型读取数据,并写入不同的表
  46.         strSQL = "SELECT * FROM [" & strShName & "$" & strAddress & "]  WHERE [F1] Like '" & strFind & "';"
  47.         If Rst.State = 1 Then Rst.Close
  48.         Rst.Open strSQL, Conn, 3, 1 '执行查询,并将结果输出到记录集对象
  49.         FullDataToSheet strFind, arrTitle, Rst
  50.     Next
  51.    
  52.     Set Rst = Nothing
  53.     Set Conn = Nothing
  54.    
  55.     MsgBox "OK"
  56. End Sub

  57. Function FullDataToSheet(strShName As String, arrTitle As Variant, arrData As Object)
  58.     Dim sh As Worksheet
  59.    
  60.     On Error Resume Next
  61.    
  62.     If Not Sheets(strShName) Is Nothing Then
  63.         If Err.Number <> 9 Then
  64.             Set sh = Sheets(strShName)
  65.         Else
  66.             Set sh = Sheets.Add(After:=Sheets(Sheets.Count))
  67.             sh.Name = strShName
  68.         End If
  69.         Err.Clear
  70.     End If
  71.    
  72.     sh.UsedRange.Clear
  73.     sh.Range("A1").Resize(UBound(arrTitle), UBound(arrTitle, 2)) = arrTitle '标题
  74.     sh.Range("A2").CopyFromRecordset arrData '数据
  75.    
  76.     Set sh = Nothing
  77. End Function

复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-9-29 13:56 | 显示全部楼层
xuemei0216 发表于 2019-9-29 11:50
Sub a()
Application.ScreenUpdating = False
Dim sht As Worksheet

您好,真的非常,您写的代码可以运行,不过有个问题是现在按照这个代码运行只能分两个工作表,因为根据实际的编号应该分出几十个工作表,但是实际只分出来两个工作表。

TA的精华主题

TA的得分主题

发表于 2019-9-29 15:34 | 显示全部楼层
stusun 发表于 2019-9-29 13:56
您好,真的非常,您写的代码可以运行,不过有个问题是现在按照这个代码运行只能分两个工作表,因为根据实 ...

不是按第一列拆分吗?第一列就只有1跟2这两个呀。你要按第几列拆分

TA的精华主题

TA的得分主题

发表于 2019-9-29 16:29 | 显示全部楼层
我测试了4楼的代码,真的写的很专业,高手就是高手。
sql要用好其实很不容易,尤其是楼主这类不太严谨的数据。之所以说不严谨,是因为楼主的标题大量用的都是这种,比如“strip position on entry of VAAT plant []”,我可以说新手100%会被搞晕;
[]可以看做是sql的专用操作符,这么说肯定不严谨,但实际上你在标题上用了[]就会非常的麻烦。我本来想看看4楼是如何操作[]的,但4楼回避了这个问题,采用了无标题的方式来查询,我只能说:高;
sql还有一个很容易出错的就是日期,excel支持的日期l类似 #2019/06/25# 这样的,所以写日期条件需要写成 " 日期 between #" & 第一个日期变量 & "# and #" &  第二个日期变量 & "#",如果是用引号来引用日期通常就不行;

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-9-30 10:21 | 显示全部楼层
xuemei0216 发表于 2019-9-29 15:34
不是按第一列拆分吗?第一列就只有1跟2这两个呀。你要按第几列拆分

是的,我只需要按照第一列进行拆分,但是如果我增加数据,按照这种方式拆分的话也只能拆分两个工作表。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-9-30 10:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
fanyoulin 发表于 2019-9-29 16:29
我测试了4楼的代码,真的写的很专业,高手就是高手。
sql要用好其实很不容易,尤其是楼主这类不太严谨的数 ...

您评价的非常到位,我是一个新手,所以数据处理也很不严谨。4楼的代码真的非常适用,今天真的学到很多,谢谢你们的指点。

TA的精华主题

TA的得分主题

发表于 2019-9-30 11:10 | 显示全部楼层
stusun 发表于 2019-9-30 10:21
是的,我只需要按照第一列进行拆分,但是如果我增加数据,按照这种方式拆分的话也只能拆分两个工作表。

怎么可能,第一列是整列都存入字典的。除非你新增的还是1跟2
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 14:28 , Processed in 0.040753 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表