Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
性能问题“;“内存不足”;宏vba Excel-解析数据_Excel_Vba_Parsing - Fatal编程技术网

性能问题“;“内存不足”;宏vba Excel-解析数据

性能问题“;“内存不足”;宏vba Excel-解析数据,excel,vba,parsing,Excel,Vba,Parsing,我已经构建了一些代码,这些代码应该根据唯一值解析数据,然后为每个唯一值创建一个新的工作表。我的初始表有10列和大约25K行。该代码最多可用于8500行。在上面,我得到了错误消息 内存不足等 Excel 64位无法安装在我们的工作机器上。。。有什么解决办法吗?我只需要这个代码在不到3小时内运行,这将是一个巨大的胜利!谢谢 Sub Split_data() Dim lr As Long Dim ws As Worksheet Dim vcol, i As Integer Dim icol As Lo

我已经构建了一些代码,这些代码应该根据唯一值解析数据,然后为每个唯一值创建一个新的工作表。我的初始表有10列和大约25K行。该代码最多可用于8500行。在上面,我得到了错误消息

内存不足等

Excel 64位无法安装在我们的工作机器上。。。有什么解决办法吗?我只需要这个代码在不到3小时内运行,这将是一个巨大的胜利!谢谢

Sub Split_data()
Dim lr As Long
Dim ws As Worksheet
Dim vcol, i As Integer
Dim icol As Long
Dim myarr As Variant
Dim title As String
Dim titlerow As Integer
Dim OutPut As Integer



 'This macro splits data into multiple worksheets based on the variables on a column found in Excel.
 'An InputBox asks you which columns you'd like to filter by, and it just creates these worksheets.

Application.ScreenUpdating = False
vcol = Application.InputBox(prompt:="Which column would you like to filter by?", title:="Filter column", Default:="10", Type:=1)
Set ws = Worksheets("Import") 'change worhseet name when necessary
lr = ws.Cells(ws.Rows.Count, vcol).End(xlUp).Row
title = "A1:J14"
titlerow = ws.Range(title).Cells(1).Row
icol = ws.Columns.Count
ws.Cells(1, icol) = "Unique"
For i = 3 To lr
    On Error Resume Next
    If ws.Cells(i, vcol) <> "" And Application.WorksheetFunction.Match(ws.Cells(i, vcol), ws.Columns(icol), 0) = 0 Then
        ws.Cells(ws.Rows.Count, icol).End(xlUp).Offset(1) = ws.Cells(i, vcol)
    End If
Next
Application.ScreenUpdating = False
myarr = Application.WorksheetFunction.Transpose(ws.Columns(icol).SpecialCells(xlCellTypeConstants))
ws.Columns(icol).Clear

For i = 3 To UBound(myarr)
    ws.Range(title).AutoFilter field:=vcol, Criteria1:=myarr(i) & ""
    If Not Evaluate("=ISREF('" & myarr(i) & "'!A1)") Then
        Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = myarr(i) & ""
    Else
        Sheets(myarr(i) & "").Move after:=Worksheets(Worksheets.Count)
    End If
    ws.Range("A" & titlerow & ":A" & lr).EntireRow.Copy Sheets(myarr(i) & "").Range("A1")
    Sheets(myarr(i) & "").Columns.AutoFit

Next

ws.AutoFilterMode = False
ws.Activate
Sheets("Instructions").Select

OutPut = MsgBox("Data successfully parsed", vbInformation, "Confirmation")
End Sub
Sub-Split_data()
变暗lr为长
将ws设置为工作表
Dim vcol,i作为整数
如长
Dim myarr作为变异体
将标题设置为字符串
作为整数的Dim titlerow
将输出设置为整数
'此宏根据Excel中某列的变量将数据拆分为多个工作表。
'一个输入框询问您要根据哪些列进行筛选,它只创建这些工作表。
Application.ScreenUpdating=False
vcol=Application.InputBox(提示:=“您希望按哪个列进行筛选?”,标题:=“筛选列”,默认值:=“10”,类型:=1)
设置ws=工作表(“导入”)'必要时更改工作表名称
lr=ws.Cells(ws.Rows.Count,vcol).End(xlUp).Row
title=“A1:J14”
titlerow=ws.Range(title).Cells(1).Row
icol=ws.Columns.Count
ws.Cells(1,icol)=“唯一”
对于i=3至lr
出错时继续下一步
如果ws.Cells(i,vcol)“”和Application.WorksheetFunction.Match(ws.Cells(i,vcol),ws.Columns(icol),0)=0,则
ws.Cells(ws.Rows.Count,icol).End(xlUp).Offset(1)=ws.Cells(i,vcol)
如果结束
下一个
Application.ScreenUpdating=False
myarr=Application.WorksheetFunction.Transpose(ws.Columns(icol).SpecialCells(xlCellTypeConstants))
ws.Columns(icol).清除
对于i=3至UBound(myarr)
ws.Range(title).AutoFilter字段:=vcol,标准1:=myarr(i)&“”
如果不进行评估(“=ISREF(”&myarr(i)&“!A1)”),则
Sheets.Add(之后:=工作表(Worksheets.Count)).Name=myarr(i)和“”
其他的
工作表(myarr(i)和“”)。移动后:=工作表(Worksheets.Count)
如果结束
ws.Range(“A”&标题栏&“:A”&标题栏).EntireRow.Copy图纸(myarr(i)&“).Range(“A1”)
图纸(myarr(i)和“”).Columns.AutoFit
下一个
ws.AutoFilterMode=False
ws.Activate
工作表(“说明”)。选择
输出=MsgBox(“数据成功解析”,vbInformation,“确认”)
端接头
这对我很有用:

编辑-更新为帐户>1标题行

Sub-Split_data()
Const NUM_HEADER_行长=14
将ws作为工作表、wb作为工作簿、dict作为对象
变光tbl作为范围,RNG作为范围,arr,r作为长度,k,vcol,v
暗rngData As范围
设置wb=ActiveWorkbook'或Thisworkbook
设置ws=工作表(“导入”)
在整个表格中设置tbl=ws.Range(“A1”).CurrentRegion
设置rngHeaders=tbl.Resize(NUM_HEADER_ROWS)'所有标题
设置rngData=tbl.偏移量(页眉行数)_
.Resize(tbl.Rows.Count-NUM_HEADER_Rows)'仅调整数据大小
vcol=Application.InputBox(提示:=“&ws.Name&_
“'您要按筛选吗?”_
标题:=“筛选列”,默认值:=“10”,类型:=1)
'收集所选列中的所有唯一值
Set dict=CreateObject(“scripting.dictionary”)
arr=ws.Range(ws.Cells(rngData.Rows(1.Row,vcol))_
ws.Cells(Rows.Count,vcol).End(xlUp)).Value
对于r=1至UBound(arr,1)
v=arr(r,1)
如果Len(v)>0且不存在dict.Exists(v),则dict.Add v,True
下一个r
'如果将创建大量图纸,则发出警告
如果听写计数>30,则
如果MsgBox(“这将创建”&dict.Count&“新工作表。是否继续?”_
vbQuestion+vbYesNo,标题:=“是否继续?”)vbYes然后退出Sub
如果结束
Application.ScreenUpdating=False
'创建图纸并过滤/复制数据
对于dict中的每个k
设置ws=wb.Sheets.Add(之后:=wb.Sheets(wb.Sheets.Count))
rngHeaders.Copy ws.Range(“a1”)
rngData.Parent.Rows(NUM_HEADER_Rows)。自动筛选字段:=vcol,准则1:=k
rngData.SpecialCells(xlCellTypeVisible)。复制ws.Cells(NUM\u HEADER\u ROWS+1,1)
tbl.Parent.ShowAllData
下一个
MsgBox“数据已成功解析”,vbInformation,“确认”
端接头
这对我很有用:

编辑-更新为帐户>1标题行

Sub-Split_data()
Const NUM_HEADER_行长=14
将ws作为工作表、wb作为工作簿、dict作为对象
变光tbl作为范围,RNG作为范围,arr,r作为长度,k,vcol,v
暗rngData As范围
设置wb=ActiveWorkbook'或Thisworkbook
设置ws=工作表(“导入”)
在整个表格中设置tbl=ws.Range(“A1”).CurrentRegion
设置rngHeaders=tbl.Resize(NUM_HEADER_ROWS)'所有标题
设置rngData=tbl.偏移量(页眉行数)_
.Resize(tbl.Rows.Count-NUM_HEADER_Rows)'仅调整数据大小
vcol=Application.InputBox(提示:=“&ws.Name&_
“'您要按筛选吗?”_
标题:=“筛选列”,默认值:=“10”,类型:=1)
'收集所选列中的所有唯一值
Set dict=CreateObject(“scripting.dictionary”)
arr=ws.Range(ws.Cells(rngData.Rows(1.Row,vcol))_
ws.Cells(Rows.Count,vcol).End(xlUp)).Value
对于r=1至UBound(arr,1)
v=arr(r,1)
如果Len(v)>0且不存在dict.Exists(v),则dict.Add v,True
下一个r
'如果将创建大量图纸,则发出警告
如果听写计数>30,则
如果MsgBox(“这将创建”&dict.Count&“新工作表。是否继续?”_
vbQuestion+vbYesNo,标题:=“是否继续?”)vbYes然后退出Sub
如果结束
Application.ScreenUpdating=False
'创建图纸并过滤/复制数据
对于dict中的每个k
设置ws=wb.Shee