Copy mảng từ vị trí này sang vị trí khác bằng hàm (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

hoasimmautim

Thành viên mới
Tham gia
25/6/15
Bài viết
8
Được thích
2
Chào anh chị ạ

Anh chị vui lòng cho em hỏi chút xíu về tạo mảng và copy mảng, viết bằng VBA, phần này em mới tìm hiểu nhưng vẫn cần thêm nhiều thời gian mới viết được ạ

1/ Đầu vào em có mảng giá trị bất kỳ (ký tự hoặc số): 5 dòng và 5 cột
2/ kết quả xuất đúng giá trị của mảng : 5 dòng và 5 cột
Điều kiện: Viết bằng hàm, ở 1 cell bất kỳ trên sheet em gọi hàm đó ra thì xuất được kết quả như mong muốn

( Ở đây em đã viết bằng vòng lặp for chạy rồi, nhưng còn nhược điểm đầu ra bị fit chết vị trí, nên em mong muốn cải tiến dùng hàm lập trình, với mong muốn muốn cho xuất hiện ở ô nào bất kỳ thì sẽ gọi hàm từ ô đó sẽ cho kết quả !, tự đặt tên hàm bất kỳ )

Nhờ các anh chị suy nghĩ giúp em ạ

Chúc cả nhà vui vẻ
 
bạn đưa cái file đó lên xem.......
trước tới gờ tui chưa thấy có thể xuất ra hàm chứa trong cell ra???
vì khi bạn đưa vào mảng thì nó đã chuyển thành value rồi???
 
Upvote 0
Chào anh Let' GâuGâu,

Em upload lên đây file VD mảng gồm 10 dòng & 10 cột

Nhờ anh xem, và có thể cải tiến thành hàm được chứ ạ !

Cảm ơn anh nhiu
 

File đính kèm

Upvote 0
Chào anh Let' GâuGâu,

Em upload lên đây file VD mảng gồm 10 dòng & 10 cột

Nhờ anh xem, và có thể cải tiến thành hàm được chứ ạ !

Cảm ơn anh nhiu

Mã:
Sub chuyenmang()
Dim Mang As Variant

Mang = [a1:e10]
[COLOR=#ff0000][h1][/COLOR].Resize(UBound(Mang), UBound(Mang, 2)) = Mang
 
End Sub

muốn đặt kết quả ở đâu thì chỉ cần sửa lại cái màu đỏ
 
Upvote 0
Chào anh Let Gâu Gâu

Cảm ơn anh đã giúp em giải pháp mới, em có thêm nhiều lựa chọn code

Đọan code của anh, cũng còn vấn đề là : Muốn cho kết quả xuất ra ở từ ô nào thì cho vị trí ô đó nằm trong code luôn, như màu đỏ

Có thể giúp em thêm tí nữa: tại 1 ô bất kỳ ở ngòai sheet, em chỉ việc gọi hàm hay thủ tục ra, thì sẽ cho kết quả,

xem hình:

+ Hình 1: Gọi tên hàm; hình 2 sẽ cho kết quả

Cảm ơn anh ạ
Sub chuyenmang()
Dim Mang As Variant

Mang = [a1:e10]
[h1].Resize(UBound(Mang), UBound(Mang, 2)) = Mang

End Sub
 

File đính kèm

  • hinh 1.jpg
    hinh 1.jpg
    24.5 KB · Đọc: 60
  • hinh 2.jpg
    hinh 2.jpg
    25.4 KB · Đọc: 46
Upvote 0
Chào anh Let Gâu Gâu

Cảm ơn anh đã giúp em giải pháp mới, em có thêm nhiều lựa chọn code

Đọan code của anh, cũng còn vấn đề là : Muốn cho kết quả xuất ra ở từ ô nào thì cho vị trí ô đó nằm trong code luôn, như màu đỏ

Có thể giúp em thêm tí nữa: tại 1 ô bất kỳ ở ngòai sheet, em chỉ việc gọi hàm hay thủ tục ra, thì sẽ cho kết quả,

xem hình:

+ Hình 1: Gọi tên hàm; hình 2 sẽ cho kết quả

Cảm ơn anh ạ
Sub chuyenmang()
Dim Mang As Variant

Mang = [a1:e10]
[h1].Resize(UBound(Mang), UBound(Mang, 2)) = Mang

End Sub
Sửa lại tý tẹo xem sao:
Mã:
Sub chuyenmang()
Dim Mang As Variant
Mang = [a1:e10]
ActiveSheet.ActiveCell.Resize(UBound(Mang), UBound(Mang, 2)) = Mang
End Sub
 
Upvote 0
đang nhân nhi cafe thấy Bạn
chuot0106
Let'GâuGâu viết hay quá nên góp vui một tị ...sửa thêm một tẹo và làm khó thêm một tí nữa coi cho đỡ ngúa tay
PHP:
Public Sub CopyMang(ByVal Nguon As Range, Dich As Range)
    Dim Arr(), Kq(), i&, j&: Arr = Nguon.Value
    ReDim Kq(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
    For i = 1 To UBound(Arr, 1)
        For j = 1 To UBound(Arr, 2)
            Kq(i, j) = Arr(i, j)
        Next
    Next
    Dich.Resize(UBound(Arr, 1), UBound(Arr, 2)) = Kq
End Sub

Public Sub Chay_Sub_Nay()
     CopyMang Range("A1:E10"), [I1]''I1 La noi Paste du lieu den
End Sub
 
Upvote 0
sửa thêm một tẹo và làm khó thêm một tí nữa coi cho đỡ ngúa tay
PHP:
Public Sub CopyMang(ByVal Nguon As Range, Dich As Range)
    Dim Arr(), Kq(), i&, j&: Arr = Nguon.Value
    ReDim Kq(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
    For i = 1 To UBound(Arr, 1)
        For j = 1 To UBound(Arr, 2)
            Kq(i, j) = Arr(i, j)
        Next
    Next
    Dich.Resize(UBound(Arr, 1), UBound(Arr, 2)) = Kq
End Sub

Public Sub Chay_Sub_Nay()
     CopyMang Range("A1:E10"), [I1]''I1 La noi Paste du lieu den
End Sub

Gì kỳ cục vậy trời? Tự dưng thêm cái For... Next vào cho rách việc
???!!!
 
Upvote 0
Sửa lại tý tẹo xem sao:
Mã:
Sub chuyenmang()
Dim Mang As Variant
Mang = [a1:e10]
ActiveSheet.ActiveCell.Resize(UBound(Mang), UBound(Mang, 2)) = Mang
End Sub
Tại một thời điểm ActiveCell là duy nhất (nếu có ActiveCell) nên không cần phải thêm ActiveSheet. phía trước
Tôi thật sự không hiểu chủ topic muốn làm cái gì. Làm vầy khác gì copy + paste value đâu. Code chi cho màu mè.
 
Upvote 0
Tại sao không thể copy thẳng mà phải qua mảng trung gian?
 
Upvote 0
Em đoán chủ topic đang voọc vba.

Nó có thể là một bước của nhiều công việc. vd
bước 1: copy mảng
bước 2: tính tổng cột i, j, k
bước 3: xoá mảng cũ

Vì chủ thớt bị vướng ngay bước đầu cho nên chưa thấy các bước kế tiếp.

Do vậy tôi mới đặt câu hỏi "tại sao phải qua mảng trung gian". Tuỳ theo công việc kế tiếp mà mảng trung gian có hiệ quả hơn hay không.
 
Upvote 0
Chào các anh ạ
Em có khoảng vài ngàn dòng data excel, thế nên mới dùng hàm về tiện copy ra 1 cell bất kỳ mà mình mong muốn. Nếu còn copy paste thì ko phù hợp, mà công tác này lặp lại nhiều chục lần trong 1 ngày, vì mỗi lần đổ dữ liệu ra excel từ nguồn khác từ 2000-4000 dòng.
Do đó, nhờ các anh tham vấn giúp viết hàm giúp em ạ
-------------------------
Nên là đề bài em yêu cầu 10 dòng, 10 cột
đầu ra cũng 10 dòng, 10 cột
ĐK: Phải dùng hàm để gọi kết quả ra ( vô code set chết 1 ô, thì chỉ xuất kq ra đúng từ ô đó thôi, em muốn linh động hơn -sẽ cho kq ở bất kỳ 1 ô trên sheet )

Cảm ơn sự chia sẻ nhiều của các anh ạ, giúp thêm em tí
 
Upvote 0
Gì kỳ cục vậy trời? Tự dưng thêm cái For... Next vào cho rách việc
???!!!
Vì lâu nay theo Các bạn GPE học code ...bây giờ kiến thức khá thêm một tí .... nên Em đang tập viết Function và tham lam gì đó... để viết ứng dụng vào công việc của Em thay vì có nhiều sub giống nhau chỉ khác nhau Nguon va Dich nên Em muốn rút gọn code lại nên mới làm vậy ... và khi viết một ứng dụng lớn Em thấy người ta thường hay làm vậy...

Quay lại với đề tại này biết là họ không dùng For Next thì có một cách hay nhất Let'GauGau mần mất rồi chưa nghĩ ra cách nào hay hơn, ngắn hơn nên Em mới tập QUẬY kiểu tham lam đó...--=0--=0--=0
 
Upvote 0
Viết sub thì không khó, còn function dùng để gọi từ 1 ô trên sheet thì khó đấy. Có thể đánh dấu 1 vùng 10*10 rồi gọi hàm mảng thì tạm được nhưng dữ liệu vài ngàn dòng thì không khả thi. Cách khác là trả kết quả ở ô gọi hàm, các ô còn lại dùng sự kiện worksheet_calculate để trả về dữ liệu. Có thể có cách khác mà mình không rõ tương tự hàm bs_sql của addin A-tools, gọi hàm ở 1 ô nhưng trả về cả bảng kết quả.
 
Upvote 0
Nếu Thớt này đang tập Vọc VBA thì chế lại code Let'GauGau cho Bạn Tìm hiểu thêm kiểu Thằm lằm cắn đuôi nhau chạy cũng hay nè ....Lưu ý kiểu này dữ liệu ximachao là cười đâu bụng luôn đó....muốn biết thì chạy code nha--=0--=0--=0
PHP:
Sub Chay_GiapDong()
    Dim Mang
    Mang = [A1].CurrentRegion
    Range("H1").Resize(UBound(Mang), UBound(Mang, 2)) = Mang
End Sub

Hay Kiểu 2 Ko Dùng Arr Và For .. Next
PHP:
Sub Chay_GiapDong2()
    [A1].CurrentRegion.Copy [I1]
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Viết sub thì không khó, còn function dùng để gọi từ 1 ô trên sheet thì khó đấy. Có thể đánh dấu 1 vùng 10*10 rồi gọi hàm mảng thì tạm được nhưng dữ liệu vài ngàn dòng thì không khả thi. Cách khác là trả kết quả ở ô gọi hàm, các ô còn lại dùng sự kiện worksheet_calculate để trả về dữ liệu. Có thể có cách khác mà mình không rõ tương tự hàm bs_sql của addin A-tools, gọi hàm ở 1 ô nhưng trả về cả bảng kết quả.
Thì mình đang Vọc theo hướng đó .... mình coi rất nhiều dự án code lớn thấy họ làm vậy ...rất khoa học và ngắn gọn code
 
Upvote 0
Chào các anh ạ
Em có khoảng vài ngàn dòng data excel, thế nên mới dùng hàm về tiện copy ra 1 cell bất kỳ mà mình mong muốn. Nếu còn copy paste thì ko phù hợp, mà công tác này lặp lại nhiều chục lần trong 1 ngày, vì mỗi lần đổ dữ liệu ra excel từ nguồn khác từ 2000-4000 dòng.
Do đó, nhờ các anh tham vấn giúp viết hàm giúp em ạ
...

Vài chục: trung bình 30; 2000-4000: trung bình 3000
Suy ra gần 100.000 dòng dữ liệu 1 ngày.

Mức độ này thuộc về CSDL chuyên. Ít nhất là phải dùng Access
Excel là bảng tính. Lâu lâu 1 lần thì được. Nếu làm thường ngày thì giống như mua một chiếc xe du lịch về làm công việc tải hàng.
 
Upvote 0
Không rõ là tác giả fải nhất thiết xài hàm hay là chính tác giả chưa fân biệt giữa hàm & 1 macro.

Vì trong file của bạn í đang là 1 macro bình thường, ngỏ hầu chỉ là "Copy" 1 vùng dữ liệu bất kì sang 1 vùng khác mà bạn í muốn.

Theo mình nghĩ, nếu thật sự cần hàm thì cũng fải viết 1 macro để thực thi công việc này trơn tru cái đã. Macro này trãi qua các bước như sau:

B1: Xác định vùng dữ liệu cần "Copy" (Xác định số dòng & số cột của 1 vùng bất kỳ)
B2: Định vị trí cần chép tới, mà trước tiên là vị trí ô đầu tiên trái nhất của vùng "đích" đến
B3 (Nếu cần) kiểm tra dữ toàn bộ các ô trong vùng sắp được đỗ dữ liệu này có dữ liệu hay không? Nếu không mới chuyển sang bước cuối
B4: Chép (dễ ợt hà!)

Cái mà cộng đồng cần là hiểu rõ í đồ tác giả topic dưới góc độ VBA

Chỉ sau khi viết được macro rồi ta mới thử tiến hành viết hàm người dùng, nếu 1 khi tác giả vẫn khăng khăng là cần hàm người dùng!
 
Lần chỉnh sửa cuối:
Upvote 0
Chào anh SA_DQ,
Em đã sử dụng bằng macro thì ok, nhưng vấn đề ở đây muốn nâng lên 1 tầm mới, cải tiến chút xíu..., hy vọng đây là kết quả có thể những anh chị em khác sẽ cần đến
Mong rằng các anh tiếp tục tham vấn giúp em, miễn sao viết thành hàm thì chi bằng ạ.

Chúc anh , & tất cả thành viên có tuần mới làm việc hăn say nhiều niềm vui
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom