学以致用——使用VBA自动筛选数据、自动生成SQL脚本(Auto filtering data and generate SQL statement automatically with VBA)

需求:

要完成同一件事情,通常有多种方式可供选择。如果局限于一种方法,不去探索其他方法,往往会错失一些机会。想想看,如果你能用一半的时间完成你手头的工作,节省下来的时间可以做很多有意义的事情的。通过自动化,让人们从一些简单重复的劳动中解放出来,投入到未知领域的探索中去,这是很有意义的一件事情。

下面这段看上去可能不起眼的代码,实际上大有作为!

代码:

Sub generateScript()

'本程序利用Excel中的相关字段,自动生成向ORACLE数据库中插入新记录的SQL脚本(DML语句)
'这样,就可以用增量更新的方式维护ManuallyCollated数据表
'目前,这部分工作是通过全量导入的方式进行的(需要先drop再创建,然后使用Toad从Excel中导入文件的方式,手动操作过程繁杂,耗时半小时以上)
'增量方式可以节省至少20分钟的工作量
'开发者:Hpd,开发日期:2018年6月13日
'Update Manually Collated data table in an incremental update way in several seconds,
'Rather than using "drop and import" way, which takes 20 mins

Dim Rows As Integer              '工作表“ManuallyCollated_new_”中的行数
Dim scriptRows As Integer           '工作表“Script”中的行数,用于清空现有数据
Dim newSht As Worksheet             '工作表“ManuallyCollated_new”
Dim ScriptSht As Worksheet          '工作表“Script”
Dim maxDate As Date                 '最大日期,用于筛选最新的FSR记录
Const XLMAXROW As Long = 1048576    'Excel 2010中单张数据表的最大行数为1048576行

Set newSht = ThisWorkbook.Worksheets("ManuallyCollated_new")
Set ScriptSht = ThisWorkbook.Worksheets("Script")

Rows = newSht.UsedRange.rows.Count
scriptRows = ScriptSht.UsedRange.rows.Count

ScriptSht.Range("A3:H" & scriptRows).ClearContents          '复制新内容前先清空现有内容


maxDate = Application.WorksheetFunction.Max(newSht.Columns("G"))    'LUD列的列名为"G"

newSht.Range("A1:G" & Rows).AutoFilter Field:=7, Criteria1:=">=" & maxDate - 1       '如果直接用等于maxDate作为条件,筛选出的结果为空

newSht.AutoFilter.Range.Offset(2).SpecialCells(xlCellTypeVisible).Copy ScriptSht.Range("A3")
scriptRows = ScriptSht.Range("A" & XLMAXROW).End(xlUp).Row          '如果使用UsedRange.rows.Count的方式,发现会多出两行无效数据

'自动生成SQL脚本,用于向数据库中存放ManuallyCollated数据的表中插入新记录
For i = 3 To scriptRows
'公式较长,使用续行符(_)进行换行
    ScriptSht.Range("H" & i).Formula = _
    "INSERT INTO USCHEMA.UTABLE (SID, CTY,SID, RD, SRC ) VALUES ('" & _
    ScriptSht.Range("A" & i) & "', '" & ScriptSht.Range("B" & i) & "', " & ScriptSht.Range("C" & i) & ", " & _
    "TO_DATE('" & WorksheetFunction.Text(ScriptSht.Range("D" & i), "YYYY-MM-DD") & "', 'YYYY-MM-DD'), '" & _
    ScriptSht.Range("E" & i) & "');"
Next

ScriptSht.Activate                              '显示Script工作表
ScriptSht.Range("H3:H" & scriptRows).Copy       '将自动生成的SQL脚本复制到粘贴板

End Sub

猜你喜欢

转载自blog.csdn.net/hpdlzu80100/article/details/80727388
今日推荐