需要一些关于如何流式访问/ExcelVBA的建议吗

需要一些关于如何流式访问/ExcelVBA的建议吗,excel,ms-access,vba,Excel,Ms Access,Vba,我写了这个Access/VBA程序。它可以工作,但只有当我没有运行其他应用程序或数据库中的用户很少时,它才能工作。我需要一些关于简化代码的想法。因此,它不是系统密集型的。该程序基本上允许用户选择一个文件夹,然后将该文件夹中的所有工作表合并到一个excel文档中。我目前的想法是告诉用户在运行程序时关闭所有excel文件。请帮助: Sub Excel_open() Dim myXL As Excel.Application Dim myXLS As Excel.Workbook Const err

我写了这个Access/VBA程序。它可以工作,但只有当我没有运行其他应用程序或数据库中的用户很少时,它才能工作。我需要一些关于简化代码的想法。因此,它不是系统密集型的。该程序基本上允许用户选择一个文件夹,然后将该文件夹中的所有工作表合并到一个excel文档中。我目前的想法是告诉用户在运行程序时关闭所有excel文件。请帮助:

Sub Excel_open()

Dim myXL As Excel.Application
Dim myXLS As Excel.Workbook
Const errExcelNotRunning = 429

On Error GoTo HandleIt
    Set myXL = GetObject(, "Excel.application")
    myXL.Visible = True
    Set myXLS = myXL.Workbooks.Add

    Call CombineWorkbooks(myXL)

HandleIt:

If Err.Number = errExcelNotRunning Then
    Set myXL = CreateObject("Excel.Application")
    Err.Clear
    Resume Next
End If

End Sub
Sub CombineWorkbooks(myXL)


'Macro that combines the files into one folder
    myXL.AskToUpdateLinks = False
    myXL.DisplayAlerts = False

    Dim CurFile As String, dirloc As String, strNamesheet As String
    Dim DestWB As Workbook
    Dim ws As Object ' allows for diffrent sheet types

    'Add select the director function

    dirloc = GetFolderName & "\" 'location of files not working want to select the file only
    CurFile = Dir(dirloc & "*.xls*")

    myXL.ScreenUpdating = False
    myXL.EnableEvents = False

    Set DestWB = Workbooks.Add(xlWorksheet)

    Do While CurFile <> vbNullString
        Dim OrigWB As Workbook
        Set OrigWB = Workbooks.Open(FileName:=dirloc & CurFile, ReadOnly:=True)

        'need to change a name active name is not doing it

        CurFile = Left(CurFile, 4) ' This is no longer 29

        'CurFile = Left(Left(CurFile, Len(CurFile) - 5), 29)

        For Each ws In OrigWB.Sheets
            ws.Copy After:=DestWB.Sheets(DestWB.Sheets.Count)

            ' Use the name to give the sheet a name

            strNamesheet = Left((ws.Name), 25) & ";"

            If OrigWB.Sheets.Count > 1 Then
                DestWB.Sheets(DestWB.Sheets.Count).Name = strNamesheet & CurFile ' & ws.Index
            Else
               DestWB.Sheets(DestWB.Sheets.Count).Name = CurFile
            End If
        Next

        OrigWB.Close SaveChanges:=False
        CurFile = Dir

    Loop

    myXL.DisplayAlerts = False
    DestWB.Sheets(1).Delete
    myXL.DisplayAlerts = True


    myXL.ScreenUpdating = True
    myXL.EnableEvents = True

    Set DestWB = Nothing

   Call Delete_empty_Sheets(myXL)
   Call Sort_Active_Book

   MsgBox "Done"

   'Call Xcombine_the_Matching

End Sub
Sub Delete_empty_Sheets(myXL)
'goes through all sheets and deletes

Reset_the_search:

For Each wsElement In Worksheets
    If wsElement.Range("A2") = "" And wsElement.Range("B2") = "" Then
        myXL.DisplayAlerts = False
        wsElement.Delete
        GoTo Reset_the_search
        myXL.DisplayAlerts = True

    End If
Next wsElement

End Sub



Sub Xcombine_the_Matching()
    'I think I can make the order work
    'change and transpose the array
    Dim varStart As Variant
    Dim wsCompare As Worksheet

    Dim strMatch As String


    'Dim varCompare As Variant

    Dim strVareince As String
    Dim strCurrentName As String

    'you need to build a loop to solve this problem

    For Each wsCompare In Worksheets

        strVareince = Add_Array(Application.Transpose(wsCompare.Range("A1:Z1")))

        For Each wsNompare In Worksheets

            If wsNompare.Name <> strCurrentName Then
                If strVareince = Add_Array(Application.Transpose(wsNompare.Range("A1:Z1"))) Then
                    MsgBox ("Matched with worksheet " & wsNompare.Name)
                End If

            End If

        Next

    Next

End Sub

Function array_to_string(x) As String
    For Z = 1 To 26
        array_to_string = array_to_string & x(Z, 1) & ";"
    Next Z

End Function

Function GetFolderName(Optional OpenAt As String) As String
    'Allows you to select the folder director that you want to combine
    Dim lCount As Long

    GetFolderName = vbNullString

    With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = OpenAt
        .Show
        For lCount = 1 To .SelectedItems.Count
            GetFolderName = .SelectedItems(lCount)
        Next lCount
    End With
End Function

Function Add_Array(x) As String
    'turns an excel document
    For d = 1 To UBound(x)
        Add_Array = Add_Array & x(d, 1)
    Next d

End Function

Sub Read_data()

'this the

End Sub

Sub Sort_Active_Book()
Dim i As Integer
Dim j As Integer
Dim iAnswer As VbMsgBoxResult
'
' Prompt the user as which direction they wish to
' sort the worksheets.
'
   iAnswer = MsgBox("Sort Sheets in Ascending Order?" & Chr(10) _
     & "Clicking No will sort in Descending Order", _
     vbYesNoCancel + vbQuestion + vbDefaultButton1, "Sort Worksheets")
   For i = 1 To Sheets.Count
      For j = 1 To Sheets.Count - 1
'
' If the answer is Yes, then sort in ascending order.
'
         If iAnswer = vbYes Then
            If UCase$(Sheets(j).Name) > UCase$(Sheets(j + 1).Name) Then
               Sheets(j).Move After:=Sheets(j + 1)
            End If
'
' If the answer is No, then sort in descending order.
'
         ElseIf iAnswer = vbNo Then
            If UCase$(Sheets(j).Name) < UCase$(Sheets(j + 1).Name) Then
               Sheets(j).Move After:=Sheets(j + 1)
            End If
         End If
      Next j
   Next i
End Sub
子Excel_open()
Dim myXL作为Excel.Application
将myXLS设置为Excel.工作簿
常数errExcelNotRunning=429
关于GoTo HandleIt错误
设置myXL=GetObject(,“Excel.application”)
myXL.Visible=True
设置myXLS=myXL.Workbooks.Add
调用CombineWorkbooks(myXL)
汉德莱特:
如果Err.Number=errExcelNotRunning,则
设置myXL=CreateObject(“Excel.Application”)
呃,明白了
下一步继续
如果结束
端接头
子组合工作簿(myXL)
'将文件合并到一个文件夹中的宏
myXL.AskToUpdateLinks=False
myXL.DisplayAlerts=False
Dim CurFile作为字符串,dirloc作为字符串,strNamesheet作为字符串
将WB设置为工作簿
Dim ws As Object“允许不同的纸张类型
'添加并选择控制器功能
dirloc=GetFolderName&“\”文件不工作的位置要仅选择文件吗
CurFile=Dir(dirloc&“*.xls*”)
myXL.screenUpdate=False
myXL.EnableEvents=False
设置DestWB=Workbooks.Add(xlWorksheet)
执行CurFile vbNullString时
Dim OrigWB As工作簿
设置OrigWB=Workbooks.Open(文件名:=dirloc&CurFile,只读:=True)
'需要更改名称活动名称不需要更改名称
CurFile=Left(CurFile,4)'这不再是29
'CurFile=Left(Left(CurFile,Len(CurFile)-5),29)
对于原始工作表中的每个ws
ws.Copy After:=DestWB.Sheets(DestWB.Sheets.Count)
'使用名称为工作表命名
strNamesheet=左((ws.Name),25)和“
如果OrigWB.Sheets.Count>1,则
DestWB.Sheets(DestWB.Sheets.Count).Name=strnameseet&CurFile'&ws.Index
其他的
DestWB.Sheets(DestWB.Sheets.Count).Name=CurFile
如果结束
下一个
OrigWB.Close SaveChanges:=False
CurFile=Dir
环
myXL.DisplayAlerts=False
目的工作表(1).删除
myXL.DisplayAlerts=True
myXL.screenUpdate=True
myXL.EnableEvents=True
设置DestWB=Nothing
调用删除空工作表(myXL)
调用排序\u活动\u书本
MsgBox“完成”
'调用Xcombine\u匹配
端接头
子删除空白工作表(myXL)
'遍历所有工作表并删除
重置\u搜索:
对于工作表中的每个wsElement
如果wsElement.Range(“A2”)为“”,wsElement.Range(“B2”)为“”,则
myXL.DisplayAlerts=False
wsElement.Delete
转到重置搜索
myXL.DisplayAlerts=True
如果结束
下一个wsElement
端接头
子Xcombine__匹配()
“我想我可以完成订单
'更改并转置数组
Dim varStart作为变体
作为工作表进行比较
暗格式字符串
“作为变体进行比较
作为字符串的Dim strVareince
Dim strCurrentName作为字符串
“你需要建立一个循环来解决这个问题
对于每个工作表,请在工作表中进行比较
strVareince=Add_数组(Application.Transpose(wsCompare.Range(“A1:Z1”))
对于工作表中的每个wsNompare
如果wsNompare.Name strCurrentName,则
如果strVareince=Add_数组(Application.Transpose(wsNompare.Range(“A1:Z1”)),那么
MsgBox(“与工作表匹配”&wsNompare.Name)
如果结束
如果结束
下一个
下一个
端接头
函数数组_到_字符串(x)作为字符串
对于Z=1到26
数组到字符串=数组到字符串&x(Z,1)&“
下一个Z
端函数
函数GetFolderName(可选OpenAt作为字符串)作为字符串
'允许您选择要合并的文件夹控制器
暗淡如长
GetFolderName=vbNullString
使用Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName=OpenAt
显示
对于lCount=1,选择editems.Count
GetFolderName=.SelectedItems(lCount)
下一个帐户
以
端函数
函数将_数组(x)添加为字符串
'打开excel文档
对于d=1到UBound(x)
Add_数组=Add_数组&x(d,1)
下一个d
端函数
子读取_数据()
"这是
端接头
子排序\活动\书本()
作为整数的Dim i
作为整数的Dim j
Dim iAnswer作为VbMsgBoxResult
'
'提示用户他们希望选择的方向
'对工作表进行排序。
'
iAnswer=MsgBox(“按升序排序工作表?”&Chr(10)_
&“单击“否”将按降序排序”_
vbYesNoCancel+vbQuestion+vbDefaultButton1,“对工作表排序”)
对于i=1到1张。计数
对于j=1的板材,计数为-1
'
'如果答案是肯定的,则按升序排序。
'
如果iAnswer=vbYes,则
如果UCase$(Sheets(j).Name)>UCase$(Sheets(j+1).Name),那么
板材(j)。在以下位置移动:=板材(j+1)
如果结束
'
'如果答案是否,则按降序排序。
'
ElseIf iAnswer=vbNo然后
如果UCase$(Sheets(j).Name)
您正在将Excel应用程序对象传递到子例程中,但没有完全使用它,也没有显式引用库:

Sub CombineWorkbooks(myXL)
    Dim DestWB As Excel.Workbook ' <<<
    Set DestWB = myXL.Workbooks.Add(xlWorksheet) ' <<<
End Sub
子组合工作簿(myXL)

Dim DestWB As Excel.工作簿“有两件事是不允许响应的。您想实现什么?你到底有什么问题?多个用户正在尝试访问此功能?你的第一艘潜艇有错误。我们需要知道到底出了什么问题。这太模糊了。