在Excel工作表中插入10000多行

时间:2015-09-22 11:22:21

标签: vba excel-vba excel

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

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

e.g。 Excel文件 - 1有

function select()
            {

                var id = $('#nr_reg').val();
                $.ajax({
                    type: 'post',
                    dataType: 'json',
                    url: '/id',
                    data : {
                        id: id
                    },
                    success: function(data){    
                        data = JSON.parse(data);                    
                        var id = data.id;
                        alert("merge");
                        $('#optic').val(id);
                    },
                    error: function(err){
                        console.log(err);
                    }

                }); 
            }

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

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

有人可以建议更快的方式来插入/更新大量的行。

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

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

Emp_ID | Emp_Name | Age

然后将其设置为默认值。

3 个答案:

答案 0 :(得分:1)

我知道这不是一个直接的答案,但有时候教会如何完成工作会更好,只需回复即可。

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

答案 1 :(得分: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

答案 2 :(得分: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

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

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