英文:
copy and paste from another excel workbook on a shared folder and back to same folder
问题
请原谅我复杂的解释,但我正在尽力解决已经让我感到足够复杂的问题!所以请帮帮我。谢谢。
根据@stringeater的第一个回答,我编辑了我的代码。请检查它,并帮助我调整下一步该怎么做。现在我只在setwbkDATABAS = Nothing
这一行出现错误。
Sub DATA_BASE_ARCHIVE_FullArchive()
Dim rngNEWROUND As Excel.Range
Dim arrNEWROUND As Variant
Dim wbkDATABASE As Excel.Workbook
Dim rngDataTarget As Excel.Range
Dim rngDataSource As Excel.Range
Dim varData As Variant
Dim rngArchive As Excel.Range
Application.ScreenUpdating = False
Set rngNEWROUND = ThisWorkbook.Sheets("NEWROUND").Range("A1:N2000")
arrNEWROUND = ThisWorkbook.Sheets("NEWROUND").Range("A1:N2000").Value
Set wbkDATABASE = Workbooks.Open(filename:="E:\DELEGATION APPLICATION SAMPLE-2023\DATABASE.xlsm")
Set rngDataTarget = wbkDATABASE.Sheets("FullArchive").Range("A2001")
Set rngDataTarget = rngDataTarget.Resize(UBound(arrNEWROUND, 1), UBound(arrNEWROUND, 2))
rngDataTarget.Value = arrNEWROUND
Set rngDataSource = rngDataTarget.Worksheet.Range("A2001")
varData = rngDataSource.Value
wbkDATABASE.Save
wbkDATABASE.Close
Set wbkDATABASE = Nothing '(这里我得到了错误)
Set rngArchive = ThisWorkbook.Sheets("ARCHIVE").Range("A1") '参考范围
rngArchive.Value = varData
ThisWorkbook.Worksheets("ARCHIVE").Sort.SortFields.Clear
ThisWorkbook.Worksheets("ARCHIVE").Sort.SortFields.Add Key:=Columns("L:L"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ThisWorkbook.Worksheets("ARCHIVE").Sort.SortFields.Add Key:=Columns("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ThisWorkbook.Worksheets("ARCHIVE").Sort
.SetRange Columns("A:P")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Application.ScreenUpdating = True
Sheets("FORM").Select
End Sub
英文:
Please bare with me for my below problem I have been working on this for a 3 months and I cant get my head around it.
I have to explain the whole project so that you can understand what I want my code to do:
I have created a user form which is data entry and it will be used by 3 users at the same time each user on a pc has same excel workbook "ENTRY APPLICATION" and data is entered on a sheet called "NEW ROUND" each user data entries have a serial number that starts with 1 - 1000 for example. and another workbook on a shared folder which is there to have all data entered by 3 users be copied and pasted on the shared workbook "DATABASE", then the data collected on the "DATABASE" to be copied again and pasted on same work book "ENTRY APPLICATION" for the users but in another sheet so that it is mirrors to the shared workbook for the user while sorting so that serial number for the data is sorted correctly for each user, fot that I have same workbook for the 3 users but each one just changed the range for them so that their data be copied on a range so that they dont clear other user data entries, for example : user 1 the paste range A1:N2000, user 2 the paste range is A2001:N4000, user 3 paste range is A4001:N6000
then they all get sorted out when pasted again in their workbook which is "DATA APPLICATION" with the user form.
"DATABASE" workbook which is the shared that all collected data is in it , to prevent duplication entries from users (which is in a different module ) but for now my struggle is I'm trying to have that done by less time and more efficient so that I dont have to use the screenupdate and open activate save close workbooks all the time, which can make work slow and might crash.
I have come to read a great thread here now about Parent Object which apparently save great time and errors for my same needs, but I have no idea what so ever how to reflect that on my userform workbook and how to adjust my code.
please help me adjust my code , hope that I have explained it correctly.
Sub DATA_BASE_ARCHIVE_FullArchive()
Application.ScreenUpdating = False
Windows("ENTRY APPLICATION.xlsm").Activate
Sheets("NEWROUND").Select
Range("A1:N2000").Select
Selection.Copy
Workbooks.Open filename:= _
"\-2023\DATABASE.xlsm"
Windows("DATABASE.xlsm").Activate
Range("A2001").Select
Sheets("FullArchive").Paste
Cells.Select
Range("A2001").Activate
Application.CutCopyMode = False
Selection.Copy
Windows("ENTRY APPLICATION.xlsm").Activate
Sheets("ARCHIVE").Select
Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveWorkbook.Worksheets("ARCHIVE").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("ARCHIVE").Sort.SortFields.ADD Key:=Columns("L:L") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("ARCHIVE").Sort.SortFields.ADD Key:=Columns("A:A") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("ARCHIVE").Sort
.SetRange Columns("A:P")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Windows("DATABASE.xlsm").Activate
ActiveWorkbook.Save
ActiveWindow.Close
Application.CutCopyMode = False
Windows("ENTRY APPLICATION.xlsm").Activate
Sheets("FORM").Select
End Sub
please forgive my complicated explanation, but the thing I am trying to do has already complicated me enough ! so please help. thank you.
my edited code according to the first answer I received from @stringeater. please check it and help me what to adjust next. Im just getting an error now in setwbkDATABAS = Nothing
Sub DATA_BASE_ARCHIVE_FullArchive()
Dim rngNEWROUND As Excel.Range
Dim arrNEWROUND As Variant
Dim wbkDATABASE As Excel.Workbook
Dim rngDataTarget As Excel.Range
Dim rngDataSource As Excel.Range
Dim varData As Variant
Dim rngArchive As Excel.Range
Application.ScreenUpdating = False
Set rngNEWROUND = ThisWorkbook.Sheets("NEWROUND").Range("A1:N2000")
arrNEWROUND = ThisWorkbook.Sheets("NEWROUND").Range("A1:N2000")
Set wbkDATABASE = Workbooks.Open(filename:="E:\DELEGATION APPLICATION SAMPLE-2023\DATABASE.xlsm")
Set rngDataTarget = wbkDATABASE.Sheets("FullArchive").Range("A2001")
Set rngDataTarget = rngDataTarget.Resize(UBound(arrNEWROUND, 1), UBound(arrNEWROUND, 2))
rngDataTarget.Value = arrNEWROUND
Set rngDataSource = rngDataTarget.Worksheet.Range("A2001")
varData = rngDataSource.Value
wbkDATABASE.Save
wbkDATABASE.Close
setwbkDATABASE = Nothing '(and Im getting error here)
Set rngArchive = ThisWorkbook.Sheets("ARCHIVE").Range("A1") 'reference range
rngArchive.Value = varData
ThisWorkbook.Worksheets("ARCHIVE").Sort.SortFields.Clear
ThisWorkbook.Worksheets("ARCHIVE").Sort.SortFields.ADD Key:=Columns("L:L"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ThisWorkbook.Worksheets("ARCHIVE").Sort.SortFields.ADD Key:=Columns("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ThisWorkbook.Worksheets("ARCHIVE").Sort
.SetRange Columns("A:P")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Application.ScreenUpdating = True
Sheets("FORM").Select
End Sub
答案1
得分: 2
我已将您的代码行注释掉,并将我的代码行放在下面,以便您可以看到如何“翻译”您的代码。
Sub DATA_BASE_ARCHIVE_FullArchive()
' 声明
Dim rngNewRound As Excel.Range ' ThisWorkbook 中的范围对象
Dim arrNewRound As Variant ' 包含范围内容的二维数组
Dim wbkDatabase As Excel.Workbook ' DATABASE 对象
Dim rngDataTarget As Excel.Range ' 数据库中的目标范围
Dim rngDataSource As Excel.Range ' 数据库中的源范围
Dim varData As Variant ' 来自数据库的单元格内容
Dim rngArchive As Excel.Range ' 工作表 ARCHIVE 上的目标范围
Application.ScreenUpdating = False ' 不要忘记在最后设置为 True
' 设置 rngNewRound 为 ThisWorkbook 中 "NEWROUND" 工作表的范围
Set rngNewRound = ThisWorkbook.Sheets("NEWROUND").Range("A1:N2000")
' 将 rngNewRound 的内容保存到数组 arrNewRound 中
arrNewRound = rngNewRound.Value
' 打开名为 "DATABASE-2-2023.xlsm" 的工作簿
Set wbkDatabase = Workbooks.Open(Filename:="\-2023\DATABASE-2-2023.xlsm")
' 设置 rngDataTarget 为数据库工作簿 "FullArchive" 工作表的 "A2001" 单元格的左上角
Set rngDataTarget = wbkDatabase.Sheets("FullArchive").Range("A2001")
' 调整范围大小以匹配数组的大小
Set rngDataTarget = rngDataTarget.Resize(UBound(arrNewRound, 1), UBound(arrNewRound, 2))
' 将 arrNewRound 插入到 rngDataTarget
rngDataTarget.Value = arrNewRound
' 设置 rngDataSource 为相同工作表中的新范围 "A2001"
Set rngDataSource = rngDataTarget.Worksheet.Range("A2001")
' 保存数据库工作簿
wbkDatabase.Save
' 关闭数据库工作簿
wbkDatabase.Close
' 释放内存
Set wbkDatabase = Nothing
' 设置 rngArchive 为 ThisWorkbook 中 "ARCHIVE" 工作表的 "A1" 单元格的引用
Set rngArchive = ThisWorkbook.Sheets("ARCHIVE").Range("A1")
' 将 varData 插入到单元格 A1
rngArchive.Value = varData
' 对工作表 "ARCHIVE" 进行排序
ThisWorkbook.Worksheets("ARCHIVE").Sort.SortFields.Clear
ThisWorkbook.Worksheets("ARCHIVE").Sort.SortFields.Add Key:=Columns("L:L"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ThisWorkbook.Worksheets("ARCHIVE").Sort.SortFields.Add Key:=Columns("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ThisWorkbook.Worksheets("ARCHIVE").Sort
.SetRange Columns("A:P")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
' 保存当前工作簿
ThisWorkbook.Save
' 关闭当前窗口
ActiveWindow.Close
' 设置屏幕更新为 True,以便您可以看到更新后的结果
Application.ScreenUpdating = True
' 选择工作表 "FORM"
ThisWorkbook.Sheets("FORM").Select
End Sub
英文:
I have commented your code lines out and put my lines underneath so that you can see how to "translate" your code. You could shorten the code even more but it might not become more understandable.
Sub DATA_BASE_ARCHIVE_FullArchive()
'declarations
Dim rngNewRound As Excel.Range 'range object in ThisWorkbook
Dim arrNewRound As Variant '2-dim array with content of range
Dim wbkDatabase As Excel.Workbook 'DATABASE object
Dim rngDataTarget As Excel.Range 'target range in database
Dim rngDataSource As Excel.Range 'source range in database
Dim varData As Variant 'cell content from database
Dim rngArchive As Excel.Range 'target range on sheet ARCHIVE
Application.ScreenUpdating = False 'don't forget ... = True at the end
'Windows("ENTRY APPLICATION.xlsm").Activate
'Sheets("NEWROUND").Select
'Range("A1:N2000").Select
'supposing that this VBA code is contained in ENTRY APPLICATIN.xlsm
Set rngNewRound = ThisWorkbook.Sheets("NEWROUND").Range("A1:N2000") 'reference range
'Selection.Copy
arrNewRound = rngNewRound.Value 'save the content of the range in an array
'Workbooks.Open Filename:="\-2023\DATABASE-2-2023.xlsm"
Set wbkDatabase = Workbooks.Open(Filename:="\-2023\DATABASE-2-2023.xlsm")
'is DATABASE.xlsm = DATABASE-2-2023.xlsm? Please clarify!
'Windows("DATABASE.xlsm").Activate
'Range("A2001").Select
Set rngDataTarget = wbkDatabase.Sheets("FullArchive").Range("A2001") 'set top-left corner
'resize the range so that it matches the size of the array
Set rngDataTarget = rngDataTarget.Resize(UBound(arrNewRound, 1), UBound(arrNewRound, 2))
'Sheets("FullArchive").Paste
rngDataTarget.Value = arrNewRound 'insert array to range
'Cells.Select
'Range("A2001").Activate
Set rngDataSource = rngDataTarget.Worksheet.Range("A2001") 'new range in same worksheet
'Application.CutCopyMode = False
'Selection.Copy
varData = rngDataSource.Value 'save range value to single variable
wbkDatabase.Save 'save the database
wbkDatabase.Close 'close the database
Set wbkDatabase = Nothing 'release memory
'Windows("ENTRY APPLICATION.xlsm").Activate
'Sheets("ARCHIVE").Select
'Range("A1").Select
Set rngArchive = ThisWorkbook.Sheets("ARCHIVE").Range("A1") 'reference range
'ActiveSheet.Paste
'Application.CutCopyMode = False
rngArchive.Value = varData 'insert single variable to cell A1
'The sorting is probably ok. Please use ThisWorkbook instead of ActiveWorkbook
ActiveWorkbook.Worksheets("ARCHIVE").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("ARCHIVE").Sort.SortFields.Add Key:=Columns("L:L"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("ARCHIVE").Sort.SortFields.Add Key:=Columns("A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("ARCHIVE").Sort
.SetRange Columns("A:P")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
Windows("DATABASE.xlsm").Activate
ActiveWorkbook.Save
ActiveWindow.Close
Application.CutCopyMode = False
Windows("ENTRY APPLICATION.xlsm").Activate
Application.ScreenUpdating = True 'otherwise you may not see the updated result
Sheets("FORM").Select
End Sub
答案2
得分: 1
以下是您要翻译的内容:
"Since I don't have your sample and all the codes, I can only imagine. Please try using the Range object instead of Selection, unless you want to see it running when it is running, otherwise, there is no need to refresh the screen. In your code:
> Application.ScreenUpdating = False
ScreenUpdating = False and you also said
>so that I don't have to use the screenupdate and open activate save close workbooks all the time. So that I don't have to use the screenupdate and open activate save close workbooks all the time, which can make work slow and might crash.
also :
> want a more non human approach to be faster and more efficient
So it is ideal to use Range instead of Selection to implement. This is the same principle as in Word and PowerPoint VBA. Unless you need to refresh the screen or something needs to have the focus to do the operation, you should not actually use Selection. I think @Stringeater's answer upstairs has already done this, so he commented out your Selection statements and used the Range object below to execute it.
If you still don't understand clearly or have questions, please let us know again.
20230527 12:59 (CST)
If you just want to save the results as an Excel file (with or without the code), it is easy to do. The simplest way is to save it locally and then overwrite the destination file with a CopyFile method. If local saving is not possible and only save-as is allowed, then the SaveAs method in ExcelVBA will have to be used. It is more complicated to pay attention to the Multitasking reading conflict. I'm sure @Stringeater will come up with a nice solution, just like he did before. Thank you"
英文:
Since I don't have your sample and all the codes, I can only imagine. Please try using the Range object instead of Selection, unless you want to see it running when it is running, otherwise, there is no need to refresh the screen. In your code :
> Application.ScreenUpdating = False
ScreenUpdating = False and you also said
>so that I don't have to use the screenupdate and open activate save close workbooks all the time. So that I don't have to use the screenupdate and open activate save close workbooks all the time, which can make work slow and might crash.
also :
> want a more non human approach to be faster and more efficient
So it is ideal to use Range instead of Selection to implement. This is the same principle as in Word and PowerPoint VBA. Unless you need to refresh the screen or something needs to have the focus to do the operation, you should not actually use Selection. I think @Stringeater 's answer upstairs has already done this, so he commented out your Selection statements and used the Range object below to execute it.
If you still don't understand clearly or have questions, please let us know again.
20230527 12:59 (CST)
If you just want to save the results as an Excel file (with or without the code), it is easy to do. The simplest way is to save it locally and then overwrite the destination file with a CopyFile method. If local saving is not possible and only save-as is allowed, then the SaveAs method in ExcelVBA will have to be used. It is more complicated to pay attention to the Multitasking reading conflict. I'm sure @Stringeater will come up with a nice solution, just like he did before. Thank you
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论