VSTACK combines ranges vertically and returns one spilled array. To keep a single header, include the first table’s header and start later tables on their first data row.
For tables in A1:B3 and D1:E3, use =VSTACK(A1:B3,D2:E3). The second range starts at row 2, so its header is not repeated.
Stack Two Tables and Keep One Header
Enter the two source tables like this:
| A: Team | B: Sales | D: Team | E: Sales |
|---|---|---|---|
| North | 10 | East | 30 |
| South | 20 | West | 40 |
=VSTACK(A1:B3,D2:E3)
The tested ranges contained North and South sales in the first table, followed by East and West sales in the second.
The formula returned one five-row table: the header, then North, South, East, and West in that order.

VSTACK does not match records or sort them. It appends each argument below the previous one and preserves their sequence.
VSTACK Function Syntax
=VSTACK(range1,[range2,...])
- range1 is the first range or array to return.
- range2 and later arguments are appended underneath it.
The result expands from the formula cell. Leave enough empty cells below and to the right for the complete output.
Stack Three or More Ranges
Add another argument for each table. This formula keeps the header from the first table and appends two additional data blocks:
In a third table, enter Central and 50 in J2:K2, then International and 60 in J3:K3.
=VSTACK(A1:B3,D2:E3,J2:K3)
Each range can contain a different number of rows. VSTACK simply places the next result under the previous one.
You can also pass array-returning formulas. For example, SORT can order one block before VSTACK appends it.
=VSTACK(A2:B3,SORT(D2:E3,1,TRUE))
Remove Blank Rows From VSTACK
VSTACK preserves blank rows inside each source range. In the live test, a blank row between A and B remained blank in the combined result.
Filter each source when the final table should contain only populated rows:
=VSTACK(FILTER(A2:B,A2:A<>""),FILTER(D2:E,D2:D<>""))
Each FILTER keeps rows whose first column is populated. Choose a column that should always contain a value for valid records.
Stack Ranges With Different Numbers of Columns
VSTACK can combine ranges with different widths. The output uses the widest argument and fills missing cells from narrower ranges with #N/A.
In the test, A10:B11 had two columns while D10:D11 had one:
=VSTACK(A10:B11,D10:D11)
The two rows from D10:D11 appeared in the first output column. Their second-column cells contained #N/A.
If those missing fields are acceptable, replace only the expected padding errors after checking the source widths.
=IFERROR(VSTACK(A10:B11,D10:D11),"")
Add a Custom Header Above Data
An inline array can supply a header without a helper range:
=VSTACK({"Team","Sales"},A2:B3)
The comma separates columns in this en-US array literal. Array separators vary with spreadsheet locale.
Google defines VSTACK as appending ranges vertically and in sequence. See the official VSTACK reference.
Other Google Sheets articles you may also like