Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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
列出所有打开的Excel文件,以便用户可以选择文件_Excel_Vba - Fatal编程技术网

列出所有打开的Excel文件,以便用户可以选择文件

列出所有打开的Excel文件,以便用户可以选择文件,excel,vba,Excel,Vba,我想将数据从旧文件复制到新文件 我有复制数据的代码。旧文件和新文件的名称都会更改,我每次都必须在代码中更改 有没有办法,我可以得到一个打开的Excel文件列表,并选择我想要从中获取数据的文件和我想要复制数据的文件 Sub Copy_rental() Dim PYFILE As String Dim CYFILE As String Dim Columnstocopy As String PYFILE = "Pro-invest HIE ADL Trust - 2018 WP.XL

我想将数据从旧文件复制到新文件

我有复制数据的代码。旧文件和新文件的名称都会更改,我每次都必须在代码中更改

有没有办法,我可以得到一个打开的Excel文件列表,并选择我想要从中获取数据的文件和我想要复制数据的文件

Sub Copy_rental()

Dim PYFILE As String
Dim CYFILE As String
Dim Columnstocopy As String

PYFILE = "Pro-invest HIE ADL Trust -  2018 WP.XLSX"
CYFILE = "Pro-invest HIE ADL Trust -  2019 WP.XLSX"

Columnstocopy = "C"

Windows(PYFILE).Activate
Sheets("Rental Schedule").Select
Range(Columnstocopy & "10:" & Columnstocopy & "14").Select
Selection.Copy

Windows(CYFILE).Activate
Sheets("Rental Schedule").Select
Range(Columnstocopy & "10").Select
ActiveSheet.Paste
Application.CutCopyMode = False

Windows(PYFILE).Activate
Sheets("Rental Schedule").Select
Range(Columnstocopy & "16:" & Columnstocopy & "24").Select
Selection.Copy

Windows(CYFILE).Activate
Sheets("Rental Schedule").Select
Range(Columnstocopy & "16").Select
ActiveSheet.Paste
Application.CutCopyMode = False

Windows(PYFILE).Activate
Sheets("Rental Schedule").Select
Range(Columnstocopy & "26:" & Columnstocopy & "27").Select
Selection.Copy

Windows(CYFILE).Activate
Sheets("Rental Schedule").Select
Range(Columnstocopy & "26").Select
ActiveSheet.Paste
Application.CutCopyMode = False
   
Windows(PYFILE).Activate
Sheets("Rental Schedule").Select
Range(Columnstocopy & "29").Select
Selection.Copy

Windows(CYFILE).Activate
Sheets("Rental Schedule").Select
Range(Columnstocopy & "29").Select
ActiveSheet.Paste
Application.CutCopyMode = False

End Sub
编辑:感谢提示,我正在使用此代码获取打开的Excel文件列表,但它似乎不起作用。VBA也不会抛出任何错误。这可能是因为我在personal.xlsb工作簿上创建了Userform吗

在Newblank工作簿中,它似乎正在工作的代码相同

Private Sub Onesource_copy_data_Initialize()

Dim wkb As Workbook

Me.Onesource_ComboBox1_oldfile.Clear
For Each wkb In Application.Workbooks
    Me.Onesource_ComboBox1_oldfile.AddItem wkb.Name
Next wkb

Me.Onesource_ComboBox1_newfile.Clear
For Each wkb In Application.Workbooks
    Me.Onesource_ComboBox1_oldfile.AddItem wkb.Name
Next wkb

End Sub
编辑2:我认为问题是
Onesource\u copy\u data\u Initialize
。我应该把它保留为
UserForm\u Initialize

Private Sub UserForm_Initialize()

Dim wkb As Workbook

Me.Onesource_ComboBox_oldfile.Clear
For Each wkb In Application.Workbooks
    Me.Onesource_ComboBox_oldfile.AddItem wkb.Name
Next wkb

Me.Onesource_ComboBox_newfile.Clear
For Each wkb In Application.Workbooks
    Me.Onesource_ComboBox_newfile.AddItem wkb.Name
Next wkb

End Sub
编辑3:我做了一个组合框,它正在工作

组合框的代码

Private Sub Onesource_Copy_Cancel_CommandButton_Click()
Stopped = True
Unload Me
End Sub


Public Sub Onesource_Copy_Start_CommandButton_Click()

PYFILE = Me.Onesource_ComboBox_oldfile.Value
CYFILE = Me.Onesource_ComboBox_newfile.Value
' Calling Macro
Call Test123

Unload Me
End Sub


Private Sub UserForm_Initialize()

Dim wkb As Workbook

Me.Onesource_ComboBox_oldfile.Clear
For Each wkb In Application.Workbooks
    Me.Onesource_ComboBox_oldfile.AddItem wkb.Name
Next wkb

Me.Onesource_ComboBox_newfile.Clear
For Each wkb In Application.Workbooks
    Me.Onesource_ComboBox_newfile.AddItem wkb.Name
Next wkb

End Sub
Excel代码的开头

将变量声明为公共变量是必需的

Public PYFILE As String

Public CYFILE As String

Sub Copy_PreTemplate_to_NewTemplate()
'
' Copy previous Template data to new Template
'
Onesource_Copy_form.Show

End Sub


Sub Test123()

Windows(PYFILE).Activate
Sheets("Non-numeric details").Select
Range("C6:C10").Select
Selection.Copy
Windows(CYFILE).Activate
Sheets("Non-numeric details").Select
Range("C6").Select
ActiveSheet.Paste

End sub

如果图纸不改变位置,可以使用其数字索引而不是图纸名称:

Sheets(0).Select
如果工作表确实改变了位置,则遍历所有工作表,查找特定文本,以指示哪个工作表是什么

否则,请维护可能名称的地图

这不是一个真正的编程问题,而是一个过程中的问题。更好的解决方案是不要重命名图纸或使用sheetName yyyyymmdd之类的命名约定


您需要为这样的选择创建userform。另一种选择是使用
InputBox
方法。这是一个演示代码

Dim wkbSrc As Workbook, wkbDst As Workbook
Dim rngSrc As Range, rngDst As Range
Set rngSrc = Application.InputBox("Select Source Workbook", "Select Workbook", , , , , , 8)
Set rngDst = Application.InputBox("Select Destination Workbook", "Select Workbook", , , , , , 8)
Set wkbSrc = rngSrc.Parent.Parent
Set wkbDst = rngDst.Parent.Parent

请尝试下一种方式:

Sub testSelectOpenWorkbook()
  Dim w As Workbook, wbCopy As Workbook, wbDest As Workbook, i As Long, strWb As String
  Dim chooseW As String
  
  For i = 1 To Workbooks.Count
    strWb = strWb & i & " - " & Workbooks(i).Name & vbCrLf
  Next
   chooseW = InputBox("Please choose the number in front of the Workbook to copy data" & vbCrLf & vbCrLf & strWb, _
            "Workbook to copy data selection", 1)
   If chooseW = "" Then MsgBox "You did not choose anything...": Exit Sub
   If Not IsNumeric(chooseW) Then
      MsgBox "You must write the number in front of the workbook name...":Exit Sub
   End If
   Set wbCopy = Workbooks(CLng(chooseW))
   Debug.Print wbCopy.Sheets.Count, wbCopy.Name
   
   'Please, proceed in exactly the same way to select the destination workbook
End Sub

我明白你的意思。谢谢你让我知道。我是一个新手,所以这些提示帮助提示:不需要复制/粘贴,只需在工作表(1)中指定值即可:
Worksheets(1).Cells.Range(“A1”).Value=Worksheets(2).Cells.Range(“B2”).Value
这很有帮助,但问题是文件的名称完全相同。我已经研究了Userform选项,并编写了一些代码,但出于某种原因,ComboBox没有在列表中添加任何内容。这是一个很好的解决方法。我想我可以让它工作,但是用户表单方法看起来更有用clean@Ankit库尔什雷斯塔:问题在哪里?如果在组合框中输入工作簿名称,可以像使用
Set wbCopy=workbooks(combo.value)
一样使用它。这种方法有什么不清楚的地方?我是否应该发布这样一个用于组合加载和工作簿对象定义的代码?这里没有问题。实际上,我更喜欢组合框的概念。谢谢你的帮助。我差一点就到了