【问题标题】:Insert 10000+ rows in an Excel sheet在 Excel 工作表中插入 10000+ 行
【发布时间】:2015-09-22 11:22:20
【问题描述】:

我正在创建一个 Excel 宏,同时从 Excel 工作表(包含超过 10000 行)中提取数据并填充另一个 Excel 工作表。

我必须逐行插入数据,因为对于每一行,我需要根据列值(例如 EMP_ID)从 2-3 个不同的工作表中获取数据。

例如Excel 文件 - 1 有

Emp_ID | Emp_Name | Age

现在,根据每个员工 ID,我需要从其他 3 个 Excel 工作表中获取员工相关数据。所以我必须遍历 10k 条记录。

当我执行代码时,Excel 应用程序会挂起。我认为这是因为我尝试按行插入数据。

有人可以建议一种更快的方法来插入/更新大量行吗?

我已经尝试使用 Variant/Array 来存储数据,然后填充工作表。但它似乎仍然不起作用。

注意:我正在将源文件中的记录读入 RecordSet。 我已经添加了:

Application.DisplayAlerts = False, 
Application.ScreenUpdating = False,
Application.Calculation = xlCalculationManual

然后将其设置回默认值。

【问题讨论】:

  • 你能贴出收集和插入日期的代码吗?

标签: vba excel


【解决方案1】:

我知道这不是一个直接的答案,但有时最好教你如何完成工作,而不是简单地回答。

您的工作需要使用 Access(或任何其他 dbms)来完成。你必须定义三个表,每个表都由 Emp_ID 索引,所有人员都变得简单。

【讨论】:

    【解决方案2】:

    我倾向于同意塞尔吉奥的观点。
    如果使用数据库完全不是一种选择,那么使用数组就是要走的路。

    我已经尝试使用 Variant/Array 来存储数据,然后填充工作表。但它似乎仍然不起作用。

    你能展示你尝试过的代码吗?

    这对我有用:

    Dim arData() As Variant
    ' ... calculate number of rows and columns ...
    ReDim arData(1 To numRows, 1 To numCols)
    
    ' ... populate arData ...
    
    ' Define range with identical dimensions as arData, e.g. insert in second row
    Set rng = sh.Range(sh.Cells(2, 1), sh.Cells(numRows + 1, numCols))
    ' Transfer array to range (this is fast!)
    rng.Value = arData
    

    【讨论】:

      【解决方案3】:

      也同意,Excel 并不是真正的工具。

      如果你被它卡住了,那么试试下面的方法:

      使用类对象作为数据结构,只需将所有查找表读取一次到集合中。例如,创建一个名为 Employee 的类并添加相应的属性。

      Public ID As Long
      Public Age As Integer
      Public Name As String
      

      要阅读它们,您可以这样编写代码...

          Private mEmployeeCol As Collection
      
      
          Dim ws As Worksheet
          Dim empData As Employee
          Dim v As Variant
          Dim r As Long
      
          Set ws = ThisWorkbook.Worksheets("employee stuff")
          v = ws.UsedRange.Value2
          Set mEmployeeCol = New Collection
          For r = LBound(v, 1) To UBound(v, 1)
              Set empData = New Employee
              empData.ID = v(r, 1)
              empData.Name = v(r, 2)
              empData.Age = v(r, 3)
              mEmployeeCol.Add empData, Key:=CStr(empData.ID)
          Next
      

      要查找值,请执行此操作...

          Set empData = mEmployeeCol(CStr(ID))
          v(r, [your col]) = empData.ID
      

      然后,肯定地,用一系列变体填充最终工作表。这很简单......

          Dim v(1 To 10000, 1 To 50) As Variant
          ws.Range("A1").Resize(UBound(v, 1), UBound(v, 2)).Value = v
      

      【讨论】:

        猜你喜欢
        • 2017-07-24
        • 1970-01-01
        • 1970-01-01
        • 2023-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多