Excel 导入 SQL CreateOleObject('Excel.Application')

本文详细介绍了如何使用Visual Basic for Applications (VBA)与Excel结合,通过调用Excel对象模型,从Excel文件中读取数据,并将其导入到数据库中。文章涉及了如何使用`CreateOleObject`创建OLE对象来启动Excel应用程序,如何打开Excel文件,获取工作表中已使用的单元格范围,遍历这些单元格并检查数据是否为空,以及在数据库中插入数据的操作。此外,文章还解释了`UsedRange`属性的作用及其在工作表数据处理中的应用,包括返回已使用单元格的行数、列数、地址以及如何设置工作表中已用单元格区域的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单元接口部分引用 comobj 单元(uses )
procedure TForm1.Button1Click(Sender: TObject);

var excelx,excely : string;
  
begin

    try

      ExcelApp := CreateOleObject('Excel.Application');

      WorkBook := ExcelApp.WorkBooks.Open(opendialog.FileName);//使用opendialog对话框指定
//excel档路径

                                             

      ExcelApp.Visible := false;

      ExcelRowCount := WorkBook.WorkSheets[1].UsedRange.Rows.Count;

      for i := 1 to excelrowcount + 1 do

      begin
        
        excelx := excelapp.Cells[i,1].Value;

        excely := excelapp.Cells[i,2].Value;

        if ((excelapp.Cells[i,1].Value  = '') and (ExcelApp.Cells[i,2].Value = '')) then 
//指定excel档的第 i 行 ,第 1,2(看情况而定)行如果为空就退出,这样的设定,最好是你的档案力这两行//对应数据库中不能为空的数据

          exit

        else

        with query1 do

        begin

          close;
          sql.clear;
sql.add(insert into test(name,address) values(:name,:address));
parambyname('name').asstring := excelx;//excel档的第一列插入到test表的 name栏位;
parambyname('address').asstring := excely;//excel档的第二列插入到test表的 address 栏位;
execsql;
 
        end;
  
      end;

      finally

        WorkBook.Close;

        ExcelApp.Quit;

        ExcelApp := Unassigned;

        WorkBook := Unassigned;

    end;

  end;

解析UsedRange属性
分类:ExcelVBA>>ExcelVBA对象模型编程>>常用对象>>Worksheet对象
如果您想知道当前工作表中所有已使用的单元格区域的大小,或者您想引用当前工作表中已使用的区域,那么您可能就要想到UsedRange属性了。
UsedRange属性应用于Worksheet对象,返回指定工作表中已使用区域的Range对象,即返回工作表中已使用的单元格区域。因此,该属性也可以用于选取单元格区域。
Sub Sample01()
Worksheets("Sheet1").UsedRange.Select
End Sub

UsedRange属性的一些常见用法
(1) 返回工作表中已使用区域的行数或列数
语句Activesheet.UsedRange.Rows.count返回当前工作表中已使用单元格区域的行数。同样,语句Activesheet.UsedRange.Columns.count返回当前工作表中已使用单元格区域的列数。在上例中,您可以在调试窗口中输入下面语句,将返回相应的值。
?Activesheet.UsedRange.Rows.count
20
?Activesheet.UsedRange.Columns.count
4
一般写法为<在此输入引用对象>.UsedRange.Rows.Count<在此输入引用对象>.UsedRange.Columns.Count
(2) 返回工作表中已使用单元格区域的地址
语句Activesheet.UsedRange.Address 返回当前工作表已使用单元格区域的地址。在上例中,您可以在调试窗口中输入下面语句,将返回已使用单元格区域地址为$A$1:$D$20。
?Activesheet.UsedRange.Address
$A$1:$D$20

一般写法为<在此输入引用对象>.UsedRange.Address
(3) 设置工作表中已使用单元格区域对象,并进行引用或操作。如下代码所示:
Dim cellRange As Range,RowNum As Long,ColNum As Long
Set cellRange=Worksheets(“Sheet1”).UsedRange ‘设置已用单元格区域并赋值给变量
RowNum=cellRange.Rows.Count ‘已用单元格区域的行数
ColNum=cellRange.Columns.Count ‘已用单元格区域的列数

UsedRange属性示例
现在,我们举几个例子,进一步说明UsedRange属性的用法。
[示例一]下面的程序在活动工作表已使用单元格区域中,当该区域不包含任何公式时,清除该区域不能打印的字符。其中,ActiveSheet.UsedRange 代表当前工作表中已使用单元格区域组成的Range对象。(By Chip Pearson)
Sub CleanUp()
Dim TheCell As Range
For Each TheCell In ActiveSheet.UsedRange
    With TheCell
      If .HasFormula = False Then
        .Value = Application.WorksheetFunction.Clean(.Value)
      End If
    End With
Next TheCell
End Sub

示例二]下面的程序将当前工作表中已用单元格区域或所选单元格中第一个字符删除,其中,ActiveSheet.UsedRange.Address代表当前工作表中已用单元格区域的地址。
Public Sub Delete_First_Character(Optional ByRef objRange As Range = Nothing)
Dim objCell As Range
On Error Resume Next
If (objRange Is Nothing) Then
     Set objRange = Application.InputBox(Prompt:="请选择单元格区域", _
        Title:="删除第一个字符", _
        Type:=8, _
        Default:=ActiveSheet.UsedRange.Address) '设置缺省选区为已用区域
End If
Err.Clear
Set objRange = objRange.SpecialCells(xlCellTypeConstants)
If (Err.Number <> 0&) Or (objRange Is Nothing) Then
    MsgBox "在指定的单元格区域中没有符合要求的单元格.", _
    vbExclamation Or vbOKOnly, _
    ActiveWorkbook.Name
    Exit Sub
End If
On Error GoTo Exit_Delete_First_Character
Application.ScreenUpdating = False
For Each objCell In objRange
    objCell = Mid$(objCell, 2)
Next objCell
Exit_Delete_First_Character:
On Error Resume Next
Application.ScreenUpdating = True
End Sub

示例三]在本示例中,当您在工作表的E列中的单元格中输入“finish”后,点击右侧按钮,将会对此行用指定的背景色进行标识,如图3和图4。
500){this.resized=true;this.style.width=500;}" resized="true">
图3:在E8单元格中输入“finish”
500){this.resized=true;this.style.width=500;}" resized="true">
图4:点击按钮后的效果
当您删除单元格E6中的数据,如下图5所示。
500){this.resized=true;this.style.width=500;}" resized="true">
图5:删除单元格E6中的数据
500){this.resized=true;this.style.width=500;}" resized="true">
图6:点击按钮后的效果
本示例中按钮所附加的代码如下,其中,UsedRange.Rows.Count表示当前工作表中已使用区域的行数。
Private Sub CommandButton1_Click()
Dim r As Long
For r = UsedRange.Rows.Count To 1 Step -1
    If Range("E" & r) = "finish" Then _
      Range("A:G").Rows(r).Interior.ColorIndex = 10
    Next r
For r = UsedRange.Rows.Count To 1 Step -1
    If Range("E" & r) = "" Then _
      Range("A:G").Rows(r).Interior.ColorIndex = 2
Next r
End Sub
[提示]您可以将此代码放置在工作表变化事件中,这样,当工作表变化时,符合条件的相应行会自动标记背景色。

[示例四]本示例演示了删除行操作,即在活动工作表已使用单元格区域中,若某单元格中包含有“AND”(如为ANDXXX或XXXANDXX或XXXAND等,不区分大小写),则删除该单元格所在行。ActiveSheet.UsedRange.Find(what)表示在当前工作表所有已使用单元格区域中查找含有变量what中的内容的单元格,程序代码如下:(by Patrick Molloy)
Sub Find_AND()
Dim rng As Range
Dim what As String
what = "AND"
Do
    Set rng = ActiveSheet.UsedRange.Find(what)
    If rng Is Nothing Then
      Exit Do
    Else
       Rows(rng.Row).Delete
    End If
Loop
End Sub
[提示]您可以更改程序中所查找的字符,从而实现您所想要的目的。

<!--

-->

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值