[Article & AddIn] How to paste into a filtered range
Hello everyone, welcome to my first article in ExcelFox. :)
The question in the subject is a FAQ for decades, we all struggled about this problem at some time.
And there are different ways to overcome this, most ways I've seen in the past used workarounds.
I would like to show you a way that does not require any detours and to make it very easy to use I have written an AddIn for it, which you can download here:
https://www.dropbox.com/scl/fi/134rl...vib2qfyzz&dl=1
The actual purpose of this AddIn is to allow you to paste data into a filtered range so that only the visible cells are overwritten. This is not possible with Excel itself.
I came here because there was another very similar question: How to paste into empty cells? This thread is here:
https://www.excelfox.com/forum/showt...pty-cells-only
With a slight modification, the data can now also be merged.
The AddIn takes the data from the clipboard and 2 data structures are supported:
- XML Spreadsheet
This structure is located in the clipboard when cells have been copied. - HTML Table
This structure is located in the clipboard when a table (or parts of it) has been copied from a web page.
An installation is not necessary, simply unzip all files into a directory that Excel considers as trusted location and then open the file Paste into AutoFilter.xlam with Excel.
In Excel 2007, a PIF group is created in the ribbon in the Home tab directly next to the Clipboard group, this was intentionally kept as small as possible.
https://i.postimg.cc/TP68t9ff/Menu-Office-2007.png
After copying, Excel 2007 users must select another cell so that the paste buttons can be selected.
In Excel 2010 and above, you can find this in the context menu when you right-click on a cell.
https://i.postimg.cc/43bDq9xt/Menu-Office-2010.png
The default behavior of the AddIn is to overwrite cells, if you want to merge cells you have to choose the appropriate option. Please read the PDF file for the details.
Okay, I think that's enough to get you started if you found this article by chance and you are just looking for a solution.
Yes, the AddIn is free and I do not give any guarantee for anything. If you like it, I would appreciate a tip.
In the next few days I will explain how the code works in the following posts. If you want, you can take a look at the code; the AddIn is not protected.
I've been using the code myself for a long time, but every programmer knows that other users have different ideas. If you encounter any problems, please contact me directly.
Please do not upload the AddIn to any other place, the link above is permanent and gives you the latest version.
Until then, have fun,
Andreas.
XML Spreadsheet Number Formats
If we look at the cell with a date, we don't find a number format in it, but a style.
https://i.postimg.cc/zfxQwGVM/Paste-...ML-Format1.png
Why does Excel do this? If every cell really contained a number format with all the details, then Excel would be quite a memory hog. So it separates the number formats into their own area. I also reduce this so that we can see the important things.
https://i.postimg.cc/mDh5mW9r/Paste-...ML-Format2.png
The style "s18" is a date format, as is "s19"; as experienced VBA programmers, we recognize "s16" as the text format, but "s17" is strange.
Why doesn't this format include something like "0.00" and the currency sign?
Well, there are some named formats in Excel, which are provided differently by Excel depending on the region setting. This way, for example, all users worldwide will see a General Date adjusted to their respective region settings, without having to adjust the format of the cell! These named formats are listed in the Microsoft article for VBA.Format.
Unfortunately, the Range.Numberformat property does not accept these format names. VBA.Format doesn't help us either, we don't want to format the number, but set the number format of the cell. And I don't know of any way to read these number formats within Excel. And there are some strange ones like On/Off that can't even be formatted in Excel itself with the dialog box. That's why I use a trick.
With the AddIn I deliver another file PredefiniedFormatNames.xml, in this one is an XML structure that corresponds to a spreadsheet in Excel and the cells are formatted with one of the named formats. If you have followed my explanations so far, open this file with Notepad and look at it, then open the file with Excel, you will find it interesting.
My trick is to open this file when loading the AddIn, briefly read the number formats that Excel has used and close the file immediately.
So that the following code in the AddIn does not become unnecessarily complicated, the GetXMLSpreadsheetTables function delivers the data as a 2D array and the formats in the same size, which is, more or less, everything. ;)
So how do we get this into the target cells?
Arrays - Part Four - SpecialCells
The most urgent question for the target area is how we determine the visible cells, since we assume that the data can be filtered in any way.
Luckily, Excel has the SpecialCells function and most programmers call it directly. However, this feature comes with a few issues and may not work as expected. This is the case, for example, if we only check a single cell.
Code:
<head><style type="text/css">span {color: #000000;}.sc0 {}.sc2 {color: #008000;}.sc4 {color: #0000FF;}.sc12 {}.sc16 {color: #800000;}.sc24 {}</style></head><body>
<div style="float: left; white-space: pre; line-height: 1;"><span class="sc4">Sub</span><span class="sc24"> </span><span class="sc0">Example_SpecialCells_DontWork</span><span class="sc12">()</span><span class="sc24">
</span><span class="sc2">'Create the scenario
</span><span class="sc24"> </span><span class="sc0">ScenarioA</span><span class="sc24">
</span><span class="sc2">'Clear some cells
</span><span class="sc24"> </span><span class="sc0">Range</span><span class="sc12">(</span><span class="sc16">"B2:C2,D1:D2,5:10"</span><span class="sc12">).</span><span class="sc0">Clear</span><span class="sc24">
</span><span class="sc2">'B2 is empty, so this cell should be selected only!
</span><span class="sc24"> </span><span class="sc0">Range</span><span class="sc12">(</span><span class="sc16">"B2"</span><span class="sc12">).</span><span class="sc0">SpecialCells</span><span class="sc12">(</span><span class="sc0">xlCellTypeBlanks</span><span class="sc12">).</span><span class="sc4">Select</span><span class="sc24">
</span><span class="sc4">End</span><span class="sc24"> </span><span class="sc4">Sub</span></div></body>
To be 100% sure, we need to encapsulate the function in another function and catch this error. If you found this article by chance, the SpecialCells function is included in the files in the modLowLevel module, the download link is at the top of the article.
Code:
<head><style type="text/css">span {color: #000000;}.sc0 {}.sc2 {color: #008000;}.sc4 {color: #0000FF;}.sc12 {}.sc16 {color: #800000;}.sc24 {}</style></head><body>
<div style="float: left; white-space: pre; line-height: 1;"><span class="sc4">Sub</span><span class="sc24"> </span><span class="sc0">Example_SpecialCells_Works</span><span class="sc12">()</span><span class="sc24">
</span><span class="sc2">'Create the scenario
</span><span class="sc24"> </span><span class="sc0">ScenarioA</span><span class="sc24">
</span><span class="sc2">'Clear some cells
</span><span class="sc24"> </span><span class="sc0">Range</span><span class="sc12">(</span><span class="sc16">"B2:C2,D1:D2,5:10"</span><span class="sc12">).</span><span class="sc0">Clear</span><span class="sc24">
</span><span class="sc2">'B2 is empty, so this cell should be selected only!
</span><span class="sc24"> </span><span class="sc0">SpecialCells</span><span class="sc12">(</span><span class="sc0">Range</span><span class="sc12">(</span><span class="sc16">"B2"</span><span class="sc12">),</span><span class="sc24"> </span><span class="sc0">xlCellTypeBlanks</span><span class="sc12">).</span><span class="sc4">Select</span><span class="sc24">
</span><span class="sc4">End</span><span class="sc24"> </span><span class="sc4">Sub</span></div></body>
And with that we can also deal with another problem, it is possible that no cells are visible at all and in this case our function returns Nothing.
Code:
<head><style type="text/css">span {color: #000000;}.sc0 {}.sc2 {color: #008000;}.sc3 {color: #FF0000;}.sc4 {color: #0000FF;}.sc12 {}.sc16 {color: #800000;}.sc24 {}</style></head><body>
<div style="float: left; white-space: pre; line-height: 1;"><span class="sc4">Sub</span><span class="sc24"> </span><span class="sc0">Example_SpecialCells_RTE</span><span class="sc12">()</span><span class="sc24">
</span><span class="sc4">Dim</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc24"> </span><span class="sc4">As</span><span class="sc24"> </span><span class="sc0">Range</span><span class="sc24">
</span><span class="sc2">'Create the scenario
</span><span class="sc24"> </span><span class="sc0">ScenarioA</span><span class="sc24">
</span><span class="sc2">'Select some cells
</span><span class="sc24"> </span><span class="sc0">Range</span><span class="sc12">(</span><span class="sc16">"B3:E5"</span><span class="sc12">).</span><span class="sc4">Select</span><span class="sc24">
</span><span class="sc2">'Filter the cells
</span><span class="sc24"> </span><span class="sc0">Range</span><span class="sc12">(</span><span class="sc16">"A1"</span><span class="sc12">).</span><span class="sc0">AutoFilter</span><span class="sc24">
</span><span class="sc0">Range</span><span class="sc12">(</span><span class="sc16">"A1"</span><span class="sc12">).</span><span class="sc0">AutoFilter</span><span class="sc24"> </span><span class="sc3">1</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc16">"A8"</span><span class="sc24">
</span><span class="sc2">'In case of all seleczed cells are filtered out, no cells are visible!
</span><span class="sc24"> </span><span class="sc2">'This is the save way to detect this
</span><span class="sc24"> </span><span class="sc4">Set</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc0">SpecialCells</span><span class="sc12">(</span><span class="sc0">Selection</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">xlCellTypeVisible</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc4">If</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc24"> </span><span class="sc4">Is</span><span class="sc24"> </span><span class="sc4">Nothing</span><span class="sc24"> </span><span class="sc4">Then</span><span class="sc24">
</span><span class="sc0">MsgBox</span><span class="sc24"> </span><span class="sc16">"No visible cells"</span><span class="sc24">
</span><span class="sc4">End</span><span class="sc24"> </span><span class="sc4">If</span><span class="sc24">
</span><span class="sc2">'This line results in an RTE 1004
</span><span class="sc24"> </span><span class="sc4">Set</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc0">Selection</span><span class="sc12">.</span><span class="sc0">SpecialCells</span><span class="sc12">(</span><span class="sc0">xlCellTypeVisible</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc4">End</span><span class="sc24"> </span><span class="sc0">Sub</span></div></body>
With this we have almost all the tools together, only one thing is missing and to understand why we need it we have to look at a new scenario.
Arrays - Part Five - The Scenario
Here is the code for the new scenario.
Code:
<head><style type="text/css">span {color: #000000;}.sc0 {}.sc2 {color: #008000;}.sc3 {color: #FF0000;}.sc4 {color: #0000FF;}.sc12 {}.sc16 {color: #800000;}.sc24 {}</style></head><body>
<div style="float: left; white-space: pre; line-height: 1;"><span class="sc4">Sub</span><span class="sc24"> </span><span class="sc0">ScenarioB</span><span class="sc12">()</span><span class="sc24">
</span><span class="sc4">Dim</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc24"> </span><span class="sc4">As</span><span class="sc24"> </span><span class="sc0">Range</span><span class="sc24">
</span><span class="sc2">'Remove the AutoFilter if any
</span><span class="sc24"> </span><span class="sc4">If</span><span class="sc24"> </span><span class="sc0">ActiveSheet</span><span class="sc12">.</span><span class="sc0">AutoFilterMode</span><span class="sc24"> </span><span class="sc4">Then</span><span class="sc24"> </span><span class="sc0">Cells</span><span class="sc12">.</span><span class="sc0">AutoFilter</span><span class="sc24">
</span><span class="sc2">'Clear all cells
</span><span class="sc24"> </span><span class="sc0">Cells</span><span class="sc12">.</span><span class="sc0">Clear</span><span class="sc24">
</span><span class="sc2">'Refer to some cells
</span><span class="sc24"> </span><span class="sc4">Set</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc0">Range</span><span class="sc12">(</span><span class="sc16">"B2:F12"</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc4">With</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc12">.</span><span class="sc0">Offset</span><span class="sc12">(</span><span class="sc3">1</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc2">'Write a formula into to get the address of the cell
</span><span class="sc24"> </span><span class="sc12">.</span><span class="sc0">Formula</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc16">"=ADDRESS(ROW(),COLUMN(),4)"</span><span class="sc24">
</span><span class="sc2">'Write 1 or 0 into the fist column
</span><span class="sc24"> </span><span class="sc12">.</span><span class="sc0">Columns</span><span class="sc12">(</span><span class="sc3">1</span><span class="sc12">).</span><span class="sc0">Formula</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc16">"=MOD(ROW(),2)"</span><span class="sc24">
</span><span class="sc2">'Convert the formulas to values (using a 2D-array "on the fly")
</span><span class="sc24"> </span><span class="sc12">.</span><span class="sc0">Value</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc12">.</span><span class="sc0">Value</span><span class="sc24">
</span><span class="sc4">End</span><span class="sc24"> </span><span class="sc4">With</span><span class="sc24">
</span><span class="sc2">'Add Headers
</span><span class="sc24"> </span><span class="sc4">With</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc12">.</span><span class="sc0">Rows</span><span class="sc12">(</span><span class="sc3">1</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc12">.</span><span class="sc0">Formula</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc16">"=LEFT(ADDRESS(ROW(),COLUMN(P1),4),1)"</span><span class="sc24">
</span><span class="sc12">.</span><span class="sc0">Value</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc12">.</span><span class="sc0">Value</span><span class="sc24">
</span><span class="sc4">End</span><span class="sc24"> </span><span class="sc4">With</span><span class="sc24">
</span><span class="sc2">'Add an AutoFilter
</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc12">.</span><span class="sc0">AutoFilter</span><span class="sc24">
</span><span class="sc2">'Filter the first column
</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc12">.</span><span class="sc0">AutoFilter</span><span class="sc24"> </span><span class="sc3">1</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc3">1</span><span class="sc24">
</span><span class="sc2">'Select some cells in there
</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc12">.</span><span class="sc0">Offset</span><span class="sc12">(</span><span class="sc3">2</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc3">2</span><span class="sc12">).</span><span class="sc0">Resize</span><span class="sc12">(</span><span class="sc3">6</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc3">2</span><span class="sc12">).</span><span class="sc4">Select</span><span class="sc24">
</span><span class="sc4">End</span><span class="sc24"> </span><span class="sc4">Sub</span></div></body>
And here is how it looks like:
https://i.postimg.cc/PJsHPC4r/Paste-...Scenario-B.png
Arrays - Part Six - The Final
We have a filtered area and in this area a range is selected. Let's take a look at what happens when we just write an array in there.
Code:
<head><style type="text/css">span {color: #000000;}.sc0 {}.sc2 {color: #008000;}.sc3 {color: #FF0000;}.sc4 {color: #0000FF;}.sc12 {}.sc16 {color: #800000;}.sc24 {}</style></head><body>
<div style="float: left; white-space: pre; line-height: 1;"><span class="sc4">Sub</span><span class="sc24"> </span><span class="sc0">MultipleDestinationCells_DontWork</span><span class="sc12">()</span><span class="sc24">
</span><span class="sc4">Dim</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc24"> </span><span class="sc4">As</span><span class="sc24"> </span><span class="sc0">Range</span><span class="sc24">
</span><span class="sc4">Dim</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc24"> </span><span class="sc4">As</span><span class="sc24"> </span><span class="sc4">Long</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">c</span><span class="sc24"> </span><span class="sc4">As</span><span class="sc24"> </span><span class="sc4">Long</span><span class="sc24">
</span><span class="sc4">Dim</span><span class="sc24"> </span><span class="sc0">Data</span><span class="sc24">
</span><span class="sc2">'Create the scenario
</span><span class="sc24"> </span><span class="sc0">ScenarioB</span><span class="sc24">
</span><span class="sc2">'Get the visible selected cells
</span><span class="sc24"> </span><span class="sc4">Set</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc0">SpecialCells</span><span class="sc12">(</span><span class="sc0">Selection</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">xlCellTypeVisible</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc2">'Do we have any?
</span><span class="sc24"> </span><span class="sc4">If</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc24"> </span><span class="sc4">Is</span><span class="sc24"> </span><span class="sc4">Nothing</span><span class="sc24"> </span><span class="sc4">Then</span><span class="sc24">
</span><span class="sc0">MsgBox</span><span class="sc24"> </span><span class="sc16">"No visible cells selected"</span><span class="sc24">
</span><span class="sc4">Exit</span><span class="sc24"> </span><span class="sc4">Sub</span><span class="sc24">
</span><span class="sc4">End</span><span class="sc24"> </span><span class="sc4">If</span><span class="sc24">
</span><span class="sc2">'Get the number of rows and columns
</span><span class="sc24"> </span><span class="sc0">RangeCount</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">MaxColumns</span><span class="sc12">:=</span><span class="sc0">c</span><span class="sc24">
</span><span class="sc2">'Create an array of that size and fill it:
</span><span class="sc24"> </span><span class="sc2">'11 12
</span><span class="sc24"> </span><span class="sc2">'21 22
</span><span class="sc24"> </span><span class="sc2">'31 32
</span><span class="sc24"> </span><span class="sc4">ReDim</span><span class="sc24"> </span><span class="sc0">Data</span><span class="sc12">(</span><span class="sc3">1</span><span class="sc24"> </span><span class="sc4">To</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc3">1</span><span class="sc24"> </span><span class="sc4">To</span><span class="sc24"> </span><span class="sc0">c</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc4">For</span><span class="sc24"> </span><span class="sc0">c</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc3">1</span><span class="sc24"> </span><span class="sc4">To</span><span class="sc24"> </span><span class="sc0">UBound</span><span class="sc12">(</span><span class="sc0">Data</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc3">2</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc4">For</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc3">1</span><span class="sc24"> </span><span class="sc4">To</span><span class="sc24"> </span><span class="sc0">UBound</span><span class="sc12">(</span><span class="sc0">Data</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc0">Data</span><span class="sc12">(</span><span class="sc0">r</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">c</span><span class="sc12">)</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc24"> </span><span class="sc12">*</span><span class="sc24"> </span><span class="sc3">10</span><span class="sc24"> </span><span class="sc12">+</span><span class="sc24"> </span><span class="sc0">c</span><span class="sc24">
</span><span class="sc4">Next</span><span class="sc24">
</span><span class="sc4">Next</span><span class="sc24">
</span><span class="sc2">'Write it into
</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc12">.</span><span class="sc0">Value</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc0">Data</span><span class="sc24">
</span><span class="sc4">End</span><span class="sc24"> </span><span class="sc4">Sub</span></div></body>
Surprisingly, we don't get an error message and the filtered cells are not overwritten, but the values in the cells are completely wrong.
https://i.postimg.cc/3xHkPRQh/Paste-...-Dont-Work.png
It would still be understandable that we always get an 11 in the first column and always a 12 in the second. However, why a 31 appears in E7 is incomprehensible even to me. It obviously doesn't work that way at all.
We need to traverse the visible area, but not cell by cell. Multiple ranges in a Range object are automatically divided into Areas, and we can write a suitable array into each Area. So, we need a routine that copies the appropriate portion from our data array. Then we just need to execute a counter to get the next portion for the next range.
Code:
<head><style type="text/css">span {color: #000000;}.sc0 {}.sc2 {color: #008000;}.sc3 {color: #FF0000;}.sc4 {color: #0000FF;}.sc12 {}.sc16 {color: #800000;}.sc24 {}</style></head><body>
<div style="float: left; white-space: pre; line-height: 1;"><span class="sc4">Sub</span><span class="sc24"> </span><span class="sc0">MultipleDestinationCells_Works</span><span class="sc12">()</span><span class="sc24">
</span><span class="sc4">Dim</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc24"> </span><span class="sc4">As</span><span class="sc24"> </span><span class="sc0">Range</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">Area</span><span class="sc24"> </span><span class="sc4">As</span><span class="sc24"> </span><span class="sc0">Range</span><span class="sc24">
</span><span class="sc4">Dim</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc24"> </span><span class="sc4">As</span><span class="sc24"> </span><span class="sc4">Long</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">c</span><span class="sc24"> </span><span class="sc4">As</span><span class="sc24"> </span><span class="sc4">Long</span><span class="sc24">
</span><span class="sc4">Dim</span><span class="sc24"> </span><span class="sc0">Data</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">Part</span><span class="sc24">
</span><span class="sc2">'Create the scenario
</span><span class="sc24"> </span><span class="sc0">ScenarioB</span><span class="sc24">
</span><span class="sc2">'Get the visible selected cells
</span><span class="sc24"> </span><span class="sc4">Set</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc0">SpecialCells</span><span class="sc12">(</span><span class="sc0">Selection</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">xlCellTypeVisible</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc2">'Do we have any?
</span><span class="sc24"> </span><span class="sc4">If</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc24"> </span><span class="sc4">Is</span><span class="sc24"> </span><span class="sc4">Nothing</span><span class="sc24"> </span><span class="sc4">Then</span><span class="sc24">
</span><span class="sc0">MsgBox</span><span class="sc24"> </span><span class="sc16">"No visible cells selected"</span><span class="sc24">
</span><span class="sc4">Exit</span><span class="sc24"> </span><span class="sc4">Sub</span><span class="sc24">
</span><span class="sc4">End</span><span class="sc24"> </span><span class="sc4">If</span><span class="sc24">
</span><span class="sc2">'Get the number of rows and columns
</span><span class="sc24"> </span><span class="sc0">RangeCount</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">MaxColumns</span><span class="sc12">:=</span><span class="sc0">c</span><span class="sc24">
</span><span class="sc2">'Create an array of that size
</span><span class="sc24"> </span><span class="sc4">ReDim</span><span class="sc24"> </span><span class="sc0">Data</span><span class="sc12">(</span><span class="sc3">1</span><span class="sc24"> </span><span class="sc4">To</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc3">1</span><span class="sc24"> </span><span class="sc4">To</span><span class="sc24"> </span><span class="sc0">c</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc4">For</span><span class="sc24"> </span><span class="sc0">c</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc3">1</span><span class="sc24"> </span><span class="sc4">To</span><span class="sc24"> </span><span class="sc0">UBound</span><span class="sc12">(</span><span class="sc0">Data</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc3">2</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc4">For</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc3">1</span><span class="sc24"> </span><span class="sc4">To</span><span class="sc24"> </span><span class="sc0">UBound</span><span class="sc12">(</span><span class="sc0">Data</span><span class="sc12">)</span><span class="sc24">
</span><span class="sc0">Data</span><span class="sc12">(</span><span class="sc0">r</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">c</span><span class="sc12">)</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc24"> </span><span class="sc12">*</span><span class="sc24"> </span><span class="sc3">10</span><span class="sc24"> </span><span class="sc12">+</span><span class="sc24"> </span><span class="sc0">c</span><span class="sc24">
</span><span class="sc4">Next</span><span class="sc24">
</span><span class="sc4">Next</span><span class="sc24">
</span><span class="sc2">'We start at row 1 always!
</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc3">1</span><span class="sc24">
</span><span class="sc4">For</span><span class="sc24"> </span><span class="sc4">Each</span><span class="sc24"> </span><span class="sc0">Area</span><span class="sc24"> </span><span class="sc4">In</span><span class="sc24"> </span><span class="sc0">Dest</span><span class="sc12">.</span><span class="sc0">Areas</span><span class="sc24">
</span><span class="sc2">'Copy the part of the Data array that fit's into the Area
</span><span class="sc24"> </span><span class="sc0">CopyPart</span><span class="sc24"> </span><span class="sc0">Data</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">Part</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc3">1</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">Area</span><span class="sc12">.</span><span class="sc0">Rows</span><span class="sc12">.</span><span class="sc0">Count</span><span class="sc12">,</span><span class="sc24"> </span><span class="sc0">Area</span><span class="sc12">.</span><span class="sc0">Columns</span><span class="sc12">.</span><span class="sc0">Count</span><span class="sc24">
</span><span class="sc2">'Write into
</span><span class="sc24"> </span><span class="sc0">Area</span><span class="sc12">.</span><span class="sc0">Value</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc0">Part</span><span class="sc24">
</span><span class="sc2">'Increment the row counter
</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc24"> </span><span class="sc12">=</span><span class="sc24"> </span><span class="sc0">r</span><span class="sc24"> </span><span class="sc12">+</span><span class="sc24"> </span><span class="sc0">Area</span><span class="sc12">.</span><span class="sc0">Rows</span><span class="sc12">.</span><span class="sc0">Count</span><span class="sc24">
</span><span class="sc4">Next</span><span class="sc24">
</span><span class="sc4">End</span><span class="sc24"> </span><span class="sc0">Sub</span></div></body>
And that's it.
https://i.postimg.cc/L5LPGQv4/Paste-...ells-Works.png
Finally, there is just one more detail to note: If you copy data from an HTML source, you may get several arrays. In order to keep the arrays as small as possible, these arrays are not combined into one, but processed individually one after the other. If you have any questions about the tool or the explanations, please post them here. I'll do my best to explain them to you.
Best regards, Andreas.