Excel copy-paste including hidden columns - excel

I'm using a Excel 2016 worksheet that has a couple of columns hidden for UI reasons. I need to be able to filter out data and then copy-paste it to another sheet with hidden columns intact and showing after pasting in the destination (it will contain a longer log of similar transactions, not just one copy-paste).
Adding a pic of the objective - i.e. hoping to have the hidden contents of columns B and C being pasted into the destination spreadsheet. Is this possible at all?
Probably not great form to ask 2 questions in one post, however are there alternatives to performing filtering and copy-paste function to another spreadsheet manually? I.e.:
run manual filter to clear blanks in Quantity field;
make a selection
do manual Ctrl+C - Ctrl+V function
Is there a way to make it easier? Unfortunately no VBA or macro experience as of yet.

Edit - Completely misunderstood the question!
You want to include hidden cells when you copy - that's standard behavior for hidden cells but not for filtered columns. If you want to avoid VBA abd you're dealing with small contiguous ranges then a simple formula may be the easiest solution.
Using your example, I will arbitrarily name the source worksheet "Sheet1" and the destination "Sheet2". In Sheet2, click in cell A2 and type this into the formula bar: =Sheet1!A3 Now click the bottom right corner of cell A2 and drag it to the right through D2 then down to D7.
With the range highlighted, press ctrl C to copy, then right click to paste special values.
You're done!
Here's a VBA solution:
Sub copyrng()
Dim srcrng As Range
Dim tmprng As Range
Dim dstrng As Range
Dim srcws As Worksheet
Dim dstws As Worksheet
Set srcrng = Application.InputBox("Area to copy", "Source", Type:=8)
Set srcws = srcrng.Parent
Set tmprng = Application.InputBox("Top Left Corner of Destination", "Destination", Type:=8)
Set dstws = tmprng.Parent
Set dstrng = dstws.Range(tmprng.Address, tmprng.Parent.Cells(tmprng.Row + srcrng.Rows.Count - 1, tmprng.Column + srcrng.Columns.Count - 1))
dstrng = srcrng.Value
End Sub
First answer (answered wrong question)
You can copy visible cells using "Go To..."
Highlight the range you want to copy, press Ctrl G, click "Special...", select "Visible Cells Only", and then press Ctrl C to copy.
Now all hidden cells will be left behind when you paste.

No, you cannot do this with regular Excel features since Excel cannot know which columns/cells to skip when one of the column have blank values, this is something has to be decided and done by a human.
Maybe this is a good time to enter the world of Macros, since you do not need a custom code but can use the recorded macro without any further manipulation. This Excel feature is for inexperienced users just like you.
View / Macros / Record Macro
Name your macro
Do what you need to, keeping in mind that Excel is recording your every move by converting them into VBA codes in the background. For your case, do the following:
Filter the blanks using filter combo-box
Select the range by using CTRL-G / Special / Current Region (do not select the cells by mouse or with your keyboard, your code should be generic should not contain manual ranges since you do not want to do any coding)
CTRL-C to copy
If "to-be-pasted" cell is not fixed for all your cases, then you should stop recording your macro here. If pasting cell is fixed then Paste the contents while the macro is recording.
After the macro is recorded, assign a shortcut to your new Macro using:
Macros / View Macros / Options menu
Voila! Now you are able to do exactly what you have done when recording your macro by using that keyboard shortcut. If you did not paste the content when recording then you s/b using your macro short cut and go to the cell you want to paste and press CTRL-V.
When you feel confident enough, try the Edit menu in the Macros and see what code you have in hand, maybe make some small changes etc. I saw many people who are not familiar with basic coding at the beginning but somehow started writing their own codes after seeing this feature in Excel. Good Luck!

ProfoundlyOblivious code is pretty cool but the
dstws = activesheet
will always be the source since the activesheet passes back straight after the inputbox.
I tried changing it to
Set dstws = tmprng.Parent
but for some reason this then breaks the
Set dstrng = dstws.Range..
I get a Run time error 1004 Method range of object _Worksheet failed?!?!
If I could fix that this solution would work for you with any destination, even other files.
The alternative is to use vba to un-filter the data, then do a copy, then put same filter(s) back on. Once that is done you can go anywhere and paste what is now on the clipboard.

Related

How do I copy a range including hidden cells(by filter)?

I know basically the same questions has previosly been asked and answered on many forums, including stack overflow, but none of the answers satisfy my requirements.
I want to press a button, which will copy a range of around 100 cells. I then want to press a different button, in a totally different workbook (which is in no way connected to the first workbook) and that will paste my copied range.
The issue is that I have a filter in my workbook, which will hide some of the cells in the range. These are not being copied but I need to copy the full range. (The reason I want to copy the full range is because the values need to align when I paste it)
My issue with all other given solutions are:
One solution is to remove the filter when I copy the range. This is not something I want to do as I don't know a way to restore the filter. If this is done before I paste the values, the copied range will "exit?" (it will no longer be copied). And due to the files not being connected, I can't perform any actions with the paste button.
Using a loop to copy the range as a array(Variant), This doesn't work since I can't "transfer" that variant to another workbook which is not connected. Or at least I don't know how to do that.
Is there any other method I can use?
It is a bit of a hack, but because both workbooks have access to the set of custom lists defined for Excel, you could create a custom list with the information needed to identify the source range from the target workbook. The code for the copy button would record the range address, sheet name, and workbook name of the selected range as follows:
Sub copy_range_info()
Application.AddCustomList Array("DeleteMe", Selection.Address, Selection.Parent.Name, Selection.Parent.Parent.Name)
End Sub
On the destination worksheet, the code to paste data would look like this:
Sub paste_range_from_other_workbook()
Dim last_list As Variant
last_list = Application.GetCustomListContents(Application.CustomListCount)
If last_list(1) = "DeleteMe" Then
Workbooks(last_list(4)).Worksheets(last_list(3)).Range(last_list(2)).Copy
ActiveCell.PasteSpecial xlPasteValues
Application.DeleteCustomList Application.CustomListCount
Else
MsgBox "You need to copy a range first using that special button"
End If
End Sub
Because this creates a custom list in Excel that will be permanent, I'm deleting it just before the "else" in the code above. It might be advisable to scan the custom list and delete any lists that begin with "DeleteMe" so if someone does a copy without a corresponding paste, it won't result in more than one custom list of this type.

Make variable hyperlink from cell data

Hi I am kind of new to VBA and i can't seem to find what i am looking for.
What i want to make is a macro that links to another page in my workbook that refers to data in a certain cell.
from certain datapoints i have a cell set up that as everything is filled in it gives the name of the page i want to link to (lets say "overview_Oct_2020" by filling in the month and year in other cells), and when running the macro go to that.
I seem to totally blank on how to do it. I made a =HYPERLINK() version pretty easily, but i want to change that to a button, hence the reason for a macro.
so technically i want to make a button with a macro that goes to [TEXT IN CEL A1]!A1
Put this macro in a standard module and assign it to a button on the worksheet
Sub link()
Dim textInCelA1 as String
textInCelA1 = Range("A1").value
Sheets(textInCelA1).Activate
Range("A1").Select
End Sub

Copy formatting only from range with conditional formatting, without the conditions [duplicate]

I know you usually show what you've tried in a question, but this is more of a "Do you have a good routine that does this?" question and I'm hoping you'll be willing to let it slide...
I'm working on a macro that copies cells that are conditionally formatted in a source worksheet and pastes them into an output sheet.
Basically, I'm looking to keep all the formatting, shading, etc, but remove all the conditions (make the current formatting static) in the output sheet.
I've seen some solutions online - ranging from copying it first to a word document and then pasting it back, to looping through the output cells and copying format-element by format-element - and am just looking for a good, efficient way to do this.
Does anyone have one / a good link they'd be willing to share??
(Excel 2010)
THANKS!!!!
Yes it is possible :) What you need to do is change the formatting of the cells that you plan to copy by mimicking the DisplayFormat and then deleting the conditional formatting
Sub Keep_Format()
Dim ws As Worksheet
Dim mySel As Range, aCell As Range
'~~> Change this to the relevant sheet
Set ws = ThisWorkbook.Sheets("Sheet1")
'~~> Change this to the relevant range
Set mySel = ws.Range("A1:A10")
For Each aCell In mySel
With aCell
.Font.FontStyle = .DisplayFormat.Font.FontStyle
.Interior.Color = .DisplayFormat.Interior.Color
.Font.Strikethrough = .DisplayFormat.Font.Strikethrough
End With
Next aCell
mySel.FormatConditions.Delete
'
'~~> Now Do the copying
'
'~~> Once you are done, close the sorce worksheet without saving
End Sub
I think I've got it with the Office Clipboard: Copy range, open the Office Clipboard pane (the tiny button in the bottom right corner of the Clipboard section under the Home tab) and paste from there.
Here's a demo: http://www.bookkempt.com/2017/08/remove-conditional-formatting-but-keep.html
I copied my range of cells. Pasted them into Word. Recopied the range in Word and pasted back into excel.
I was trying to do the same, all answers seemed too much of work for me or based on some bug / glitch.
What worked for me is opening ms word copying the whole table from ms excel into ms word then pasting it back to ms excel. The style is there but the conditional formatting doesn't apply anymore.
A very simple method is to filter the list by color. Then FILL with the appropriate cell color you need. then unfilter and remove conditional formatting. The fill will remain.

Batch add a formula in Excel 2016

I have a spreadsheet with hundreds of cells containing formulas like =('Pricing Master'!$E135*'Pricing Master'!$L$29). I would like to batch add the ROUNDUP formula, so that they all read, for example, =ROUNDUP('Pricing Master'!$E135*'Pricing Master'!$L$29,0). A simple Replace All will not work, as it requires both the function call preceding as well as the Number argument following. Not providing both at the same time produces an error. This creates an issue with batch editing using Replace All.
I am sure that there is a way to do this with the Paste Special function, although if there is another way I would be glad to hear it.
My approach is this and I do this often with large sheets with many formulae:
One : select the row(s) or column(s) you want to work with,
Then edit/replace “=(“ with “xyxy(” (I use xyxy as it just doesn’t come up...
Now all replace operations will be quicker as there is no re-calc happening...
So now do edit/replace “xyxy” with “xyxyroundup(“ and “)” with “,0)”
Then just replace “xyxy” with “=“
And wait for it to finish its calculations...
loop through each cell and add formula to the original formula. Like this
Sub updateFor()
Dim r As Range
For Each r In Selection.SpecialCells(xlCellTypeFormulas)''only cells with formula in
r.Formula = "=ROUNDUP(" & Mid(r.Formula, 2) & ",0)"
Next r
End Sub
just replace the selection with the range you want to edit
if you arnt familiar with vba heres a quick guide
press ALT + F11 to show the vba editor
from insert menu select module
module1 should appear in the project window in the top left,
click on this
a large window should open on the right paste the above code in
go back to your worksheet and select the cells you want to roundup
goto to the view ribbon click the macro button on the far right
select the macro 'updateFor' and press run

Force Refresh of "Last" Cell of the Worksheet

Pressing Ctrl+End in Excel takes you to the bottom-right-most cell of the worksheet.
If you delete the last rows or columns and save the workbook, this last cell gets updated, as well as the scrollbars.
I remember there was a one line VBA command that you could run that would do the update without having to save the workbook, but I can't remember what the command is - do you have any ideas?
I’ve found something that consistently works to delete those blank rows. You can tell when the “used range” excel is using is too big and is going to add extra blank rows when you use the scroll bar to the right and it goes beyond the last row of actual data when you scroll to the bottom. This will caused extra blank records to be added to the table when it is imported into SQL.
To get rid of them:
Select the entire first row under the last row of data. Hit Ctrl + Shift + Down Arrow to select all the blank rows.
From the Home Tab Select Clear and then Clear All from the Edit menu (picture of a whitish-grey eraser).
Right-click and select Delete.
Goto cell A1 first and then Save.
Press Ctrl + Home and then Ctrl + End (This should take you the correct last cell in the used range (above blank rows).
Click Save again.
Here is the answer:
Sub x()
ActiveSheet.UsedRange
End Sub
Run this and the last cell will be reset.
When none of the above works try this.
Select the unused rows and change the row height.
Now delete the rows and save.
Bingo!
Here's what I did... since none of the above worked (this time that is, which is sad cause this code was running beautifully then all the sudden xlCellTypeLastCell totally failed me.) This will only work if you hardcode the first cell of the region you wanna grab the last cell of... for example I was pasting data tables into a sheet of 12 - 40 columns and 60-90 rows... but since it was a paste, it always started in cell A79...
Worksheets("Data_Import").Activate
Range("A79").CurrentRegion.Select
A = Selection.Rows.Count - 1
B = Selection.Columns.Count - 1
Selection.Offset(A, B).Resize(1, 1).Select
Set DataEnd = Selection
I feel sad to NOT use the cool special cells thing, but alas, if it doesn't work! then I just can't use it. :C
p.s. - you could also throw in a
ActiveSheet.Cells(Rows.Count, 1).End(xlUp).CurrentRegion.Select
This solution works for Excel 2013, but may also work for most recent versions of Excel:
Choose the worksheet where you want to change the last cell, and delete any unused rows and columns
Click on File - Options - Customize Ribbon
Under Main Tabs, check the box next to "Developer", then click OK
On the Developer ribbon that now appears, click Visual Basic
In the upper-left corner, under Microsoft Excel Objects, click on the Sheet Name where you want to force a refresh of the worksheet's last cell
In the menu, click on Run - Refresh, then close the Visual Basic Window
When you hit Ctrl + End, your last cell should now be refreshed.
Check out http://dmcritchie.mvps.org/excel/lastcell.htm#MakeLastCell, found the link from a similar question.
Far from the forgotten one liner, but did solved the problem for me.
Alternatively;
Turn on manual calculation (to preserve references).
create new sheet.
Copy cells and Name of old sheet.
For some reason the code ActiveSheet.UsedRange alone did not work for me on Excel 2016 64-bit to force Excel to reset the last used cell.
This does work for me. Hope this helps.
Rows(25:415).Clear 'deletes contents and formatting
ActiveSheet.UsedRange 'resets last used cell
The solution to change row height to zero and saving worked.
Reopen, set row height to 12 and notice that End Home is no longer at the very bottom right of the worksheet.
THANK YOU. I have been working on this for over two years.
Jim Champaigne
Elkhart, Indiana
I'm not sure why everyone is making it so complicated. Just press Ctrl + PgDn.

Resources