从VBA中的excel中选择多列

Posted

技术标签:

【中文标题】从VBA中的excel中选择多列【英文标题】:select multiple column from excel in VBA 【发布时间】:2018-02-12 08:04:11 【问题描述】:

如何使用 Vba 在 Excel 文件中选择多个列。因为我的 excel 文件包含 580 列。

我尝试使用下面的查询,但它只能选择 255 列。

Dim ExcelConnection As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & TxtPath.Text & "; Extended Properties=""Excel 12.0 Xml; HDR=Yes""")
        ExcelConnection.Open()

        Dim expr As String = "select * FROM [Sheet1$]"
        Dim objCmdSelect As OleDbCommand = New OleDbCommand(expr, ExcelConnection)
        Dim objDR As OleDbDataReader

        Dim SQLconn As New SqlConnection()
        Dim ConnString As String = "data source=" & DBServer1 & "; initial catalog=" & DBDataBase1 & "; persist security info=true; user id=" & DBUSer1 & "; password=" & DBPass1
        SQLconn.ConnectionString = ConnString
        SQLconn.Open()

        Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(SQLconn)
            bulkCopy.DestinationTableName = "TMP_UPLOAD_ISP"

            Try
                objDR = objCmdSelect.ExecuteReader
                bulkCopy.WriteToServer(objDR)
                objDR.Close()
                SQLconn.Close()

            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try

我尝试使用选择列标题(要选择的 220 列),它会出现错误,直到我减少到 100 列。

Dim ExcelConnection As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & TxtPath.Text & "; Extended Properties=""Excel 12.0 Xml; HDR=Yes""")
        ExcelConnection.Open()

        Dim expr As String = "select Plan_Year,Colom4,Colom6,Colom7,Colom21,Colom22,Colom24,Colom25,Colom27,Colom28,Colom33,Colom34,Colom38,Colom39,Colom41,Colom42,Colom47,Colom48,Colom49,Colom50,Colom51,Colom52,Colom66,Colom67,Colom69,Colom70,Colom72,Colom73,Colom78,Colom79,Colom83,Colom84,Colom86,Colom87,Colom92,Colom93,Colom94,Colom95,Colom96,Colom97,Colom111,Colom112,Colom114,Colom115,Colom117,Colom118,Colom123,Colom124,Colom128,Colom129,Colom131,Colom132,Colom137,Colom138,Colom139,Colom140,Colom141,Colom142,Colom156,Colom157,Colom159,Colom160,Colom162,Colom163,Colom168,Colom169,Colom173,Colom174,Colom176,Colom177,Colom182,Colom183,Colom184,Colom185,Colom186,Colom187,Colom201,Colom202,Colom204,Colom205,Colom207,Colom208,Colom213,Colom214,Colom218,Colom219,Colom221,Colom222,Colom227,Colom228,Colom229,Colom230,Colom231,Colom232,Colom246,Colom247,Colom249,Colom250,Colom252,Colom253,Colom258,Colom259,Colom263,Colom264,Colom266,Colom267,Colom272,Colom273,Colom274,Colom275,Colom276,Colom277,Colom303,Colom304,Colom306,Colom307,Colom309,Colom310,Colom315,Colom316,Colom320,Colom321,Colom323,Colom324,Colom329,Colom330,Colom331,Colom332,Colom333,Colom334,Colom348,Colom349,Colom351,Colom352,Colom354,Colom355,Colom360,Colom361,Colom365,Colom366,Colom368,Colom369,Colom374,Colom375,Colom376,Colom377,Colom378,Colom379,Colom393,Colom394,Colom396,Colom397,Colom399,Colom400,Colom406,Colom407,Colom410,Colom411,Colom413,Colom414,Colom419,Colom420,Colom421,Colom422,Colom423,Colom424,Colom438,Colom439,Colom441,Colom442,Colom444,Colom445,Colom450,Colom451,Colom455,Colom456,Colom458,Colom459,Colom464,Colom465,Colom466,Colom467,Colom468,Colom469,Colom483,Colom484,Colom486,Colom487,Colom489,Colom490,Colom495,Colom496,Colom500,Colom501,Colom503,Colom504,Colom509,Colom510,Colom511,Colom512,Colom513,Colom514,Colom528,Colom529,Colom531,Colom532,Colom534,Colom535,Colom540,Colom541,Colom545,Colom546,Colom548,Colom549,Colom554,Colom555,Colom556,Colom557,Colom558,Colom559 FROM [Sheet1$]"
        Dim objCmdSelect As OleDbCommand = New OleDbCommand(expr, ExcelConnection)
        Dim objDR As OleDbDataReader

        Dim SQLconn As New SqlConnection()
        Dim ConnString As String = "data source=" & DBServer1 & "; initial catalog=" & DBDataBase1 & "; persist security info=true; user id=" & DBUSer1 & "; password=" & DBPass1
        SQLconn.ConnectionString = ConnString
        SQLconn.Open()

        Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(SQLconn)
            bulkCopy.DestinationTableName = "TMP_UPLOAD_ISP"

            Try
                objDR = objCmdSelect.ExecuteReader
                bulkCopy.WriteToServer(objDR)
                objDR.Close()
                SQLconn.Close()

            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try

如何选择我想要选择的列(间歇性 220 列)。

【问题讨论】:

如果您要先执行与 Excel 相关的功能以返回数据,然后再操作到数据库中会怎样?即最初使用本机 Excel 函数。 【参考方案1】:

您正在使用 ACE 提供程序,这意味着您受到 MS Access 限制的约束。 Access 的最大字段限制为 255(请参阅:Access 2016 specifications)。

根据源工作表,您可以使用范围查询来检索多个结果集,然后将它们合并。

Select * From [SheetName$A1:IU]

然后

Select * From [SheetName$UI1:SQ]

“UI”列是第 255 列,“SQ”列是第 511 列。

如果您不熟悉此范围语法,则省略结束列上的行会告诉它从起始行开始查找,直到在列范围中找不到数据。

【讨论】:

我认为它不起作用,因为在 [SheetName$A1:IU] 和 [SheetName$UI1:SQ] 之间没有可以加入的密钥。

以上是关于从VBA中的excel中选择多列的主要内容,如果未能解决你的问题,请参考以下文章

vba excel 去掉单元格中隐藏着的双引号或单引号 (多列含有,希望得到一次性清楚)

EXCEL VBA 将多列转换为多行,列之间有间隙

如何从访问数据库中的左连接中选择excel表 - EXCEL VBA

VBA Excel - 从 Excel 中的一个单元格中选择一个值以更新 SQL 表

excel中能否将一列数据分成多列?

VBA代码根据excel工作簿中的值从webform下拉列表中选择一个值