首页 文章

在Excel工作表中插入10000行

提问于
浏览
0

我正在创建Excel宏,同时从Excel工作表(包含超过1万行)中提取数据并填充另一个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

然后将其设置回默认值 .

3 回答

  • 1

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

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

  • 1

    我倾向于同意塞尔吉奥 .
    如果使用数据库完全不是一个选项,那么使用数组是可行的方法 .

    我已经尝试使用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
    
  • 1

    同意,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
    

    然后,肯定的是,DEFINITELY使用一系列变体填充最终的工作表 . 这很直接......

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

相关问题