Option Explicit
Sub ConvertRangeToColumn()
Dim i&, j&, k&, rng, res(1 To 10000, 1 To 1)
rng = Range("B2:N5").Value
For i = 1 To UBound(rng)
For j = 1 To UBound(rng, 2)
If Not IsEmpty(rng(i, j)) Then
k = k + 1: res(k, 1) = rng(i, j)
End If
Next
Next
If k > 0 Then
Range("F9:F10000").ClearContents
Range("F9").Resize(k, 1).Value = res
End If
End Sub
Ra đúng kết quả rồi bác ạXài đỡ:
PHP:Option Explicit Sub ConvertRangeToColumn() Dim i&, j&, k&, rng, res(1 To 10000, 1 To 1) rng = Range("B2:N5").Value For i = 1 To UBound(rng) For j = 1 To UBound(rng, 2) If Not IsEmpty(rng(i, j)) Then k = k + 1: res(k, 1) = rng(i, j) End If Next Next If k > 0 Then Range("F9:F10000").ClearContents Range("F9").Resize(k, 1).Value = res End If End Sub
Cũng nên tự hào là có người bắt đầu theo đường lối code của bạn, dùng ngữ pháp thượng cổ (dấu hai chấm để nối nhiều lệnh thành 1 dòng)Chậm hơn chàng BeBo rồi!
Dạ sư phụ, vì bài này thuộc dạng căn bản nên các sư phụ chê, nên mới đến lượt đệ tử múa rìu.Chậm hơn chàng BeBo rồi!
Bạn thử tại F9Chào các bác!
Em đang có một bài toán là cần tổng hợp dữ liệu từ nhiều hàng thành một cột, bỏ qua trộn ô, bỏ qua ô trống
Dữ liệu và mô tả kết quả như tệp em đính kèm
Các bác giúp em với, em cảm ơn ạ!
Bạn thử tại F9
F9=INDIRECT(TEXT(AGGREGATE(15,6,ROW($B$2:$N$5)*10^3+COLUMN($B$2:$N$5)/($B$2:$N$5>0),ROW(A1)),"R000C000"),0)
Bác ơi,Dạ sư phụ, vì bài này thuộc dạng căn bản nên các sư phụ chê, nên mới đến lượt đệ tử múa rìu.
Cỡ công thức khủng này mà dám dùng hàm indirect thì bạo thật.Bạn thử tại F9
F9=INDIRECT(TEXT(AGGREGATE(15,6,ROW($B$2:$N$5)*10^3+COLUMN($B$2:$N$5)/($B$2:$N$5>0),ROW(A1)),"R000C000"),0)
Sub ConvertRangeToColumn()
Dim i As Long
Dim j As Long
Dim inputRange As Range
Dim outputRange As Range
Dim row As Range
Dim Arr() As Variant
Set inputRange = Sheets("Sheet1").Range("B2:N5")
Set outputRange = Sheets("Sheet1").Range("F9")
For Each row In inputRange.Rows
If Not row.Hidden Then
For i = 1 To inputRange.Columns.Count
If Not IsEmpty(row.Cells(1, i).Value) Then
j = j + 1
ReDim Preserve Arr(1 To 1, 1 To j) ' Tăng kích thước của mảng tạm
Arr(1, j) = row.Cells(1, i).Value ' Lưu giá trị vào mảng tạm
End If
Next i
End If
Next row
outputRange.Resize(j - 1, 1).Value = WorksheetFunction.Transpose(Arr)
End Sub
Quả có múa thật.Mạn phép múa que trước mặt các anh (
...
Muốn bỏ qua dòng nào? Code dưới thêm 1 dòng, ví dụ bỏ qua dòng 2:trường hợp em ẩn 1 hàng và em muốn câu lệnh bỏ qua nó thì em cần làm thế nào ạ?
Option Explicit
Sub ConvertRangeToColumn()
Dim i&, j&, k&, rng, res(1 To 10000, 1 To 1)
rng = Range("B2:N5").Value
For i = 1 To UBound(rng)
If i <> 2 Then ' Neu muon bo qua dong 2 (E,F,A)
For j = 1 To UBound(rng, 2)
If Not IsEmpty(rng(i, j)) Then
k = k + 1: res(k, 1) = rng(i, j)
End If
Next
End If
Next
If k > 0 Then
Range("F9:F10000").ClearContents
Range("F9").Resize(k, 1).Value = res
End If
End Sub
Em cảm ơn bác,Muốn bỏ qua dòng nào? Code dưới thêm 1 dòng, ví dụ bỏ qua dòng 2:
PHP:Option Explicit Sub ConvertRangeToColumn() Dim i&, j&, k&, rng, res(1 To 10000, 1 To 1) rng = Range("B2:N5").Value For i = 1 To UBound(rng) If i <> 2 Then ' Neu muon bo qua dong 2 (E,F,A) For j = 1 To UBound(rng, 2) If Not IsEmpty(rng(i, j)) Then k = k + 1: res(k, 1) = rng(i, j) End If Next End If Next If k > 0 Then Range("F9:F10000").ClearContents Range("F9").Resize(k, 1).Value = res End If End Sub
Em cảm ơn bác ạMạn phép múa que trước mặt các anh (
PHP:Sub ConvertRangeToColumn() Dim i As Long Dim j As Long Dim inputRange As Range Dim outputRange As Range Dim row As Range Dim Arr() As Variant Set inputRange = Sheets("Sheet1").Range("B2:N5") Set outputRange = Sheets("Sheet1").Range("F9") For Each row In inputRange.Rows If Not row.Hidden Then For i = 1 To inputRange.Columns.Count If Not IsEmpty(row.Cells(1, i).Value) Then j = j + 1 ReDim Preserve Arr(1 To 1, 1 To j) ' Tăng kích thước của mảng tạm Arr(1, j) = row.Cells(1, i).Value ' Lưu giá trị vào mảng tạm End If Next i End If Next row outputRange.Resize(j - 1, 1).Value = WorksheetFunction.Transpose(Arr) End Sub
Cảm ơn anh. Em chỉnh lại:Quả có múa thật.
1. Khi đặt tên biến, tránh những tên có thể đụng chạm với object/enum của VBA.
Điển hình: row.
2. Tránh tối đa việc Redim Reserve bên trong vòng lặp. Trừ phi biết chắc chắn số lần lặp khá nhỏ.
Bạn có biết mỗi lần gặp lệnh này thì VBA phải làm gì không?
Thà là tạo một mảng khá lớn rồi giới hạn số dòng cần chép xuống trang tính.
Option Explicit
Sub ConvertRangeToColumn()
Dim i As Long
Dim j As Long
Dim inputRange As Range
Dim outputRange As Range
Dim rws As Range
Dim Arr() As Variant
Set inputRange = Sheets("Sheet1").Range("B2:N5")
Set outputRange = Sheets("Sheet1").Range("F9")
outputRange.Resize(1000, 1).ClearContents
ReDim Arr(1 To 1, 1 To 1000)
For Each rws In inputRange.Rows
If Not rws.Hidden Then
For i = 1 To inputRange.Columns.Count
If Not IsEmpty(rws.Cells(1, i).Value) Then
j = j + 1
Arr(1, j) = rws.Cells(1, i).Value
End If
Next i
End If
Next rws
outputRange.Resize(j, 1).Value = WorksheetFunction.Transpose(Arr)
End Sub
Cảm ơn anh. Em chỉnh lại:
PHP:Option Explicit ... ReDim Arr(1 To 1, 1 To 1000) ... outputRange.Resize(j, 1).Value = WorksheetFunction.Transpose(Arr) End Sub