Các câu hỏi về mảng trong VBA (Array) (1 người xem)

  • Thread starter Thread starter viehoai
  • Ngày gửi Ngày gửi
Liên hệ QC

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

viehoai

Thành viên gắn bó
Tham gia
22/5/09
Bài viết
2,599
Được thích
2,908
Xin các anh chị giúp đỡ Code Gán các giá trị của một Range là các phần tử của Mãng
Ví dụ: Tôi có các giá trị của Range("A1:A10"). Tôi muốn viết code để gán giá trị của các cells từ A1:A10 là các phần tử của Mãng Arr chẳn hạn.
Xin cảm ơn các anh chị
 
Chỉ mỗi MultiSelect = TRUE thì không giải quyết được đâu.

Có một điều ít người biết là nếu đúp chuột trên vd. CommandButton thì sẽ có 5 sự kiện được kích hoạt. Có thể làm thí nghiệm như sau: mở tập tin mới -> thêm UserForm1 -> đặt CommandButton1 trên UserForm -> viết code trong UserForm
Mã:
Option Explicit

Private k As Long

Private Sub CommandButton1_Click()
    k = k + 1
    Debug.Print "Click" & k
End Sub

Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    k = k + 1
    Debug.Print "DblClick" & k
End Sub

Private Sub CommandButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    k = k + 1
    Debug.Print "Down" & k
End Sub

Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    k = k + 1
    Debug.Print "Up" & k
End Sub
-> hiển thị Form -> đúp chuột vào CommandButton1 -> sẽ có kết quả:
Down1
Up2
Click3
DblClick4
Up5

Như thế khi đúp chuột thì có 5 sự kiện được kích hoạt cho CommandButton1, thứ tự là: MouseDown -> MouseUp -> Click -> DblClick -> MouseUp.

Trong nhiều tình huống MouseUp thứ 2 được kích hoạt khi "dưới trỏ chột" đã là control hoàn toàn khác. Tức ta đúp chuột trên control1 và MouseUp thứ 2 không được kích hoạt cho control1 mà nó được kích hoạt cho control2, khi mà ở thời điểm sau khi thực hiện DblClick thì "dưới trỏ chuột" không phải là control1 mà là control2.

Cụ thể trong trường hợp của bạn như thế nào? Bạn hãy thiết lập MultiSelect = TRUE. Khi bạn đúp chuột trong K2 thì có thể KH0007 (đúp chuột gần mép trên của K2), KH0008 (đúp chuột quãng giữa của K2) hoặc KH0009 (đúp chuột gần mép dưới của K2) được chọn trong ListBox. Tại sao? Khi hiển thị Form thì mục KH0007, KH0008 và KH0009 đều nằm gọn trong dòng 2 của sheet so với màn hình. Trên máy bạn với độ phân giải khác thì rất có thể đó là 3 mục KH... khác nhưng bản chất là như nhau. Tức sau khi Form được hiển thị thì trỏ chuột đang ở vị trí của dòng KH0007, KH008 hoăc KH009 trong ListBox . Vì thế MouseUp thứ 2 được kích hoạt cho ListBox. Lúc đó code trong thư viện VBA sẽ chọn KH007, KH0008 hoặc KH0009 tùy theo vị trị chuột lúc đó ở trên dòng của mục KH0007, KH0008 hay KH0009 (dòng dưới trỏ chuột sẽ được chọn).
----------
Theo tôi bạn không dùng Worksheet_BeforeDoubleClick cho sheet DCCN. Bạn có thể đặt 1 Button1 trên sheet vả hiển thị Form từ Button1.
Cám ơn bác rất nhiều nhé, do em làm thiếu mất đoạn code, giờ thì okay rồi ah.

Hy vọng Bác giúp em bẫy lỗi trong trường hợp này ah:
Chọn kiểm tra Từ ngày ... đến ngày ... mà không có dữ liệu (phát sinh) thì cho hiện ra bảng thông báo "Chua phat sinh"
Nhờ bác hỗ trợ giúp em đoạn code. Em cám ơn bác rất nhiều, để hoàn thiện hơn ah !
Mã:
Private Sub LBDMKH_Change()
    Dim Id, i
    Id = LBDMKH.ListIndex
    With Me.LBDMKH
        On Error Resume Next
        If .Selected(Id) Then
            If Not Dic.exists(.List(Id, 0)) Then
                Dic.ADD .List(Id, 0), .List(Id, 0) & ";" & .List(Id, 1) & ";" & .List(Id, 2) & ";" & .List(Id, 3)
            End If
        Else
            Dic.Remove (.List(Id, 0))
        End If
    End With
End Sub
 

File đính kèm

Upvote 0
Cám ơn bác rất nhiều nhé, do em làm thiếu mất đoạn code, giờ thì okay rồi ah.

Hy vọng Bác giúp em bẫy lỗi trong trường hợp này ah:
Chọn kiểm tra Từ ngày ... đến ngày ... mà không có dữ liệu (phát sinh) thì cho hiện ra bảng thông báo "Chua phat sinh"
Nhờ bác hỗ trợ giúp em đoạn code. Em cám ơn bác rất nhiều, để hoàn thiện hơn ah !
Mã:
Private Sub LBDMKH_Change()
    Dim Id, i
    Id = LBDMKH.ListIndex
    With Me.LBDMKH
        On Error Resume Next
        If .Selected(Id) Then
            If Not Dic.exists(.List(Id, 0)) Then
                Dic.ADD .List(Id, 0), .List(Id, 0) & ";" & .List(Id, 1) & ";" & .List(Id, 2) & ";" & .List(Id, 3)
            End If
        Else
            Dic.Remove (.List(Id, 0))
        End If
    End With
End Sub
Hãy mô tả cách thức hoạt động code trong Form cho người khác hiểu.

Tôi chưa tìm hiểu nhưng tôi có câu hỏi. Có thể chọn nhiều mục trong ListBox hay không? Đã có lúc có người đề nghị MultiSelect = TRUE nhưng không thấy bạn phản đối. Bây giờ tôi lại có cảm giác là bạn cho khả năng chọn nhiều trong ListBox.
 
Upvote 0
Tôi chưa tìm hiểu nhưng tôi có câu hỏi. Có thể chọn nhiều mục trong ListBox hay không? Đã có lúc có người đề nghị MultiSelect = TRUE nhưng không thấy bạn phản đối. Bây giờ tôi lại có cảm giác là bạn cho khả năng chọn nhiều trong ListBox.
File khác và câu hỏi trong file cũng khác rồi anh.
Chọn kiểm tra Từ ngày ... đến ngày ... mà không có dữ liệu (phát sinh) thì cho hiện ra bảng thông báo "Chua phat sinh"
Bạn đưa nhầm file à?
Câu hỏi trong file "Trich loc bao cao" bài 1419 xử lý như sau:
1. Cột K chưa được xoá nên chạy ghi đè lên lần chạy trước, đè không hết thì lòi đầu lòi đuôi ra
2. Không có dữ liệu thì sửa lại:
PHP:
    If k = 0 Then
        MsgBox "No data match"
        Exit Sub
    Else
    With Sheet2
         ....
        Range("E15").Offset(k + 3, 0).Value = "=tvnd(R[-2]C[5])"
        .....
    End With
    End If
 
Upvote 0
Hãy mô tả cách thức hoạt động code trong Form cho người khác hiểu.

Tôi chưa tìm hiểu nhưng tôi có câu hỏi. Có thể chọn nhiều mục trong ListBox hay không? Đã có lúc có người đề nghị MultiSelect = TRUE nhưng không thấy bạn phản đối. Bây giờ tôi lại có cảm giác là bạn cho khả năng chọn nhiều trong ListBox.
Đoạn code này là chính là của Bác ndu96081631 đấy ah, do em bỏ sót đoạn code đó, và chỉnh lại xíu thôi.
Đúng là có thể chọn được nhiều đối tượng (em chưa bẫy được ah). Vì ở đây e chỉ chọn ra 1 khách hàng và lấy mã khách hàng thôi. Em rất cám ơn anh đã giúp đỡ. MultiSelect = TRUE thật sự em chưa biết là phải làm như thế nào, hix
Bài đã được tự động gộp:

File khác và câu hỏi trong file cũng khác rồi anh.

Bạn đưa nhầm file à?
Câu hỏi trong file "Trich loc bao cao" bài 1419 xử lý như sau:
1. Cột K chưa được xoá nên chạy ghi đè lên lần chạy trước, đè không hết thì lòi đầu lòi đuôi ra
2. Không có dữ liệu thì sửa lại:
PHP:
    If k = 0 Then
        MsgBox "No data match"
        Exit Sub
    Else
    With Sheet2
         ....
        Range("E15").Offset(k + 3, 0).Value = "=tvnd(R[-2]C[5])"
        .....
    End With
    End If
Em cám ơn bác rất nhiều ah, em làm được rồi.
Qua đây hy vọng bác giúp đỡ em bẫy chỗ form tìm kiếm này với :
- Khi nhấn đúp vào ô K2 (sheet DCCN tìm kiếm DMKH). Hiện form tự động tích vào dòng tiêu đề + 1 mã khách hàng.
+ Em muốn tắt tích chọn tự động này (lúc hiện lên).
+ Khi tích chọn khách hàng mới, tích trước tự bỏ dấu tích cũ (chỉ được chọn 1).
Em làm gì lỡ, mong các bác bỏ qua dùm, em mới tập tành (sưu tầm code về tự nghiên cứu, còn ngu muội lắm ah)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Qua đây hy vọng bác giúp đỡ em bẫy chỗ form tìm kiếm này với :
- Khi nhấn đúp vào ô K2 (sheet DCCN tìm kiếm DMKH). Hiện form tự động tích vào dòng tiêu đề + 1 mã khách hàng.
+ Em muốn tắt tích chọn tự động này (lúc hiện lên).
Bạn đọc bài #1418 của tôi bạn không hiểu gì à? Vì trong bài đó tôi giải thích tại sao có "tự động tích vào dòng tiêu đề + 1 mã khách hàng". Và tôi đề nghị cách khắc phục. Tôi chỉ nhầm khi viết MultiSelect = True. Phải là False.

Nhắc lại. Để khắc phục tôi đã đề nghị:
1. Click ListBox để chọn -> trong cửa sổ Properties thiết lập MultiSelect = fmMultiSelectSingle. Xem hình.

1.jpg

2. Trong cửa sổ trong hình ở điểm 1 thiết lập ListStyle = fmListStylePlain

3. Do tôi không hiểu ý tưởng đúp chuột trong ô K2 nên tôi đề nghị dùng Button để hiện thị UserForm: trên ribbon chọn thẻ Developer -> nút Insert -> chọn Button

2.jpg

-> nhấn chuột trên sheet và kéo sang chỗ khác rồi nhả chuột để vẽ 1 hình chữ nhật nhỏ -> trong cửa sổ "Assign Macro" vừa nhẩy ra nhấn nút New -> sửa code vừa có thành
Mã:
Sub Button1_Click()
    frm_DMKH.Show
End Sub

4. Xóa code cũ: trong cửa sổ Project - VBAProject đúp chuột vào Sheet6 (DCCN) -> ở phần bên phải xóa hết từ Private Sub Worksheet_BeforeDoubleClick ... tới End Sub

Tôi hướng dẫn để tương lai bạn biết cách làm. Trong tập tin tôi đã làm cho bạn.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn đọc bài #1418 của tôi bạn không hiểu gì à? Vì trong bài đó tôi giải thích tại sao có "tự động tích vào dòng tiêu đề + 1 mã khách hàng". Và tôi đề nghị cách khắc phục. Tôi chỉ nhầm khi viết MultiSelect = True. Phải là False.

Nhắc lại. Để khắc phục tôi đã đề nghị:
1. Click ListBox để chọn -> trong cửa sổ Properties thiết lập MultiSelect = fmMultiSelectSingle. Xem hình.

View attachment 245900

2. Trong cửa sổ trong hình ở điểm 1 thiết lập ListStyle = fmListStylePlain

3. Do tôi không hiểu ý tưởng đúp chuột trong ô K2 nên tôi đề nghị dùng Button để hiện thị UserForm: trên ribbon chọn thẻ Developer -> nút Insert -> chọn Button

View attachment 245901

-> nhấn chuột trên sheet và kéo sang chỗ khác rồi nhả chuột để vẽ 1 hình chữ nhật nhỏ -> trong cửa sổ "Assign Macro" vừa nhẩy ra nhấn nút New -> sửa code vừa có thành
Mã:
Sub Button1_Click()
    frm_DMKH.Show
End Sub

4. Xóa code cũ: trong cửa sổ Project - VBAProject đúp chuột vào Sheet6 (DCCN) -> ở phần bên phải xóa hết từ Private Sub Worksheet_BeforeDoubleClick ... tới End Sub

Tôi hướng dẫn để tương lai bạn biết cách làm. Trong tập tin tôi đã làm cho bạn.
Em cám ơn bác rất nhiều nha!
Em nghiên cứu kết hợp chọn thành 1 cái form luôn
- Từ ngày ... đến ngày ...
- Mã khách hàng ... Tạo báo cáo
Có chỗ nào không hiểu mong bác chỉ giúp ah.
 
Upvote 0
Chào mọi người. Ví dụ em có chuỗi giá trị từ 0 đến 9; nếu em gõ giá trị 1 và 9 vào 2 ô A1, B1, thì em muốn các ô còn lại sẽ tự động hiện lần lượt theo thứ tự từ bé đến lớn các giá trị còn lại trong tập số {0,9} nghĩa là sẽ hiển thị: 0 2 3 4 5 6 7 8 ở các ô còn lại. mọi người giúp em với ạ!
 
Upvote 0
Chào mọi người. Ví dụ em có chuỗi giá trị từ 0 đến 9; nếu em gõ giá trị 1 và 9 vào 2 ô A1, B1, thì em muốn các ô còn lại sẽ tự động hiện lần lượt theo thứ tự từ bé đến lớn các giá trị còn lại trong tập số {0,9} nghĩa là sẽ hiển thị: 0 2 3 4 5 6 7 8 ở các ô còn lại. mọi người giúp em với ạ!
Dùng 1 vòng lặp từ 0 đến 9 và 1 cái if nếu đã có trong A1, B1 thì bỏ qua, ngược lại thì bỏ vào "các ô còn lại"
 
Upvote 0
Cho em hỏi đưa 2 hoặc nhiều range vào 1 mảng để dùng vòng lặp cùng lúc thì làm như thế nào ạ?
Ví dụ đưa arr = range("A1:A10").value, rồi đưa tiếp arr = range("B1:B10").value nối tiếp phần trước thì làm như nào ạ?
Em cảm ơn!
 
Upvote 0
Cho em hỏi đưa 2 hoặc nhiều range vào 1 mảng để dùng vòng lặp cùng lúc thì làm như thế nào ạ?
Ví dụ đưa arr = range("A1:A10").value, rồi đưa tiếp arr = range("B1:B10").value nối tiếp phần trước thì làm như nào ạ?
Em cảm ơn!
Mỗi range 1 vòng lặp từ 1 đến dòng cuối mỗi range, mảng kết quả chỉ cần 1 mảng
 
Upvote 0
Chào các thầy cô ạ.
Cho em hỏi chút, Chẳng hạn khi chạy code xong. em có 1 mảng 2 chiều:
Res( 1 to 10, 1 to 5)
Nếu em muốn sort ngay trên mảng theo tiêu chí cột Res(1,1) từ A tới Z thì có cách nào không ạ?
Mong thầy cô giúp đỡ.
Em xin cám ơn nhiều ạ
 
Upvote 0
Chào các thầy cô ạ.
Cho em hỏi chút, Chẳng hạn khi chạy code xong. em có 1 mảng 2 chiều:
Res( 1 to 10, 1 to 5)
Nếu em muốn sort ngay trên mảng theo tiêu chí cột Res(1,1) từ A tới Z thì có cách nào không ạ?
Mong thầy cô giúp đỡ.
Em xin cám ơn nhiều ạ
Tôi thấy việc dùng VBA chép mảng lên sheet, sort rồi đưa lại vào mảng cũng là giải pháp tốt mà.
 
Upvote 0
Tôi thấy việc dùng VBA chép mảng lên sheet, sort rồi đưa lại vào mảng cũng là giải pháp tốt mà.
Em cũng làm như vậy. Nhưng không hiểu sao. Cứ mỗi lần sort. Nó bị treo excell luôn. Cảm giác rất là đơ máy ạ. Nên mới nghĩ sort ngay trên mảng kết quả ạ
 
Upvote 0
Chào các thầy cô ạ.
Cho em hỏi chút, Chẳng hạn khi chạy code xong. em có 1 mảng 2 chiều:
Res( 1 to 10, 1 to 5)
Nếu em muốn sort ngay trên mảng theo tiêu chí cột Res(1,1) từ A tới Z thì có cách nào không ạ?
Mong thầy cô giúp đỡ.
Em xin cám ơn nhiều ạ
Có cách tìm kiếm thuật toán sort mảng, ngay GPE cũng nhiều, các từ khóa tìm sau sẽ có kết quả:
Quick sort, Bubble sort
array list sort
 
Upvote 0
Nếu cho vòng lặp chạy vậy thì nó chậm ko ạ? còn cách nào khác ko chú ?
Mỗi dòng dữ liệu dù ở range nào cũng bắt buộc duyệt qua 1 lần, thì thuật toán bắt buộc phải nhiều vòng lặp như thế. Còn thủ thuật thì dùng mảng nhanh hơn dùng Cell và Range
 
Upvote 0
Mỗi dòng dữ liệu dù ở range nào cũng bắt buộc duyệt qua 1 lần, thì thuật toán bắt buộc phải nhiều vòng lặp như thế. Còn thủ thuật thì dùng mảng nhanh hơn dùng Cell và Range
Con vẫn chưa hiểu chú ơi, con lấy ví dụ ở đây, chú giúp con viết một code đưa dữ liệu ở cột A và cột B vào mảng arr giúp con, mục đích là để chọn chạy vòng lặp trong mảng để lấy ra giá trị ko trùng dán vào cột I.

1618717095111.png

Ở đây con ví dụ phần dữ liệu này ở một sheet chứ thật ra bài toán thực tế nó nằm ở nhiều sheet khác nhau, và nhiều cột hơn thế.
Chú viết giúp con một cái code cho con dễ hình dung nhé! Cám ơn chú!
 
Upvote 0
Em chào các thầy cô ạ.
Em muốn dùng cách nạp và dán mảng xuống bảng tính để đưa tất cả dữ liệu vùng Filter A1:A22 (bao gồm cả các ô đang bị lọc và các ô hiển thị theo điều kiện lọc) sang cột B (mục đích là copy toàn bộ dữ liệu cột A sang cột B nhưng vẫn để ở chế độ lọc ấy ạ)
Nhưng kết quả lại ra tùm lum
Em gửi file đính kèm Mong thầy cô giúp đỡ.
Em xin cám ơn nhiều ạ
 

File đính kèm

Upvote 0
Em chào các thầy cô ạ.
Em muốn dùng cách nạp và dán mảng xuống bảng tính để đưa tất cả dữ liệu vùng Filter A1:A22 (bao gồm cả các ô đang bị lọc và các ô hiển thị theo điều kiện lọc) sang cột B (mục đích là copy toàn bộ dữ liệu cột A sang cột B nhưng vẫn để ở chế độ lọc ấy ạ)
Nhưng kết quả lại ra tùm lum
Em gửi file đính kèm Mong thầy cô giúp đỡ.
Em xin cám ơn nhiều ạ
Nạp từng ô
Mã:
Sub RoundedRectangle1_Click()
Dim arr(), i&, lr1&
 
With ActiveSheet
  lr1 = Val(Split(ActiveSheet.AutoFilter.Range.Address, "$")(4)) 'tim dong cuoi cua vung dang loc
  arr = .Range("A2:A" & lr1).Value ' gan gia tri vung A vao mang arr()
  For i = 1 To UBound(arr) ' nap mang arr xuong vung cot B
    .Range("B" & i + 1).Value = arr(i, 1)
  Next i
End With
End Sub
 
Upvote 0
Nạp từng ô
Mã:
Sub RoundedRectangle1_Click()
Dim arr(), i&, lr1&
 
With ActiveSheet
  lr1 = Val(Split(ActiveSheet.AutoFilter.Range.Address, "$")(4)) 'tim dong cuoi cua vung dang loc
  arr = .Range("A2:A" & lr1).Value ' gan gia tri vung A vao mang arr()
  For i = 1 To UBound(arr) ' nap mang arr xuong vung cot B
    .Range("B" & i + 1).Value = arr(i, 1)
  Next i
End With
End Sub
Dạ code ra đúng ý em rồi ạ. Tuyệt vời ạ. 10 năm đèn sách không bằng 1 lần gặp đúng thầy, Cách nạp từng ô nhanh hơn hẳn.
Hôm qua em không làm được là định loay hoay chuyển hướng đi đường dài xa xôi, em định lưu điều kiện lọc hiện tại vào 1 biến, rồi tắt lọc, dán vào cột B, rồi lại lọc trở lại theo biến đã lưu (nếu làm vậy quá là cực khổ ạ).
 
Upvote 0
Em chào các thầy cô ạ.
Em muốn dùng cách nạp và dán mảng xuống bảng tính để đưa tất cả dữ liệu vùng Filter A1:A22 (bao gồm cả các ô đang bị lọc và các ô hiển thị theo điều kiện lọc) sang cột B (mục đích là copy toàn bộ dữ liệu cột A sang cột B nhưng vẫn để ở chế độ lọc ấy ạ)
Nhưng kết quả lại ra tùm lum
Em gửi file đính kèm Mong thầy cô giúp đỡ.
Em xin cám ơn nhiều ạ
office 365 có hàm này
=FILTER($A$2:$A$400,A2:A400>5,"")
 
Upvote 0
Xin chào mọi người. mình mới tham gia diễn đàn và đang mày mò tự học VBA. Hiện mình đang có mấy vướng mắc nhờ những người có kinh nghiệm chỉ giúp
Hiện tại do phải xử lý số liệu nên mình set dữ liệu từ các cột ở Excel vào mảng ( 1 cột sẽ là 1 mảng 1 chiều) , tuy nhiên mình không biết ở thuộc tính mảng có thực hiện được các hàm SUM, SUMIF, Countif..... như bình thường đối với cột , hàng ở excel không ạ?
Nếu được xin cho vi dụ mình họa
Xin cảm ơn!
 
Upvote 0
Xin chào mọi người. mình mới tham gia diễn đàn và đang mày mò tự học VBA. Hiện mình đang có mấy vướng mắc nhờ những người có kinh nghiệm chỉ giúp
Hiện tại do phải xử lý số liệu nên mình set dữ liệu từ các cột ở Excel vào mảng ( 1 cột sẽ là 1 mảng 1 chiều) , tuy nhiên mình không biết ở thuộc tính mảng có thực hiện được các hàm SUM, SUMIF, Countif..... như bình thường đối với cột , hàng ở excel không ạ?
Nếu được xin cho vi dụ mình họa
Xin cảm ơn!
1 cột đưa vào mảng không phải là mảng 1 chiều mà là mảng 2 chiều nhưng có 1 cột, biểu thị là arr(x, 1). Mảng 1 chiều chỉ biểu thị bằng 1 tham số arr(x)

Những hàm Excel không có hiệu lực gì trong mảng cả.
 
Upvote 0
Xin chào mọi người. mình mới tham gia diễn đàn và đang mày mò tự học VBA. Hiện mình đang có mấy vướng mắc nhờ những người có kinh nghiệm chỉ giúp
Hiện tại do phải xử lý số liệu nên mình set dữ liệu từ các cột ở Excel vào mảng ( 1 cột sẽ là 1 mảng 1 chiều) , tuy nhiên mình không biết ở thuộc tính mảng có thực hiện được các hàm SUM, SUMIF, Countif..... như bình thường đối với cột , hàng ở excel không ạ?
Nếu được xin cho vi dụ mình họa
Xin cảm ơn!
Hàm khác thì chưa thử, hàm SUM() có vẻ là được.
Nhập số bất kỳ tại A1:A3 của sheet1 rồi chạy thử sub dưới đây
Mã:
Option Explicit

Sub test()
Dim Mang
Dim Kq
Mang = Sheet1.Range("A1:A3")
Kq = WorksheetFunction.Sum(Mang)
MsgBox Kq
End Sub
 
Upvote 0
Hàm khác thì chưa thử, hàm SUM() có vẻ là được.
Nhập số bất kỳ tại A1:A3 của sheet1 rồi chạy thử sub dưới đây
Mã:
Option Explicit

Sub test()
Dim Mang
Dim Kq
Mang = Sheet1.Range("A1:A3")
Kq = WorksheetFunction.Sum(Mang)
MsgBox Kq
End Sub
Cái này thì đơn giản và nhanh, tuy nhiên cẩn thận với dữ liệu số nhưng định dạng ở dạng chuỗi, nó sẽ không cộng vào đâu. Trước đó 15 năm về trước mình bị thằng đồng nghiệp chơi khăm, nó đặt dấu nháy trước số và định dạng nó về bên phải y chang như các số khác, thế là trong bản báo cáo của mình sếp kiểm tra lại mình bị sếp quở, sau này thì mình rất kỹ việc này, tự tạo hàm SUM VBA cho chắc ăn, dù cho số nó ở dạng gì.
 
Upvote 0
Cái này thì đơn giản và nhanh, tuy nhiên cẩn thận với dữ liệu số nhưng định dạng ở dạng chuỗi, nó sẽ không cộng vào đâu. Trước đó 15 năm về trước mình bị thằng đồng nghiệp chơi khăm, nó đặt dấu nháy trước số và định dạng nó về bên phải y chang như các số khác, thế là trong bản báo cáo của mình sếp kiểm tra lại mình bị sếp quở, sau này thì mình rất kỹ việc này, tự tạo hàm SUM VBA cho chắc ăn, dù cho số nó ở dạng gì.
Hướng dẫn giúp mình các gọi các model
SUB ten_ham()
Trong cá ngoăng cụ thể khai bao như thế nào để nó hiểu là biến truyền thông tin và biến nhận giá trị. XIn cảm ơn!
 
Upvote 0
Hướng dẫn giúp mình các gọi các model
SUB ten_ham()
Trong cá ngoăng cụ thể khai bao như thế nào để nó hiểu là biến truyền thông tin và biến nhận giá trị. XIn cảm ơn!
Bạn đang hỏi tôi về chủ đề nào vậy? Bạn phải trích bài đó vào đây, chứ hỏi như thế tôi biết đường đâu mà trả lời?
 
Upvote 1
Upvote 0
em mới học và mới đọc qua các bài đầu ở bài viết chủ đề về mảng này
các ACE và các thầy cho em hỏi em làm 1 đoạn này sai chỗ nào với
Mã:
Sub tinh()
    Dim gan, lrow2, lrow
    Dim i, j, k, dem As Integer
    Dim Arr, arr1
    lrow = Range("C" & Rows.Count).End(xlUp).Row
    
    ReDim lrow2(1 To lrow - 5, 1)
    lrow2 = Range("C6:D" & lrow)
    
    ReDim Arr(1 To UBound(lrow2), 1)
    ReDim gan(1 To UBound(lrow2), 1)
    ReDim arr1(1 To UBound(lrow2), 1)
    
    For i = 1 To UBound(lrow2)
        Arr(i, 1) = -1
    Next
    
    For i = 1 To UBound(lrow2)
        dem = 1
        For j = i + 1 To UBound(lrow2)
        
            If lrow2(j, 1) = lrow2(i, 1) Then
                dem = dem + 1
                Arr(j, 1) = 0
            End If
            
        Next
        
        If Arr(i, 1) <> 0 Then
            k = k + 1
            Arr(i, 1) = dem
            arr1(k, 1) = Arr(i, 1)
            gan(k, 1) = lrow2(i, 1)
        End If
    
    Next
    
        Range("M6:N" & lrow) = arr1
        Range("O6:P" & lrow) = gan
End Sub

hai range kết quả của em nó ko vào đúng ý của e
Range("M6:N" & lrow) = arr1 #kết quả lại hiện ở cột N
Range("O6:P" & lrow) = gan #kết quả lại hiện ở cột P
 
Lần chỉnh sửa cuối:
Upvote 0
em mới học và mới đọc qua các bài đầu ở bài viết chủ đề về mảng này
các ACE và các thầy cho em hỏi em làm 1 đoạn này sai chỗ nào với
Mã:
Sub tinh()
    Dim gan, lrow2, lrow
    Dim i, j, k, dem As Integer
    Dim Arr, arr1
    lrow = Range("C" & Rows.Count).End(xlUp).Row
    
    ReDim lrow2(1 To lrow - 5, 1)
    lrow2 = Range("C6:D" & lrow)
    
    ReDim Arr(1 To UBound(lrow2), 1)
    ReDim gan(1 To UBound(lrow2), 1)
    ReDim arr1(1 To UBound(lrow2), 1)
    
    For i = 1 To UBound(lrow2)
        Arr(i, 1) = -1
    Next
    
    For i = 1 To UBound(lrow2)
        dem = 1
        For j = i + 1 To UBound(lrow2)
        
            If lrow2(j, 1) = lrow2(i, 1) Then
                dem = dem + 1
                Arr(j, 1) = 0
            End If
            
        Next
        
        If Arr(i, 1) <> 0 Then
            k = k + 1
            Arr(i, 1) = dem
            arr1(k, 1) = Arr(i, 1)
            gan(k, 1) = lrow2(i, 1)
        End If
    
    Next
    
        Range("M6:N" & lrow) = arr1
        Range("O6:P" & lrow) = gan
End Sub

hai range kết quả của em nó ko vào đúng ý của e
Range("M6:N" & lrow) = arr1 #kết quả lại hiện ở cột N
Range("O6:P" & lrow) = gan #kết quả lại hiện ở cột P
Bạn phải khai báo ReDim Arr(1 To UBound(lrow2), 1 to 1)
Lưu ý 1 to 1 chứ không phải là 1
Số 1 đó được hiểu là 0 to 1 và theo đó số cột là 2 chứ không phải 1. Do vậy các kết quả ghi vào Arr(x, 1) sẽ nằm ở cột 2.
 
Upvote 1
Tôi nghĩ chỗ này nó cũng có vấn đề đó:
Mã:
    For i = 1 To UBound(lrow2)
        dem = 1
        For j = i + 1 To UBound(lrow2)
Tuy nó không lỗi nhưng vòng lặp cuối cùng dường như nó sẽ lặp không phải là con số UBound(lrow2)+1 mà chỉ lặp lại UBound(lrow2).
 
Upvote 1
Tôi nghĩ chỗ này nó cũng có vấn đề đó:
Mã:
    For i = 1 To UBound(lrow2)
        dem = 1
        For j = i + 1 To UBound(lrow2)
Tuy nó không lỗi nhưng vòng lặp cuối cùng dường như nó sẽ lặp không phải là con số UBound(lrow2)+1 mà chỉ lặp lại UBound(lrow2).
thầy có thể giải thích rõ giúp e ko,
nếu để tối đa i<ubound(lrow2), Max của i = Ubound(lrow2)-1
thì chắc đc đúng k thầy
 
Upvote 0
thầy có thể giải thích rõ giúp e ko,
nếu để tối đa i<ubound(lrow2), Max của i = Ubound(lrow2)-1
thì chắc đc đúng k thầy
Cái này đơn giản mà, i max có phải bằng ubound(lrow2) không? Mà j = i + 1, vậy thì lúc i max có nghĩa là j = ubound(lrow2) +1, trong khi j max cũng lại bằng ubound(lrow2) cho nên nó sẽ lặp lại 2 lần chỗ này thôi, không vượt qua được ubound(lrow2) +1
Bài đã được tự động gộp:

thầy có thể giải thích rõ giúp e ko,
nếu để tối đa i<ubound(lrow2), Max của i = Ubound(lrow2)-1
thì chắc đc đúng k thầy
Thử cái này là biết liền:
Mã:
Sub Macro1()
    Dim i As Byte, j As Byte, k As Byte
    k = 3
    For i = 1 To k
        For j = i + 1 To k
            MsgBox j
        Next
    Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cái này đơn giản mà, i max có phải bằng ubound(lrow2) không? Mà j = i + 1, vậy thì lúc i max có nghĩa là j = ubound(lrow2) +1, trong khi j max cũng lại bằng ubound(lrow2) cho nên nó sẽ lặp lại 2 lần chỗ này thôi, không vượt qua được ubound(lrow2) +1
- chắc do e đặt thêm điều kiện arr, cho nên biến cuối cùng khi so sánh lần 2 đáng ra phải tăng biến đếm nhưng của e chưa thấy tăng biến đếm
 
Upvote 0
- chắc do e đặt thêm điều kiện arr, cho nên biến cuối cùng khi so sánh lần 2 đáng ra phải tăng biến đếm nhưng của e chưa thấy tăng biến đếm
Mã:
Sub Macro1()
    Dim i As Byte, j As Byte, k As Byte
    k = 3
    For i = 1 To k
        For j = i + 1 To k
            MsgBox j
        Next
    Next
End Sub

Qua phần thí nghiệm này bạn sẽ thấy j chạy bỏ qua số 1 và không đạt tới k +1. Theo bạn, bạn muốn j như thế nào?
 
Upvote 0
Mã:
Sub Macro1()
    Dim i As Byte, j As Byte, k As Byte
    k = 3
    For i = 1 To k
        For j = i + 1 To k
            MsgBox j
        Next
    Next
End Sub

Qua phần thí nghiệm này bạn sẽ thấy j chạy bỏ qua số 1 và không đạt tới k +1. Theo bạn, bạn muốn j như thế nào?
của e là đếm số lần xuất hiện phần tử trong mảng, do đó j của e chạy từ 2 đến hết, đoạn cuối là e cũng tính Arr(j, 1) = 0
mà ở ngoài vòng lặp i có điều kiện Arr(j, 1) <> 0 từ đó lọc bỏ qua trường hợp lỗi cuối cùng @@
 
Upvote 0
của e là đếm số lần xuất hiện phần tử trong mảng, do đó j của e chạy từ 2 đến hết, đoạn cuối là e cũng tính Arr(j, 1) = 0
mà ở ngoài vòng lặp i có điều kiện Arr(j, 1) <> 0 từ đó lọc bỏ qua trường hợp lỗi cuối cùng @@
Chúng ta lại thử thí nghiệm 2, không cần 2 vòng lặp, bạn thấy thế nào?

Mã:
Sub Macro2()
    Dim i As Byte, j As Byte, k As Byte
    k = 3
    For i = 1 To k
        j = i + 1
        MsgBox j
    Next
End Sub
 
Upvote 0
Chúng ta lại thử thí nghiệm 2, không cần 2 vòng lặp, bạn thấy thế nào?

Mã:
Sub Macro2()
    Dim i As Byte, j As Byte, k As Byte
    k = 3
    For i = 1 To k
        j = i + 1
        MsgBox j
    Next
End Sub
như thế e sẽ ko so sánh được với các phần tử còn lại, và k đếm được số lần xuất hiện của phần tử đấy trong mảng. e làm hơi thủ công chút @@
 
Upvote 0
như thế e sẽ ko so sánh được với các phần tử còn lại, và k đếm được số lần xuất hiện của phần tử đấy trong mảng. e làm hơi thủ công chút @@
Bạn đưa cái sub mà bạn đã hoàn thiện lên đây tôi xem có rút gọn được không? Thấy sơ sơ là đã loại bỏ được 1 vòng lặp rồi đấy.
 
Upvote 0
Bạn đưa cái sub mà bạn đã hoàn thiện lên đây tôi xem có rút gọn được không? Thấy sơ sơ là đã loại bỏ được 1 vòng lặp rồi đấy.
Mã:
Sub tinh()
    Dim gan, lrow2, lrow
    Dim i, j, k, dem As Integer
    Dim Arr, arr1
    lrow = Range("C" & Rows.Count).End(xlUp).Row
 
    ReDim lrow2(1 To lrow - 5, 1 To 3)
    lrow2 = Range("C6:E" & lrow)
 
    ReDim Arr(1 To UBound(lrow2), 1 To 1)
    ReDim gan(1 To UBound(lrow2), 1 To 1)
    ReDim arr1(1 To UBound(lrow2), 1 To 1)
 
    For i = 1 To UBound(lrow2)
        Arr(i, 1) = -1
    Next
 
    For i = 1 To UBound(lrow2)
        dem = 1
        For j = i + 1 To UBound(lrow2)
     
            If lrow2(j, 1) = lrow2(i, 1) Then
                dem = dem + 1
                Arr(j, 1) = 0
            End If
         
        Next
     
        If Arr(i, 1) <> 0 Then
            k = k + 1
            Arr(i, 1) = dem
            arr1(k, 1) = Arr(i, 1)
            gan(k, 1) = lrow2(i, 1)
        End If
 
    Next
 
        Range("M6:M" & lrow) = arr1
        Range("O6:O" & lrow) = gan
End Sub
Thầy xem giúp hộ e với
 
Upvote 0
Mã:
Sub tinh()
    Dim gan, lrow2, lrow
    Dim i, j, k, dem As Integer
    Dim Arr, arr1
    lrow = Range("C" & Rows.Count).End(xlUp).Row
 
    ReDim lrow2(1 To lrow - 5, 1 To 3)
    lrow2 = Range("C6:E" & lrow)
 
    ReDim Arr(1 To UBound(lrow2), 1 To 1)
    ReDim gan(1 To UBound(lrow2), 1 To 1)
    ReDim arr1(1 To UBound(lrow2), 1 To 1)
 
    For i = 1 To UBound(lrow2)
        Arr(i, 1) = -1
    Next
 
    For i = 1 To UBound(lrow2)
        dem = 1
        For j = i + 1 To UBound(lrow2)
    
            If lrow2(j, 1) = lrow2(i, 1) Then
                dem = dem + 1
                Arr(j, 1) = 0
            End If
        
        Next
    
        If Arr(i, 1) <> 0 Then
            k = k + 1
            Arr(i, 1) = dem
            arr1(k, 1) = Arr(i, 1)
            gan(k, 1) = lrow2(i, 1)
        End If
 
    Next
 
        Range("M6:M" & lrow) = arr1
        Range("O6:O" & lrow) = gan
End Sub
Thầy xem giúp hộ e với
Bạn làm gì với nó? Bạn vui lòng gửi file lên tôi xem được không? Nhưng trước mắt bạn cần phải đặt biến cho tường minh và đúng kiểu dữ liệu.
Đúng kiểu dữ liệu là thế này, trước tiên ta hãy nhìn bảng này:

1629431525279.png

Bạn đặt biến dem dạng Integer, mà max của biến này chỉ có hơn 32k thôi, trong khi Excel 2003 nó đã hơn 65k dòng rồi, nếu giả sử một ngày nào đó dữ liệu của bạn hơn 32k thì chắc chắn code sẽ báo lỗi, vì thế trong trường hợp này tôi tư vấn cho bạn nên đặt biến dạng Long.

Vả lại trừ là biến Variant thì không cần kiểu dữ liệu như Dim Arr, Arr1, nhưng kiểu Dim i, j, k, dem As Integer được hiểu i, j, k là biến thuộc kiểu Variant chỉ có dem được hiểu là Integer thôi, vì thế thôi nghĩ bạn bạn nên khai báo đại loại như vầy:

Dim Arr, Arr1, ArrGan, ArrRow
Dim i As Long, j As Long, k As Long, lngDem As Long, lngRow As Long

Nói nhiều vậy thôi, nhưng bạn gửi cho tôi cái file xem bạn làm gì và kết quả cần có là gì tôi sẽ rút gọn hoặc tăng tốc cho bạn.
 
Upvote 0
Mã:
Sub tinh()
    Dim gan, lrow2, lrow
    Dim i, j, k, dem As Integer
    Dim Arr, arr1
    lrow = Range("C" & Rows.Count).End(xlUp).Row
 
    ReDim lrow2(1 To lrow - 5, 1 To 3)
    lrow2 = Range("C6:E" & lrow)
 
    ReDim Arr(1 To UBound(lrow2), 1 To 1)
    ReDim gan(1 To UBound(lrow2), 1 To 1)
    ReDim arr1(1 To UBound(lrow2), 1 To 1)
 
    For i = 1 To UBound(lrow2)
        Arr(i, 1) = -1
    Next
 
    For i = 1 To UBound(lrow2)
        dem = 1
        For j = i + 1 To UBound(lrow2)
    
            If lrow2(j, 1) = lrow2(i, 1) Then
                dem = dem + 1
                Arr(j, 1) = 0
            End If
        
        Next
    
        If Arr(i, 1) <> 0 Then
            k = k + 1
            Arr(i, 1) = dem
            arr1(k, 1) = Arr(i, 1)
            gan(k, 1) = lrow2(i, 1)
        End If
 
    Next
 
        Range("M6:M" & lrow) = arr1
        Range("O6:O" & lrow) = gan
End Sub
Thầy xem giúp hộ e với
Bạn thử dùng thủ tục này xem có gì sai không? Nếu nó đúng phải chăng là đã bớt đi 1 vòng lặp rồi không?

Mã:
Sub Tinh_HTN()
    Dim Arr, Arr1, ArrGan, ArrRow
    Dim i As Long, j As Long, k As Long, lngDem  As Long, lngRow As Long
    lngRow = Range("C" & Rows.Count).End(xlUp).Row
    ReDim ArrRow(1 To lngRow - 5, 1 To 3)
    ArrRow = Range("C6:E" & lngRow)
 
    ReDim Arr(1 To UBound(ArrRow), 1 To 1)
    ReDim ArrGan(1 To UBound(ArrRow), 1 To 1)
    ReDim Arr1(1 To UBound(ArrRow), 1 To 1)
 
    For i = 1 To UBound(ArrRow)
        Arr(i, 1) = -1
    Next
 
    For i = 1 To UBound(ArrRow)
        j = i + 1
        lngDem = 1
        If ArrRow(j, 1) = ArrRow(i, 1) Then
            lngDem = lngDem + 1
            Arr(j, 1) = 0
        End If
    
        If Arr(i, 1) <> 0 Then
            k = k + 1
            Arr(i, 1) = lngDem
            Arr1(k, 1) = Arr(i, 1)
            ArrGan(k, 1) = ArrRow(i, 1)
        End If
 
    Next
 
        Range("M6:M" & lngRow) = Arr1
        Range("O6:O" & lngRow) = ArrGan
End Sub
 
Upvote 0
Mã:
Sub tinh()
    Dim gan, lrow2, lrow
    Dim i, j, k, dem As Integer
    Dim Arr, arr1
    lrow = Range("C" & Rows.Count).End(xlUp).Row
 
    ReDim lrow2(1 To lrow - 5, 1 To 3)
    lrow2 = Range("C6:E" & lrow)
 
    ReDim Arr(1 To UBound(lrow2), 1 To 1)
    ReDim gan(1 To UBound(lrow2), 1 To 1)
    ReDim arr1(1 To UBound(lrow2), 1 To 1)
 
    For i = 1 To UBound(lrow2)
        Arr(i, 1) = -1
    Next
 
    For i = 1 To UBound(lrow2)
        dem = 1
        For j = i + 1 To UBound(lrow2)
   
            If lrow2(j, 1) = lrow2(i, 1) Then
                dem = dem + 1
                Arr(j, 1) = 0
            End If
       
        Next
   
        If Arr(i, 1) <> 0 Then
            k = k + 1
            Arr(i, 1) = dem
            arr1(k, 1) = Arr(i, 1)
            gan(k, 1) = lrow2(i, 1)
        End If
 
    Next
 
        Range("M6:M" & lrow) = arr1
        Range("O6:O" & lrow) = gan
End Sub
Thầy xem giúp hộ e với
Bài nầy dùng 2 vòng For lồng nhau, nếu dùng Dic chỉ cần 1 vòng for
Mã:
Sub tinh()
  Dim sArr(), res(), res2()
  Dim eRow&, sRow&, i&, k&, tmp
  Const LoaiTru$ = "1a!2b@"
 
  eRow = Range("C" & Rows.Count).End(xlUp).Row
  sArr = Range("C6:C" & eRow).Value
  sRow = UBound(sArr)
  ReDim res(1 To sRow, 1 To 1)
  ReDim res2(1 To sRow, 1 To 1)
  For i = 1 To sRow
    tmp = sArr(i, 1)
    If tmp <> LoaiTru Then
      k = k + 1
      res(k, 1) = 1
      res2(k, 1) = tmp
      For r = i + 1 To sRow
        If sArr(r, 1) = tmp Then
          res(k, 1) = res(k, 1) + 1
          sArr(r, 1) = LoaiTru
        End If
      Next r
    End If
  Next i
  Range("M6:M" & eRow) = res
  Range("O6:O" & eRow) = res2
End Sub
Mã:
Sub tinh2()
  Dim sArr(), res(), res2(), dic As Object
  Dim eRow&, sRow&, i&, k&
 
  Set dic = CreateObject("scripting.dictionary")
  eRow = Range("C" & Rows.Count).End(xlUp).Row
  sArr = Range("C6:C" & eRow).Value
  sRow = UBound(sArr)
  ReDim res(1 To sRow, 1 To 1)
  ReDim res2(1 To sRow, 1 To 1)
  For i = 1 To sRow
    If dic.exists(sArr(i, 1)) = False Then
      k = k + 1
      res2(k, 1) = sArr(i, 1)
      dic.Add sArr(i, 1), k
    End If
    ik = dic.Item(sArr(i, 1))
    res(ik, 1) = res(ik, 1) + 1
  Next i
  Range("M6:M" & eRow) = res
  Range("O6:O" & eRow) = res2
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn đưa cái sub mà bạn đã hoàn thiện lên đây tôi xem có rút gọn được không? Thấy sơ sơ là đã loại bỏ được 1 vòng lặp rồi đấy.

Bài nầy dùng 2 vòng For lồng nhau, nếu dùng Dic chỉ cần 1 vòng for
Mã:
Sub tinh()
  Dim sArr(), res(), res2()
  Dim eRow&, sRow&, i&, k&, tmp
  Const LoaiTru$ = "1a!2b@"
 
  eRow = Range("C" & Rows.Count).End(xlUp).Row
  sArr = Range("C6:C" & eRow).Value
  sRow = UBound(sArr)
  ReDim res(1 To sRow, 1 To 1)
  ReDim res2(1 To sRow, 1 To 1)
  For i = 1 To sRow
    tmp = sArr(i, 1)
    If tmp <> LoaiTru Then
      k = k + 1
      res(k, 1) = 1
      res2(k, 1) = tmp
      For r = i + 1 To sRow
        If sArr(r, 1) = tmp Then
          res(k, 1) = res(k, 1) + 1
          sArr(r, 1) = LoaiTru
        End If
      Next r
    End If
  Next i
  Range("M6:M" & eRow) = res
  Range("O6:O" & eRow) = res2
End Sub
Mã:
Sub tinh2()
  Dim sArr(), res(), res2(), dic As Object
  Dim eRow&, sRow&, i&, k&
 
  Set dic = CreateObject("scripting.dictionary")
  eRow = Range("C" & Rows.Count).End(xlUp).Row
  sArr = Range("C6:C" & eRow).Value
  sRow = UBound(sArr)
  ReDim res(1 To sRow, 1 To 1)
  ReDim res2(1 To sRow, 1 To 1)
  For i = 1 To sRow
    If dic.exists(sArr(i, 1)) = False Then
      k = k + 1
      res2(k, 1) = sArr(i, 1)
      dic.Add sArr(i, 1), k
    End If
    ik = dic.Item(sArr(i, 1))
    res(ik, 1) = res(ik, 1) + 1
  Next i
  Range("M6:M" & eRow) = res
  Range("O6:O" & eRow) = res2
End Sub
em mới học nên đang đến phần mảng chưa rõ về Dic cho lắm
Bài đã được tự động gộp:

Bạn thử dùng thủ tục này xem có gì sai không? Nếu nó đúng phải chăng là đã bớt đi 1 vòng lặp rồi không?

Mã:
Sub Tinh_HTN()
    Dim Arr, Arr1, ArrGan, ArrRow
    Dim i As Long, j As Long, k As Long, lngDem  As Long, lngRow As Long
    lngRow = Range("C" & Rows.Count).End(xlUp).Row
    ReDim ArrRow(1 To lngRow - 5, 1 To 3)
    ArrRow = Range("C6:E" & lngRow)
 
    ReDim Arr(1 To UBound(ArrRow), 1 To 1)
    ReDim ArrGan(1 To UBound(ArrRow), 1 To 1)
    ReDim Arr1(1 To UBound(ArrRow), 1 To 1)
 
    For i = 1 To UBound(ArrRow)
        Arr(i, 1) = -1
    Next
 
    For i = 1 To UBound(ArrRow)
        j = i + 1
        lngDem = 1
        If ArrRow(j, 1) = ArrRow(i, 1) Then
            lngDem = lngDem + 1
            Arr(j, 1) = 0
        End If
  
        If Arr(i, 1) <> 0 Then
            k = k + 1
            Arr(i, 1) = lngDem
            Arr1(k, 1) = Arr(i, 1)
            ArrGan(k, 1) = ArrRow(i, 1)
        End If
 
    Next
 
        Range("M6:M" & lngRow) = Arr1
        Range("O6:O" & lngRow) = ArrGan
End Sub
của em là so sánh số lần xuất hiện trong mảng, hôm nay em mới về nhà, mới gửi đc file của em các Thầy giúp em thêm phần lấy phần dữ liệu trong cùng mảng đấy với. em cám ơn
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
em mới học nên đang đến phần mảng chưa rõ về Dic cho lắm
Bài đã được tự động gộp:


của em là so sánh số lần xuất hiện trong mảng, hôm nay em mới về nhà, mới gửi đc file của em các Thầy giúp em thêm phần lấy phần dữ liệu trong cùng mảng đấy với. em cám ơn
tôi đã tự làm xong ý tưởng cám ơn các thầy và mọi người vì những bài ở trên diễn đàn có rất nhiều VD hữu ích khi học code
 
Upvote 0
Chào mọi người.

Em khai báo mảng ban đầu như sau arr ( 1 to 10000, 1 to 100)
các giá trị từ 1 đến 1000 & từ 1 đến 100 được gán bởi nhiều tham số :x,y,z, a,b,c .v... x= a +b, y=c ,v.v.v.. do áp dụng dictionary nên các tham số ngang dọc này nhảy nhót không theo lần lượt như vòng lặp 1,2,3... , khi thỏa mãn điều kiện thì sẽ trả về giá trị.

vấn đề là khi kết thúc vòng lặp em mới thấy được giá trị của mảng arr(1289,28)= 2000
Vậy làm thế nào để em có thể debug dừng lại tại đúng chỉ số mảng arr(1289,28) ? để xác định nguyên nhân?
 
Upvote 0
dừng lại tại đúng chỉ số mảng arr(1289,28)
Lập trình thì khi hỏi cứ bê cái khúc cốt đó lên đây. Hỏi suông thì chỉ nhận được câu trả lời văn xuôi, rồi lại mò tới khi nào mới xong việc.

For i = 1289 to 1289
For j = 28 to 28
'
Next j
Next i

Hoặc
If i = 1289 and j = 28 then msgbox nó.
 
Upvote 0
Lập trình thì khi hỏi cứ bê cái khúc cốt đó lên đây. Hỏi suông thì chỉ nhận được câu trả lời văn xuôi, rồi lại mò tới khi nào mới xong việc.

For i = 1289 to 1289
For j = 28 to 28
'
Next j
Next i

Hoặc
If i = 1289 and j = 28 then msgbox nó.
em làm kiểu như thế này, nhưg em đã dò ra rồi , tìm mãi for j em không biết lồng kiểu gì :
Mã:
For i = 1 to 10000
....
a=dic.item(data(i, 3))
b = data(i, 7)
c = dic.item(b)
d = data(i, 18)
e = dic.item(d)
....
arr(a + 9, e) = arr(a + 9, e) - arr(a +5, c)
...
Next i
 
Lần chỉnh sửa cuối:
Upvote 0
Mọi người cho mình hỏi về đoạn code như mình tóm tắt nội dung ở dưới.
Nội dung mình cần hỏi: "Đề xuất Giải pháp tốc độ nhanh nhất hiển thị ra kết quả".
Hoặc thay đổi nội dung code hoặc kết hợp với cái gì ý ạ. Nếu là có API thì cho mình xin tên Hàm. Hoặc có Class thì cho mình xin gợi ý cách viết ạ.
Chứ 2 cái món này mình mòm mẫm mãi vẫn chưa hiểu về nó.
Xin cảm ơn mọi người!
'======================================================
Mã:
Dim iArr(), ResI As String
Dim kArr(), ResK As String
Dim iRow As Long, iCol As Long
Dim iR As Long, iC As Long, i As Long
Dim kR As Long, kC As Long, k As Long
Dim ik As Integer, kk As Long
Dim iCount As Integer, iDem As Integer
Dim tArr(), ResT As String

'For iR = 1 To iRow - 1
''    For iC = 1 To iCol 'Max 9
        ResT = tArr(iR, iC)     'Giá trị dựa theo iR là chính, iC có thể xử lý riêng.    '
''    Next iC
'Next iR
'///////////Mảng iArr được đổ trực tiếp từ Excel hoặc SQL.
For iR = 1 To iRow              'Thay đổi từ      3-20.000
    For iC = 1 To iCol          'Thay đổi từ     1-110   
        ResI = iArr(iR, iC)
            For kR = 1 To k     'Thay đổi từ   1-110
                'Xử lý theo Điều kiện để ra ResKr
                ResKr = Mid(ResI, kR, ik)       'iK Thay đổi từ 1-10
                For kC = 1 To k
                    'Xử lý theo Điều kiện để ra ResKc
                    ResKc = Mid(ResI, kC, ik)                 
                    If kR <> kC Then
                        ResK = ResKr & ResKc 'Xử lý Kết hợp để ra ResK từ ResKr và ResKc
                        If ResT = ResK Then
                            iCount = iCount + 1
                        Else
                            iCount = iCount
                        End If
                        If iCount >= iDem Then      'Thay đổi từ 1-2000
                            If ir <=irow-1 then                         
                                kk = kk + 1
                                kArr(iR, kk) =iCount    ''KẾT QUẢ CẦN HIỂN THỊ gán tạm cho dễ hiểu
                            Else
                                kArr(iR, kk) = ResK        ''KẾT QUẢ CẦN HIỂN THỊ gán tạm cho dễ hiểu
                            End if                             
                        Else
                            Exit For                     '' Next kC
                        End If
                    Else
                        Exit For                        '' Next kR Hoặc Được xử lý riêng BỎ ĐIỀU KIỆN KR <>KC . Tuỳ theo  'KẾT QUẢ CẦN HIỂN THỊ NHỮNG GÌ
                    End If
                Next kC
            Next kR
    Next iC
Next iR
 
Upvote 0
Xin hỗ trợ cách copy dữ liệu có điều kiện từ 1 mảng sang 1 mảng khác trong VBA
Tôi dùng VBA trong excel và cần xử lý copy dữ liệu từ 1 mảng 2 chiều (ví dụ dữ liệu quá trình công tác của các nhân sự) với 1 điều kiện (ví dụ quá trình công tác của 1 nhân sự cóa mã nhân sự là NS0001) sang 1 mảng khác. Tôi không muốn dùng vòng lặp kiểm tra (ví dụ như For … Next) vì sẽ mất nhiều thời gian. ACE có cách nào nỗ trợ mình nhé.
Thanks các bác
 
Upvote 0
Xin hỗ trợ cách copy dữ liệu có điều kiện từ 1 mảng sang 1 mảng khác trong VBA
Tôi dùng VBA trong excel và cần xử lý copy dữ liệu từ 1 mảng 2 chiều (ví dụ dữ liệu quá trình công tác của các nhân sự) với 1 điều kiện (ví dụ quá trình công tác của 1 nhân sự cóa mã nhân sự là NS0001) sang 1 mảng khác. Tôi không muốn dùng vòng lặp kiểm tra (ví dụ như For … Next) vì sẽ mất nhiều thời gian. ACE có cách nào nỗ trợ mình nhé.
Thanks các bác
Làm nhân sự mà chính tả thế này thì căng đây.
 
Upvote 0
Xin hỗ trợ cách copy dữ liệu có điều kiện từ 1 mảng sang 1 mảng khác trong VBA
Tôi dùng VBA trong excel và cần xử lý copy dữ liệu từ 1 mảng 2 chiều (ví dụ dữ liệu quá trình công tác của các nhân sự) với 1 điều kiện (ví dụ quá trình công tác của 1 nhân sự cóa mã nhân sự là NS0001) sang 1 mảng khác. Tôi không muốn dùng vòng lặp kiểm tra (ví dụ như For … Next) vì sẽ mất nhiều thời gian. ACE có cách nào nỗ trợ mình nhé.
Thanks các bác
Không duyệt qua từng dòng của mảng nguồn thì biết gì mà copy?
 
Upvote 0
Upvote 0
Không có lỗi chính tả. Một lỗi đánh máy nhanh và vài chữ viết tắt. Bắt lỗi thì phải bắt cho đúng.
2 lỗi đánh nhanh chứ không phải 1. :p

@chủ bài #1473:
1. sao biết For...Next sẽ lâu?
2. chỉ cần lọc một mã sang sheet khác thì dùng Advanced Filter. Ở diễn đàn này có cả đống. Chỉ là về sau có mấy người khoái Đít sần cho nên cứ thấy từ "lọc, tổng" là tương đít sần vào. Muốn tìm các giải thuật khác thì chịu khó mò mấy bài cũ. Không có kiên nhẫn mò thì Record Macro.
3. muốn tôi chỉ gì thêm nữa thì sửa mấy từ tiếng Anh đi. Tôi không thích moa toa luỹ ẻn.
 
Lần chỉnh sửa cuối:
Upvote 0
2 lỗi đánh nhanh chứ không phải 1. :p

@chủ bài #1473:
1. sao biết For...Next sẽ lâu?
2. chỉ cần lọc một mã sang sheet khác thì dùng Advanced Filter. Ở diễn đàn này có cả đống. Chỉ là về sau có mấy người khoái Đít sần cho nên cứ thấy từ "lọc, tổng" là tương đít sần vào. Muốn tìm các giải thuật khác thì chịu khó mò mấy bài cũ. Không có kiên nhẫn mò thì Record Macro.
3. muốn tôi chỉ gì thêm nữa thì sửa mấy từ tiếng Anh đi. Tôi không thích moa toa luỹ ẻn.
Thanks bạn đã góp ý DẤT xây dựng, nhưng mình không muốn dùng filter trên sheet (và chưa có cách nào dùng được để giải quyết bài toán của mình).
Bài toán của mình ở đây là tính lãi chậm thanh toán bán hàng sản phẩm là căn hộ.
Dữ liệu đầu vào nằm trong 3 sheet, cụ thể như sau:
- Sheet 1: Lưu danh sách các căn hộ (mã căn hộ, các thông số căn hộ, số tiền bán, ngày bán)
- Sheet 2: Lưu tiến độ yêu cầu thanh toán của tất cả các căn hộ ((1) mã căn hộ, (2) ngày cần thanh toán, (3) số tiền cần thanh toán) (mỗi căn hộ có số lần yêu cầu thanh toán khác nhau nên bảng dữ liệu này chỉ gồm 3 cột)
- Sheet 3: Lưu dữ liệu thanh toán thực tế của tất cả các khách hàng ((1) mã căn hộ, (2) ngày thanh toán, (3) số tiền thanh toán), (mỗi căn hộ có số lần thanh toán khác nhau nên bảng dữ liệu này chỉ gồm 3 cột)

Mình đã viết code để xử lý theo kiểu For ... Next và đã xử lý được, cách xử lý như sau:
Để tính lãi chậm trả cho 1 mã sản phẩm
- Gán dữ liệu sheet 2 vào mảng (AR-1)
- Gán dữ liệu sheet 3 vào mảng (AR-2)
For (1) Quét các dữ liệu trong AR-1 (để lấy từng yêu cầu thanh toán của căn hộ cần tính) (dữ liệu cần quét hàng nghìn dòng)
For (2) Quét các dữ liệu trong AR-2 (để lấy từng đợt thanh toán thực tế của căn hộ cần tính) (dữ liệu cần quét hàng nghìn dòng)
Xử lý tính toán lãi chậm trả nếu thanh toán chậm so với yêu cầu
Next 2
Next 1
Cụ thể code mình đã viết ở đây:
https://www.giaiphapexcel.com/diendan/threads/hỗ-trợ-code-vba-tính-lãi-chậm-thanh-toán.157791/
Cách làm của mình đã giải quyết được nhưng mình thấy nó hơi chậm nên muốn nhờ ACE giúp đỡ xem có nhanh hơn được không.

Ở đây mình thấy có thể nhanh hơn nếu có cách copy các dữ liệu thỏa mãn điều kiện từ 1 mảng sang 1 mảng khác mà không phải duyệt từng dữ liệu, cụ thể như sau:
- Gán dữ liệu sheet 2 vào mảng (AR-1)
- Gán dữ liệu sheet 3 vào mảng (AR-2)
- Copy dữ liệu mảng AR-1 chỉ của mã căn hộ cẩn tính sang mảng AR1.1
- Copy dữ liệu mảng AR-2 chỉ của mã căn hộ cẩn tính sang mảng AR2.1

For (1) Quét các dữ liệu trong AR-1.1 (để lấy từng yêu cầu thanh toán) (khoảng 5 hàng)
For (2) Quét các dữ liệu trong AR-2.1 (để lấy từng đợt thanh toán thực tế) (khoảng 10 hàng)
Xử lý tính toán lãi chậm trả nếu thanh toán chậm so với yêu cầu
Next 2
Next 1

Sorry vì mình không đưa ra bài toán tổng thể ban đầu mà chỉ đề nghị hỗ trợ 1 việc cụ thể (là copy các dữ liệu thỏa mãn 1 điều kiện cụ thể sang 1 mảng khác mà không cần duyệt từng dữ liệu).
(Mình đã để ý đánh máy cẩn thận, nếu có gõ nhầm ACE thông cảm nhé)
Thanks các bác
 
Lần chỉnh sửa cuối:
Upvote 0
Thanks bạn đã góp ý DẤT xây dựng, nhưng mình không muốn dùng filter trên sheet (và chưa có cách nào dùng được để giải quyết bài toán của mình).
Bài toán của mình ở đây là tính lãi chậm thanh toán bán hàng sản phẩm là căn hộ.
Dữ liệu đầu vào nằm trong 3 sheet, cụ thể như sau:
- Sheet 1: Lưu danh sách các căn hộ (mã căn hộ, các thông số căn hộ, số tiền bán, ngày bán)
- Sheet 2: Lưu tiến độ yêu cầu thanh toán của tất cả các căn hộ ((1) mã căn hộ, (2) ngày cần thanh toán, (3) số tiền cần thanh toán) (mỗi căn hộ có số lần yêu cầu thanh toán khác nhau nên bảng dữ liệu này chỉ gồm 3 cột)
- Sheet 3: Lưu dữ liệu thanh toán thực tế của tất cả các khách hàng ((1) mã căn hộ, (2) ngày thanh toán, (3) số tiền thanh toán), (mỗi căn hộ có số lần thanh toán khác nhau nên bảng dữ liệu này chỉ gồm 3 cột)

Mình đã viết code để xử lý theo kiểu For ... Next và đã xử lý được, cách xử lý như sau:
Để tính lãi chậm trả cho 1 mã sản phẩm
- Gán dữ liệu sheet 2 vào mảng (AR-1)
- Gán dữ liệu sheet 3 vào mảng (AR-2)
For (1) Quét các dữ liệu trong AR-1 (để lấy từng yêu cầu thanh toán của căn hộ cần tính) (dữ liệu cần quét hàng nghìn dòng)
For (2) Quét các dữ liệu trong AR-2 (để lấy từng đợt thanh toán thực tế của căn hộ cần tính) (dữ liệu cần quét hàng nghìn dòng)
Xử lý tính toán lãi chậm trả nếu thanh toán chậm so với yêu cầu
Next 2
Next 1
Cụ thể code mình đã viết ở đây:
https://www.giaiphapexcel.com/diendan/threads/hỗ-trợ-code-vba-tính-lãi-chậm-thanh-toán.157791/
Cách làm của mình đã giải quyết được nhưng mình thấy nó hơi chậm nên muốn nhờ ACE giúp đỡ xem có nhanh hơn được không.

Ở đây mình thấy có thể nhanh hơn nếu có cách copy các dữ liệu thỏa mãn điều kiện từ 1 mảng sang 1 mảng khác mà không phải duyệt từng dữ liệu, cụ thể như sau:
- Gán dữ liệu sheet 2 vào mảng (AR-1)
- Gán dữ liệu sheet 3 vào mảng (AR-2)
- Copy dữ liệu mảng AR-1 chỉ của mã căn hộ cẩn tính sang mảng AR1.1
- Copy dữ liệu mảng AR-2 chỉ của mã căn hộ cẩn tính sang mảng AR2.1

For (1) Quét các dữ liệu trong AR-1.1 (để lấy từng yêu cầu thanh toán) (khoảng 5 hàng)
For (2) Quét các dữ liệu trong AR-2.1 (để lấy từng đợt thanh toán thực tế) (khoảng 10 hàng)
Xử lý tính toán lãi chậm trả nếu thanh toán chậm so với yêu cầu
Next 2
Next 1

Sorry vì mình không đưa ra bài toán tổng thể ban đầu mà chỉ đề nghị hỗ trợ 1 việc cụ thể (là copy các dữ liệu thỏa mãn 1 điều kiện cụ thể sang 1 mảng khác mà không cần duyệt từng dữ liệu).
(Mình đã để ý đánh máy cẩn thận, nếu có gõ nhầm ACE thông cảm nhé)
Thanks các bác
Dùng dictionary lưu lại chỉ số dòng của các tên mục cần tra cứu có lẽ sẽ cải thiện được tốc độ tính toán
 
Upvote 0
Thanks bạn, nhưng mình không muốn dùng filter trên sheet (và chưa có cách nào dùng được để giải quyết bài toán của mình).
Bài toán của mình ở đây là tính lãi chậm thanh toán bán hàng sản phẩm là căn hộ.
...
Đã nói không ưa chuyện moa toa luỹ ẻn mờ.
Thử như vầy xem có lộn ruột không:
Vê-uy-lê rơ-xơ-voa, mông-xưa-má-đàm, mê xà-luy-tế-sông đi-tinh-guy-ê
Đấy là nói lịch sự, chứ Tây bồi thì cứ pa đờ p-ró-lem.

Dùng dictionary lưu lại chỉ số dòng của các tên mục cần tra cứu có lẽ sẽ cải thiện được tốc độ tính toán
Người ta đã chê For... là chậm mờ. Đít sần của bạn có thoát đuợc For... hôn?

Toi đã mách cho cách dùng Adbanved Filter mà đâu có chịu tham khảo. Chỉ tự đoán lấy thôi.
Còn vàig cách khác, nhưngn tôi lười nói tiếng Tây quá nên để đó. Rừng còn nhiều củi. Tại người hỏi lười tra mấy bài ấy chứ cũng có vài người đã từng đưa cách không dùng For....
Kết luận chung là người này lười tra và xem xét. Chỉ muốn hỏi gì trả lời nấy thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
3. muốn tôi chỉ gì thêm nữa thì sửa mấy từ tiếng Anh đi. Tôi không thích moa toa luỹ ẻn.
Thanks bạn đã góp ý
Cách làm của mình đã giải quyết được nhưng mình thấy nó hơi chậm nên muốn nhờ ACE giúp đỡ xem có nhanh hơn được không.
Sorry vì mình không đưa ra bài toán tổng thể ban đầu
(Mình đã để ý đánh máy cẩn thận, nếu có gõ nhầm ACE thông cảm nhé)
Thanks các bác
Đã được nhắc nhở vụ viết tắt và tiếng Anh rồi mà vẫn cố tình thì chịu thua.
 
Upvote 0
Đã nói không ưa chuyện moa toa luỹ ẻn mờ.
Thử như vầy xem có lộn ruột không:
Vê-uy-lê rơ-xơ-voa, mông-xưa-má-đàm, mê xà-luy-tế-sông đi-tinh-guy-ê
Đấy là nói lịch sự, chứ Tây bồi thì cứ pa đờ p-ró-lem.


Người ta đã chê For... là chậm mờ. Đít sần của bạn có thoát đuợc For hôn?

Toi đã mách cho cách dùng Adbanved Filkter mà đâu có chịu tham khảo. Chỉ tự đoán lấy thôi.
Còn vàig cách khác, nhưngn tôi lười nói tiếng Tây quá nên để đó. Rừng còn nhiều củi. Tại người hỏi lười tra mấy bài ấy chứ cũng có vài người đã từng đưa cách không dùng For....
Kết luận chung là người này lười tra và xem xét. Chỉ muón hỏi gì trả lời nấy thôi.
Dùng Advanced Filter thì tôi không biết cách xử lý hàng loạt được, muốn xử lý hàng loạt được thì phải kết hợp tiếp với macro và như thế cũng không cải thiện được tốc độ tính
 
Lần chỉnh sửa cuối:
Upvote 0
2 lỗi đánh nhanh chứ không phải 1. :p

@chủ bài #1473:
1. sao biết For...Next sẽ lâu?
2. chỉ cần lọc một mã sang sheet khác thì dùng Advanced Filter. Ở diễn đàn này có cả đống. Chỉ là về sau có mấy người khoái Đít sần cho nên cứ thấy từ "lọc, tổng" là tương đít sần vào. Muốn tìm các giải thuật khác thì chịu khó mò mấy bài cũ. Không có kiên nhẫn mò thì Record Macro.
3. muốn tôi chỉ gì thêm nữa thì sửa mấy từ tiếng Anh đi. Tôi không thích moa toa luỹ ẻn.
Trí tuệ không phải chỉ là cộng trừ nhân chia, thợ cộng trừ nhân chia tốt cũng đáng quý nhưng cũng chỉ là thợ cộng tốt thôi bạn nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Trí tuệ không phải chỉ là cộng trừ nhân chia, thợ cộng trừ nhân chia tốt cũng chỉ là thợ tốt thôi bạn nhé!
Có ai bảo dùng trí tuệ để giải quyết vấn đề này đâu? Chắc tại lo biểu diễn "trí tuệ" quá nên không thèm làm những chuyện "thợ tốt" như tra tìm những bài xưa (trong GPE)

Chú tâm vào vấn đề và chịu khó đọc thì cũng chả cần trí tuệ của các bậc cao cấp. Chỉ cẩn chuyên cần nhẫn nại của "thợ tốt" thôi.
Trích dẫn 1:
1633528300168.png
Trích dẫn 2:
1633528395601.png
 
Upvote 0
Có ai bảo dùng trí tuệ để giải quyết vấn đề này đâu? Chắc tại lo biểu diễn "trí tuệ" quá nên không thèm làm những chuyện "thợ tốt" như tra tìm những bài xưa (trong GPE)

Chú tâm vào vấn đề và chịu khó đọc thì cũng chả cần trí tuệ của các bậc cao cấp. Chỉ cẩn chuyên cần nhẫn nại của "thợ tốt" thôi.
Trích dẫn 1:
View attachment 267293
Trích dẫn 2:
View attachment 267294
Hôm nay mình mày mò thấy sử dụng SELECT SQL thì cải thiện tốc độ xử lý hơn một chút (từ khoảng 5 giây xuống còn khoảng dưới 4 giây cho 30.000 bản ghi với 2.000 vóng lặp), nhưng đổi lại thì phải dùng macro và trình bày bảng dữ liệu theo chuẩn chứ không linh hoạt nếu viết thành hàm.
Mình vẫn chưa hài lòng vì giải pháp chưa thấy hoàn chỉnh, đặc biệt là khi dữ liệu cần xử lý lớn hơn và module viết ra cần phải linh hoạt chứ không yêu cầu bắt buộc dữ liệu phải trình bày theo chuẩn để áp dụng macro.
Nói tóm lại, mình rất mong các bạn chỉ giáo có cách nào copy dữ liệu 1 mảng (2 chiều) thỏa mãn điều kiện sang 1 mảng khác trong VBA mà không phải dùng thủ công quét từng hàng trong mảng (như for .. next) nhé, đặc biệt là nhờ cao nhân thợ cộng VietMini chỉ giáo.
 
Lần chỉnh sửa cuối:
Upvote 0
Đã được nhắc nhở vụ viết tắt và tiếng Anh rồi mà vẫn cố tình thì chịu thua.
Thời sinh viên mình không phục mấy ông thầy và đến giờ rất chán mấy ông tưởng là quan lớn không biết góp ý gì, chỉ biết sửa đầu dòng phải viết hoa, thụt vào mấy ly …
 
Upvote 0
Thời sinh viên mình không phục mấy ông thầy và đến giờ rất chán mấy ông tưởng là quan lớn không biết góp ý gì, chỉ biết sửa đầu dòng phải viết hoa, thụt vào mấy ly …
Mỗi người mỗi tính, bạn không hiểu sao? Tôi không nói là không được viết tắt, không được dùng tiếng Anh. Tôi chỉ muốn nói về thực tế, sự thực dụng thôi.
Bạn không coi trọng chuyên viết tắt, bạn có quyền đó. Nhưng bạn cũng phải công nhận là người khác cũng có quyền không thích viết tắt. Bạn không thể đòi quyền tự do cho mình mà lại không cho người khác cái quyền đó. Bây giờ thế này. Bạn cần sự giúp đỡ, nhưng người có thể giúp bạn lại ra điều kiện: Không viết tắt và không dùng tiếng Anh thì tôi giúp, ngược lại tôi không giúp. Người ta có quyền ra điều kiện như thế. Bạn là con người tự do, sống ở một đất nước tự do, bạn có quyền chọn một trong hai. Nếu bạn chọn "ngược lại" thì tôi vẫn tôn trọng sự lựa chọn của bạn, nhưng lúc đó bạn sẽ không nhận được sự giúp đỡ. Bạn có quyền lờ yêu cầu của người ta, và người ta cũng có quyền từ chối giúp bạn. Không có chuyện bịt mồm và im lặng cầy hộ người khác đâu. "Chịu thua" là như thế. Nếu bạn không thỏa mãn yêu cầu của người không chấp nhận viết tắt thì chỉ còn cách là kiên nhẫn chờ những người "dễ tính" thôi. Không còn cách nào khác. Chúc may mắn.
 
Upvote 0
Thời sinh viên mình không phục mấy ông thầy và đến giờ rất chán mấy ông tưởng là quan lớn không biết góp ý gì, chỉ biết sửa đầu dòng phải viết hoa, thụt vào mấy ly …
Ngược lại, thời học sinh và sinh viên tôi rất trọng thầy trọng bạn. Có lẽ nhờ vậy mà tôi học được tính cần cù. Tôi hỏi được từ Thầy, xin được giúp đỡ từ bạn. Chứ đem "trí tuệ" ra thì chắc tôi dưới trung bình.

... nhờ cao nhân thợ cộng VietMini chỉ giáo.
Cuối cùng cũng lòi cái bản tính phân biệt dân thầy dân thợ.
Miệng thì phê làm phách "mấy ông tưởng là quan lớn", môi thì trề khinh thường "mấy cậu nhận làm dân thợ".
 
Upvote 0
Em chào các vị tiền bối.
Xin cho em hỏi một câu về mảng như sau ạ:
Em có vùng A1:A3 với A1 lưu số 1, B1 lưu số 2, A3 là công thức =A1+B1
Khi gán range("A1:C1") cho mảng Arr() để thực hiện một số câu lệnh, sau đó gán lại mảng Arr() vào range("A3:C3") thì C3 mất dữ liệu.
Vậy làm sao để C3 vẫn giữ được công thức như C1, cụ thể là C3 =A3+B3 ạ??

Em gửi file đính kèm, mọi người xem giúp em với.

1640330147160.png
 

File đính kèm

Upvote 0
Em chào các vị tiền bối.
Xin cho em hỏi một câu về mảng như sau ạ:
Em có vùng A1:A3 với A1 lưu số 1, B1 lưu số 2, A3 là công thức =A1+B1
Khi gán range("A1:C1") cho mảng Arr() để thực hiện một số câu lệnh, sau đó gán lại mảng Arr() vào range("A3:C3") thì C3 mất dữ liệu.
Vậy làm sao để C3 vẫn giữ được công thức như C1, cụ thể là C3 =A3+B3 ạ??

Em gửi file đính kèm, mọi người xem giúp em với.
Bạn sửa lại code như sau:
Mã:
Sub test()
Dim Arr() As Variant
    Arr = Range("A1:C1").FormulaR1C1
    
    Range("A3:C3") = Arr

End Sub
 
Upvote 0
Khi gán range("A1:C1") cho mảng Arr() để thực hiện một số câu lệnh, sau đó gán lại mảng Arr() vào range("A3:C3") thì C3 mất dữ liệu.
Chỉ có thể mất công thức chứ làm gì có chuyện mất dữ liệu. Lấy lên 3 giá trị ô mà gán xuống chỉ 2 ô thì cái gì mà còn.

1640398107801.png
 
Upvote 0
Cho em hỏi câu nữa về mảng.
khi ô dữ liệu của em có dạng công thức, cụ thể là =204-4,
em tạo mảng để lưu trữ ô dữ liệu này, thì phần tử mảng có dạng arr(1,2) = "=204-4", arr(1,1) = "2"
vậy em phải xử lý như nào để có thể convert được nó sang double với giá trị arr(1,2) = 200 để có thể thực hiện các tính toán liên quan là arr(1,1)*arr(1,2) = 400 ạ?
 
Upvote 0
Cho em hỏi câu nữa về mảng.
khi ô dữ liệu của em có dạng công thức, cụ thể là =204-4,
em tạo mảng để lưu trữ ô dữ liệu này, thì phần tử mảng có dạng arr(1,2) = "=204-4",
Thì khi gán vào mảng Arr phải dùng thuộc tính Value thôi.

Có ai đó dí súng vào đầu bắt dùng thuộc tính FormulaR1C1 à? Suy nghĩ chút đi.

Nguyên nhân sai ở bài 1489 đã được chỉ rõ ở bài 1492 chứ không phải do không dùng FormulaR1C1 như gợi ý ở bài 1490.

Chắc không thèm đọc bài 1492 nên mới ra cơ sự này.
 
Upvote 0
Thì khi gán vào mảng Arr phải dùng thuộc tính Value thôi.

Có ai đó dí súng vào đầu bắt dùng thuộc tính FormulaR1C1 à? Suy nghĩ chút đi.

Nguyên nhân sai ở bài 1489 đã được chỉ rõ ở bài 1492 chứ không phải do không dùng FormulaR1C1 như gợi ý ở bài 1490.

Chắc không thèm đọc bài 1492 nên mới ra cơ sự này.
các bước đi của em như này,
1 range có nhiều dòng khác nhau, dòng cuối cùng có công thức tính tổng của các dòng dữ liệu bên trên

Khi gán range cho 1 array, thực hiện tính toán các dòng khác nhau trong array, sau đó gán array trở lại range.
Nhưng ô cuối cùng trong range đó em muốn giữ nguyên công thức tổng các dòng trên nên phải dùng FormulaR1C1, lý do là vậy.
Nhưng các dòng chi tiết trong range thì em có sự giảm dần (tức là thực hiện phép tính = 204-4), và vì ô đó có sự giảm dần nên khi em tính toán cho lần gán range vào array tiếp theo mới gặp vấn đề khó khăn này.
Còn lại bài 1492 em đã đọc và biết lần trước em thiếu ở đâu rồi.

Các bác có cao kiến nào xử lý vấn đề trên chỉ giúp em.
 
Upvote 0
Nhưng ô cuối cùng trong range đó em muốn giữ nguyên công thức tổng các dòng trên nên phải dùng FormulaR1C1,
Ô có công thức, và không cần chỉnh sửa gì thì tại sao lại nhập vào mảng? Rỗi hơi chăng?

Mà vấn đề cụ thể ra sao thì phải đính kèm tập tin và giải thích cặn kẽ cần làm gì. Vài giọt nước bọt không đủ.

Còn lại bài 1492 em đã đọc và biết lần trước em thiếu ở đâu rồi.


Nếu đã đọc bài 1492 mà không muốn cám ơn thì cũng nên chọn "Chấp nhận" hoặc "Ngạc nhiên" để người khác biết mình cũng đã đọc.
 
Lần chỉnh sửa cuối:
Upvote 0
Ô có công thức, và không cần chỉnh sửa gì thì tại sao lại nhập vào mảng? Rỗi hơi chăng?
file của em có mấy chục bảng nhỏ, dòng cuối cùng của mỗi bảng nhỏ có ô tính tổng của các dòng của bảng nhỏ đó, nên em phải gán toàn bộ vùng có dữ liệu (gồm mấy chục bảng đó vào array) để xử lý 1 lần thôi cho toàn bộ chứ không thể tách riêng được, bác thông cảm.
 
Upvote 0
file của em có mấy chục bảng nhỏ, dòng cuối cùng của mỗi bảng nhỏ có ô tính tổng của các dòng của bảng nhỏ đó, nên em phải gán toàn bộ vùng có dữ liệu (gồm mấy chục bảng đó vào array) để xử lý 1 lần thôi cho toàn bộ chứ không thể tách riêng được, bác thông cảm.
Nếu cứ muốn thế thì

a = Evaluate(Arr(1, 2))
 
Upvote 0
Cái mảng lấy công thức thì kệ đó đi.
Làm một mảng nữa lấy giá trị rồi tính toán: mangGiaTri = Range().Value
 
Upvote 0
Vì sao không thể tách riêng? Thông thường người ta viết code xử lý 1 bảng sau đó gọi lại nhiều lần để thực hiện trên nhiều bảng.
Vâng, vì em đang dùng cách đó để xử lý cho cả sheet, mà 1 sheet của em gồm gần 100 bảng nhỏ, mỗi bảng lại có số lượng dòng khác nhau (từ 5 đến 30 dòng trong mỗi bảng nhỏ),
Có lẽ với sức của em thì em chỉ xử lý gộp được như vậy thôi ạ, thêm vào các hướng dẫn của các anh ở trên thì em đã thấy tốt hơn trước nhiều rồi,
Khi nào có thắc mắc em xin phép lên thỉnh giáo tiếp ạ.
 
Upvote 0
Chào mọi người, mình hiện tại có 1 bảng tính cần lọc dữ liệu của bảng tính đấy theo vùng dữ liệu. Ví dụ mình có 1 bảng tính dữ liệu từ A1:E1000 và mình muốn lọc dữ liệu bảng tính đó từ địa chỉ S3:S20 bằng VBA, hiện tại mình chỉ làm được lọc giá trị với từng ô địa chỉ theo code sau:

Sub Autofiler()

Dim Loc As Variant

Loc = Array([S3], [S4], [S5], [S6])

Range("A1", Range("A" & Rows.Count).End(xlUp)).AutoFilter 4, Loc, xlFilterValues, , 0

End Sub

mong được sự giúp đỡ của mọi người. mình xin cám ơn.
Gửi cái file lên xem nào bạn.
 
Upvote 0
Chào mọi người, mình hiện tại có 1 bảng tính cần lọc dữ liệu của bảng tính đấy theo vùng dữ liệu. Ví dụ mình có 1 bảng tính dữ liệu từ A1:E1000 và mình muốn lọc dữ liệu bảng tính đó từ địa chỉ S3:S20 bằng VBA, hiện tại mình chỉ làm được lọc giá trị với từng ô địa chỉ theo code sau:

Sub Autofiler()

Dim Loc As Variant

Loc = Array([S3], [S4], [S5], [S6])

Range("A1", Range("A" & Rows.Count).End(xlUp)).AutoFilter 4, Loc, xlFilterValues, , 0

End Sub

mong được sự giúp đỡ của mọi người. mình xin cám ơn.
Chắc là vầy chăng
Mã:
Sub Autofiler()
Dim Loc As Variant, i as Long
Loc = Array([S3], [S4], [S5], [S6])
for i = 0 to ubound(loc)
    Range("A1:E"& Range("A" & Rows.Count).End(xlUp).row).AutoFilter 4, Loc(i)
next
End Sub
 
Upvote 0
Người ta lọc cột thứ 4 tính từ cột A cơ mà

PHP:
Sub vidu
Dim ws as worksheet, lastRow as long
Dim mangDieuKien As Variant
set ws = sheet1
with ws
mangDieuKien = Array(.range("S3").value, .range("S4").value, .range("S5").value, .range("S6").value) 'Mới học thì viết cho rõ ràng ra, đừng có dùng mấy [ ]. '
lastRow = .range("A" & .rows.count).end(xlUp).row
if lastRow = 1 then exit sub
.Range("E1:E" & lastRow).AutoFilter Field:=1, Criteria1:=mangDieuKien, xlFilterValues 'Lọc cột nào thì tạo lọc ở cột đó thôi, thì mới 'ngon', nhẹ nhàng.
End with
End sub
 
Upvote 0
Đây bạn ơi, bạn xem dùm mình với ạ, mình muốn lọc nhiều giá trị trong cột S cùng lúc, nghĩa là có bao nhiêu thì lọc bấy nhiêu ấy ạ, Cám ơn
Thử thế này coi nào, Nên viết rõ ràng biến và làm việc trên sheets nào ra bạn ạ
Mã:
Sub Autofilter()

'Loc theo gia tri co san theo tung dia chi
With Sheet1
Dim Loc As Variant
    Loc = Array(.[S2].Value, .[S3].Value, .[S4].Value, .[S5].Value, .[S6].Value)
    .Range("A1:E" & .Range("A" & Rows.Count).End(xlUp).Row).Autofilter 4, Loc, xlFilterValues
End With
End Sub
 
Upvote 0
Mong các Anh/Chị trên diễn đàn viết giúp sub Vba thực hiện cộng tịnh tiến số tự nhiên ak!. Nội dung được em viết trong file đính kèm anh.
Mong các Anh/Chị giúp cho!
Tạo chủ đề mới đi bạn, giải thích rõ ràng vào, trong bài có nói tới phần bôi màu nâu mà chả thấy đâu.
 
Upvote 0
Tạo chủ đề mới đi bạn, giải thích rõ ràng vào, trong bài có nói tới phần bôi màu nâu mà chả thấy đâu.
dạ Bác thông cảm ak,!em xin gửi lại file mong Bác bớt chút thời gian code giúp em. Nội dung em viết trong file rồi ak!
 

File đính kèm

Upvote 0
dạ Bác thông cảm ak,!em xin gửi lại file mong Bác bớt chút thời gian code giúp em. Nội dung em viết trong file rồi ak!
Thử code này:
Mã:
Option Explicit
Sub TinhTien()
Dim I As Long, J As Long, R As Long, C As Long, Arr1(), Arr2()
With Sheets("Sheet1")
    Arr1 = .Range("A2:L11").Value
    Arr2 = .Range("A2:L11").Value
    R = UBound(Arr1, 1): C = UBound(Arr1, 2)
    For I = 2 To R
        For J = 1 To C
            Arr1(I, J) = Arr1(I - 1, J) + 1
            Arr2(I, J) = (Arr2(I - 1, J) + 1) Mod 10
        Next
    Next
    .Range("A2").Resize(R, C) = Arr1
    .Range("A14").Resize(R, C) = Arr2
End With
End Sub
 
Upvote 0
dạ Bác thông cảm ak,!em xin gửi lại file mong Bác bớt chút thời gian code giúp em. Nội dung em viết trong file rồi ak!

Thành viên này phạm lỗi chen ngang bài cuả người khác nhé.
(bài #13 ở thớt này)
 
Upvote 0
This thành viên phạm vi chen ngang bài báo khác người dùng nhé.
(bài # 13 ở đây)
[URL opensurl = "true"] https://www.giaiphapexcel.com/diendan/threads/l%C3%A0m-th%E1%BA%BF-n%C3%A0o-%C4%91%E1%BB % 83-hi% E1% BB% 83n-th% E1% BB% 8B-th% C3% B4ng-b% C3% A1o-l% E1% BB% 97i-chi-ti% E1% BA% BFt-trong -qu% C3% A1-tr% C3% ACnh.159555 / [/ URL]
dạ xin lỗi Anh em mới sử dụng nên không biết cách tạo chủ đề, mở bài post mới nên mong Các Anh bỏ qua cho. Em xin rút kinh nghiệm ak!
 
Upvote 0
Xin minh chính với mọi thành viên khác là tôi không có tật dùng tiếng Tây bồi.

Bài này rõ ràng là trích dẫn bài #1515, nhưng cố tình sửa lời của tôi. Không rõ người viết có ý định gì.

1646628024378.png
 
Upvote 0
Em chào các anh chị trong GPE,
em có bài toán như hình, nếu dùng mảng thì làm như thế nào hợp lý ạ?
Mong các anh chị giúp đỡ.
1653356484100.png
 
Upvote 0
Upvote 0
Vậy giờ hướng dẫn cũng như hình à bạn.Đính kèm cái file lên chứ mà kết quả nó như thế nào nhỉ.
Em gửi file ạ.
dạ kết quả như thế này anh ạ, xét thêm trường hợp tất cả đều "x" thì thông báo: danh sách cần lọc không tồn tại
1653359083771.png
 

File đính kèm

Upvote 0
Em gửi file ạ.
dạ kết quả như thế này anh ạ, xét thêm trường hợp tất cả đều "x" thì thông báo: danh sách cần lọc không tồn tại
Bài này là bạn hỏi cách dùng mảng hay nhờ code giùm?
Nếu hỏi cách dùng thì đưa code của bạn lên, người ta sẽ chỉ cho cách chỉnh. Học như thế căn bản vững chắc hơn.
Hiện tại bạn chỉ gởi file không có code, có vẻ như ý của bạn là nhờ code giùm.

Chú thích:
Bài này đáng lẽ người ta dùng transpose và advanced filter, code là dở.
Ở GPE này người ta thích code cho nó le thôi. Trên thực tế, cái nào làm tay được thì tốt hơn.
 
Upvote 0

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

Back
Top Bottom