首页 文章

VBA程序删除excel中的行并移动已删除的行以访问数据库

提问于
浏览
-1

我试图在Excel中创建一个VBA程序来删除某些行并将这些已删除的行发送到访问数据库 . 这就是我想要的 workflow

  • 个人下载一个名为print.xlsx的CSV文件,该文件在Excel中打开,包含类似于下表所示的内容(显然此处的内容是随机的)

  • 那个人还有一个主要的工作簿(看起来与此类似),它总是在桌面上打开,我们称之为mike.xlsm

  • 该个人单击mike.xlsm中的一个按钮,该按钮执行应执行以下操作的宏:

  • 删除mike.xlsm中未包含在print.xlsx中的所有行(基于标识号(在标志列中) . 没有数字会复制,因此这不是问题 .

  • 从print.xlsx获取不在mike.xlsm中的任何行,并将它们添加到mike.xlsm,因此基本上,mike.xlsm存在与print.xlsx相同的行 . 这样做的原因是print.xlsx不包含mike.xlsm所做的所有列 . 但是,这不应该干扰代码,因为列位于两个工作簿中存在的列之后 . 麦克风工作簿中的其他列用于用户输入 .

  • 将这些已删除的行发送到Access数据库,但是将附加列附加到包含工作簿名称(mike)的那些行,以便将来轻松查询多个人

我目前用于删除行的代码是:

Sub Delete_DNE()
    Dim lRow As Long
    Dim iCntr As Long
    lRow = 4000
    For iCntr = lRow To 1 Step -1
        If Cells(iCntr, 5).Value = "DNE" Then
            Rows(iCntr).Delete
        End If
    Next
    End Sub

My question is: Does anyone have good code that will execute the above workflow, or suggestions for part of the code, to ultimately get to the full workflow?

我只是手动使用vlookup确定需要标记的内容"DNE"这意味着它在print.xlsx中不存在,然后手动将不在mike中的print.xlsx行复制到mike中 . 显然,如果我们希望有几个员工这样做,以及一个大型的条目访问数据库,这不是一种自动或有效的方法 . 谢谢!

以下代码在一个标记为可能重复的问题中,并且有用,但没有解决问题,主要是因为它将整个工作表传输到访问而不仅仅是特定的行;我只希望发送的已删除行访问:

Sub AccImport()
  Dim acc As New Access.Application
  acc.OpenCurrentDatabase "C:\Users\Public\Database1.accdb"
  acc.DoCmd.TransferSpreadsheet _
          TransferType:=acImport, _
          SpreadSheetType:=acSpreadsheetTypeExcel12Xml, _
          TableName:="tblExcelImport", _
          Filename:=Application.ActiveWorkbook.FullName, _
          HasFieldNames:=True, _
          Range:="Folio_Data_original$A1:B10"
  acc.CloseCurrentDatabase
  acc.Quit
  Set acc = Nothing
End Sub

Excel sheet

2 回答

  • 1

    好的,我会这样做的 . 这是非常通用的......需要由您修改以满足您的特定需求......

    从Column2开始在ColumnI中显示'Sheet2'的任何内容(如果没有 Headers ,可能想要在Row1中开始),会从Sheet1剪切/粘贴到Sheet2

    Sub MoveSheet2()
        Dim i As Variant
        Dim endrow As Integer
        Dim Sheet1 As Worksheet, Sheet2 As Worksheet
    
        Set Sheet1 = ActiveWorkbook.Sheets("Sheet1")
        Set Sheet2 = ActiveWorkbook.Sheets("Sheet2")
    
        endrow = Sheet1.Range("A" & Sheet1.Rows.Count).End(xlUp).Row
    
        For i = 2 To endrow
            If Sheet1.Cells(i, "I").Value = "Sheet2" Then
               Sheet1.Cells(i, "I").EntireRow.Cut Destination:=Sheet2.Range("A" & Sheet2.Rows.Count).End(xlUp).Offset(1)
            End If
        Next
    End Sub
    

    现在,将所有内容从Sheet2移动到Access DB .

    Sub ADOFromExcelToAccess()
    ' exports data from the active worksheet to a table in an Access database
    ' this procedure must be edited before use
    Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long
        ' connect to the Access database
        Set cn = New ADODB.Connection
        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
            "Data Source=C:\FolderName\DataBaseName.mdb;"
        ' open a recordset
        Set rs = New ADODB.Recordset
        rs.Open "TableName", cn, adOpenKeyset, adLockOptimistic, adCmdTable  
        ' all records in a table
        r = 2 ' the start row in the worksheet
        Do While Len(Range("A" & r).Formula) > 0 
        ' repeat until first empty cell in column A
            With rs
                .AddNew ' create a new record
                ' add values to each field in the record
                .Fields("FieldName1") = Range("A" & r).Value
                .Fields("FieldName2") = Range("B" & r).Value
                .Fields("FieldNameN") = Range("C" & r).Value
                ' add more fields if necessary...
                .Update ' stores the new record
            End With
            r = r + 1 ' next row
        Loop
        rs.Close
        Set rs = Nothing
        cn.Close
        Set cn = Nothing
    End Sub
    
  • 1

    多年来我没有用VBA编码,但你当然可以做你所描述的 . 这个过程会像:

    • 创建空数组以保存已删除的行(数组) .

    • 迭代您的行,在删除之前,将该数据推送到tempArray .

    • 迭代完所有行后,将tempArray写入数据库 .

相关问题