Choose from open workbooks to paste in copied data - excel

I am writing an VBA code that should copy a specific range from one workbook into another workbook (that is open). I want to choose this workbook from a popup window that is showing all the open excel workbooks.
What I have to start with is below which is copying the range I want, do not want to specify the workbook (changing every year) or the worksheet (changing every month) more than this. From the Application.Dialogs(xlDialogActivate).Show I get a list of active workbooks/aplications (thanks #jkpieterse) and I now want to set this as WB2 so that I can copy past it into my chosen range.
Sub GTS_Timesheet()
Dim WB As Workbook, WS As Worksheet, RG As Range, WB2 As Workbook
Set WB = ActiveWorkbook
Set WS = WB.ActiveSheet
Set RG = WS.Range("F10", Range("U" & Cells(Rows.Count, "F").End(xlUp).Row))
''Set WB2 =
RG.Copy
WB2 = Application.Dialogs(xlDialogActivate).Show
WB2.Worksheets("Paste FRW Data").Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
End Sub
Thanks, and please tell if I need to explain more what I want.

Once selected the workbook becomes active:
Application.Dialogs(xlDialogActivate).Show
Set WB2 = ActiveWorkbook

Related

VBA Vlookup from a saved file

I have a dynamic report extracted from SAP, that I need to run a Vlookup Formula in it from a closed file on my PC.
so what I basically do is VBA to open the source file that I will vlookup from then run the Vlookup formula in my sap extracted workbook.
My problem is how to let the formula run on the Sheet extracted from SAP, The VBA code is in personal file, not the extracted SAP sheet so I can't use thisworkbook function.
Sub Vllokp()
Dim wb As Workbook
Dim wb1 As Workbook
Workbooks.Open "C:\User\1.Work\18.SAP GUI and Automation\Payment propsal Test\Bank.xlsx"
Set wb = Workbooks("Bank.xlsx")
Set wb1 = ActiveWorkbook.Sheets("sheet1")
With wb1.Sheets("sheet1")
.Range("AA2").Formula = "=VLOOKUP(D1,'[Bank.xlsx]Sheet1'!A:C,3,FALSE)"
End With
End Sub
This worked for me,
Sub Vllokp()
Dim wb1 As Workbook
Dim wb2 As Workbook
Set wb1 = ActiveWorkbook
Workbooks.Open "C:\User\1.Work\18.SAP GUI and Automation\Payment propsal Test\Bank.xlsx"
Set wb = Workbooks("Bank.xlsx")
With wb1.Sheets("sheet1")
.Range("AA2").Formula = "=VLOOKUP(D1,'[Bank.xlsx]Sheet1'!A:C,3,FALSE)"
.Range("AA2").copy Range("AA3:AA" & Cells(Rows.Count, 4).End(xlUp).Row - 1)
End With
End Sub

Copy a range from a closed workbook to a specific sheet

I am currently working on a VBA script to automate a excel sheet. The goal is to have the code open a file from using a file path in cell A2 on a sheet called Reports (the file path is dynamic and is formed using information from the sheet) , copy the data from the file for range A1:E200 and to paste the data into the original workbook on a sheet called HOURS starting at A1. At the moment i have gotten to the point where the file is opened but there is a "Mismatch" error when trying to copy the information across. Below I've attached the code used. I was hoping that someone would be able to help to make sense of the error! I am having the same problem with the close section as well. Note: I am a rookie on VBA so if you could be as clear as possible
Sub Button1_Click()
Call Test
Call Copy_Method
Call CloseWorkbook
End Sub
Sub Test()
Dim strFName As String
strFName = Sheet4.Range("A2").Value
Workbooks.Open Filename:=strFName
End Sub
Sub Copy_Method()
'Copy range to another workbook using Range.Copy Method
Dim wb1 As Workbook
Dim wb2 As Workbook
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Set wb2 = ThisWorkbook
Set ws2 = wb2.Sheets("HOURS")
Set wb1 = ThisWorkbook.Worksheets("Reports").Range("A2")
Set ws1 = wb1.Sheets("Sheet")
ws2.Range("A1:E200") = ws1.Range("A1:E200").Value
End Sub
Sub CloseWorkbook()
Workbooks("venues_theeway_hours_August2020.XLS").Close SaveChanges:=True
End Sub
Have you tried this ?
ws2.Range("A1:E200").Value = ws1.Range("A1:E200").Value
You're making life quite difficult for yourself there, splitting the code out across 3 subs. Better to
rename the references to make them easier to differentiate source/destination.
keep it all together so the workbooks/worksheets can still be referenced as they're created:
Apologies if I've misread your requirements, my code does the following:
Reads the original workbook, sheet "Reports", range A2 for a filename.
Opens that filename as a 'source' workbook
Copies data from..
that 'source' workbook, sheet "Sheet", range A1:E200
..to original workbook, sheet "HOURS", range A1:E200
and then closes the 'source' workbook, unsaved as you've not made any changes.
Dim wbSource As Workbook
Dim wbDest As Workbook
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim strFName As String
Set wbDest = ThisWorkbook
Set wsDest = wbDest.Sheets("HOURS")
strFName = wbDest.Worksheets("Reports").Range("A2").Value
Set wbSource = Workbooks.Open(strFName)
Set wsSource = wbSource.Worksheets("Sheet")
wsDest.Range("A1:E200").Value = wsSource.Range("A1:E200").Value
wbSource.Close SaveChanges:=False
I'm a little puzzled about your workbook close with save? Perhaps you actually want to close the source sheet unsaved and maybe save the destination sheet you're adding data to? In that case you'll need to add this line to the end of the above code.
wbDest.Close SaveChanges:=True

Change excel sheet reference from numerical sequence to sheet name

I have a relatively simple question. Currently I have some code that is working well but not efficient. I have about 500 cost centres each with their own workbook which I have consolidated into a central repository (reference - Wb2 in code below). The code copies ranges from each open template (Wb1) into my consolidation (Wb2). Sample code below (full code not necessary).
Option Explicit
Sub CopyData()
Dim Wb1 As Workbook, wb2 As Workbook, wB As Workbook
Dim rngToCopy1 As Range
Dim rngToCopy2 As Range
Dim rngToCopy3 As Range
Dim rngToCopy4 As Range
Dim rngToCopy5 As Range
Set wb2 = ThisWorkbook
Application.Calculation = xlManual
For Each wB In Application.Workbooks
If Not Left(wB.Name, 18) = "Consolidation Test" Then
Set Wb1 = wB
Exit For
End If
Next
'Forecast Data
With Wb1.Sheets(1)
Set rngToCopy1 = .Range("A11:O11", .Cells(.Rows.Count, "A").End(xlUp))
End With
wb2.Sheets(7).Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(rngToCopy1.Rows.Count, 15).Value = rngToCopy1.Value
wb2.Sheets(7).Range("P" & Rows.Count).End(xlUp).Offset(1).Resize(rngToCopy1.Rows.Count).Value = Sheets(3).Range("J1").Value
I have tried to simply change as an example wB2.Sheets(7) to Wb2.Sheets("Forecast_Data") as well as the original name in VBE wB2.Sheets("Sheet4") but I get a subscript out of range error?
In addition to the solution, please also provide background on why the fix is not so simple, has it got to do with how my variables are declared?
I think #GSerg already gave you the most important hint.
I assume you created a workbook with the name WB2, but it does not contain any of those sheets you want to write in.
Either create them manually in your template (WB2) or have a look at How to Add a Named Sheet at the end of all excel sheets to create them with your VBA.

Excel VBA file name changes

I have to 2 Excel workbooks to work with: Book1october & Book2. Book1october18 is an import file, meaning that it changes monthly, along with the name (next month it will be Book1november18). I have to copy some data from Book1october to Book2 automatically through VBA code.
This is the code that I've written:
Windows("Book1october18").Activate
Sheets("Sheet1").Activate
Range("B2:AQ5").Select
Selection.Copy
Windows("Book2").Activate
Sheets("Sheet1").Activate
Range("R2:BG5").Select
ActiveSheet.Paste
My problem is that I don't know how to write the code in order to make the actions that I want whenever the month's name changes and also the year. (I have to make it for all the months and 2019)
You can automatically update your workbook name using the Date() function and Format()
Dim sWbName As String
sWbName = "Book1" & LCase(Format(Date, "mmmmyy"))
Debug.Print sWbName
'Prints Book1october18
The name/path of the workbook doesn't need to matter. Use K.Davis's code to come up with a filename, or prompt the user for a path/file to open - get that string into some sourceBookPath variable, then have the macro open the workbook. Now you can hold a reference to that Workbook object:
Dim sourceBook As Workbook
Set sourceBook = Application.Workbooks.Open(sourceBookPath)
Now, the worksheet.
Dim sourceSheet As Worksheet
If the sheet is always going to be named "Sheet1", then you can do this:
Set sourceSheet = sourceBook.Worksheets("Sheet1")
Or, if the sheet is always going to be the first sheet in the book (regardless of its name), you can do this:
Set sourceSheet = sourceBook.Worksheets(1)
Once you have a Worksheet object, you can get the Range you need - but first you need your target. Again if "book2" is opened by the macro, things are much simpler:
Dim targetBook As Workbook
Set targetBook = Application.Workbooks.Open(targetBookPath)
Or is it created by the macro?
Set targetBook = Application.Workbooks.Add
Anyway, we want the first sheet:
Dim targetSheet As Worksheet
Set targetSheet = targetBook.Worksheets(1)
And now we can copy from the source, and paste to the target:
sourceSheet.Range("B2:AQ5").Copy targetSheet.Range("R2:BG5")
And not once did we ever need to .Select or .Activate anything, and we never needed to care for any Window.
Replace:
Windows("Book1october18").Activate
with:
s = LCase(Format(Now, "mmmm")) & Right(Year(Now), 2)
Windows(s).Activate
Try this.
This is a recognition of the next month's document, assuming you have opened two documents.
Sub test()
Dim Wb1 As Workbook, wb2 As Workbook
Dim Wb As Workbook
For Each Wb In Workbooks
If InStr(Wb.Name, "Book1") Then
Set Wb1 = Wb
ElseIf InStr(Wb.Name, "Book2") Then
Set wb2 = Wb
End If
Next Wb
Wb1.Sheets("Sheet1").Range("B2:AQ5").Copy wb2.Sheets("Sheet1").Range("r2")
End Sub

Sheets("New").Select creating new workbook unintentionally

For some reason, Sheets.copy is making another workbook. I don't know how to fix it. I just want it to copy the first Sheets("New") and paste everything that I have selected over to a new Sheets("New(2)").
Sheets.Copy
Sheets("New").Select
Sheets("New").Copy After:=Sheet1
'****Copy Assessment Date to the Nourish Report Printable****
Sheets("New").Select
Range("C74").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("New (2)").Select
Range("V96").Select
ActiveSheet.Paste
I think the issue is with the Sheets object. In my experience it is better to use the Worksheets object. I would recommend simplifying your code by removing all of the copy and paste / select and just making the cell range take the exact value you want. The Macro Recorder does not do a very a good job of producing efficient code but it certainly does help with syntax and getting you started. Consider the code below to accomplish what you want.
Sub CopySheet()
Dim wb As Workbook, ws As Worksheet, nws As Worksheet
'set up
Set wb = ThisWorkbook
Set ws = wb.Worksheets("New")
'Create a copy of the worksheet
ws.Copy wb.Worksheets(1) 'places the worksheet at the front
Set nws = wb.Worksheets(1) 'References the new front worksheet
'set a name for the new sheet for easy reference
nws.Name = "newSheet" 'set to whatever name you want
'Print out the actual value you want rather than copy and paste.
nws.Range("V96").Value = ws.Range("C74").Value
nws.Activate 'select the new worksheet
End Sub
And here it is without all of the comments
Sub CopySheet()
Dim wb As Workbook, ws As Worksheet, nws As Worksheet
Set wb = ThisWorkbook
Set ws = wb.Worksheets("New")
ws.Copy wb.Worksheets(1)
Set nws = wb.Worksheets(1)
nws.Name = "newSheet"
nws.Range("V96").Value = ws.Range("C74").Value
End Sub
Let me know if this works.

Resources