Lấy diễn giải bằng VBA (1 người xem)

Liên hệ QC

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

canguocs

Thành viên hoạt động
Tham gia
28/6/14
Bài viết
100
Được thích
7
Chào anh, chị
Em có một file cần lấy diễn giải bằng marco,
Những mã giao dịch =4420 và số tiền <>0 sẽ được lấy diễn giải ah
Chi tiết em gửi file đính kèm ah
Em có thực hiện đoạn code sau nhưng chưa đúng ah
Mã:
Sub BLTM()
Dim i As Range, Ma As Integer, sotien As Integer, mua As Range
Set mua = Sheet1.Range("B4:B" & Sheet1.Range("B4000").End(xlUp).Row)
For i = 1 To mua.Rows.Count
If Ma = 4420 And sotien <> 0 Then
Cells(i, 1) = "Thu no BLTM" & Ma
End If
Nexti
End Sub
 

File đính kèm

Chào anh, chị
Em có một file cần lấy diễn giải bằng marco,
Những mã giao dịch =4420 và số tiền <>0 sẽ được lấy diễn giải ah
Chi tiết em gửi file đính kèm ah
Em có thực hiện đoạn code sau nhưng chưa đúng ah
Mã:
Sub BLTM()
Dim i As Range, Ma As Integer, sotien As Integer, mua As Range
Set mua = Sheet1.Range("B4:B" & Sheet1.Range("B4000").End(xlUp).Row)
For i = 1 To mua.Rows.Count
If Ma = 4420 And sotien <> 0 Then
Cells(i, 1) = "Thu no BLTM" & Ma
End If
Nexti
End Sub
Thứ nhất: Biến i khai báo kiểu Range thì không phù hợp với câu lệnh For phía dưới. Nếu dùng kiểu Range thì ở phía dưới nên là For Each i in mua, còn nếu muốn giữ câu lệnh For như cũ thì phải khai báo biến i kiểu Long hoặc Integer. Trong trường hợp có tham chiếu Cells(i, 1) ở dưới thì cần khai báo biến i kiểu Long hoặc Integer.

Thứ hai: 2 anh chàng Ma và sotien chưa được gán giá trị thì điều kiện của câu lệnh If trong For luôn luôn sai, do đó sẽ chẳng có ô nào được gán diễn giải cả.

Thứ ba: Giả sử có diễn giải được gán thì tham chiếu Cells(i, 1) cũng gán sai cột, diễn giải sẽ được gán vào cột A chứ không phải cột B (cột 1 là cột A).

Tôi đề xuất một phương án, bạn có thể tham khảo và phát triển:
[GPECODE=vb]Sub DienGiai()
Dim Rng As Range, Cll As Range
Set Rng = Sheet1.Range("A4:A" & Sheet1.[A65000].End(xlUp).Row)
For Each Cll In Rng
If Cll = 4420 And Cll.Offset(, 2) <> 0 Then Cll.Offset(, 1) = "Thu no BLTM_" & Cll.Offset(, 2)
Next
End Sub[/GPECODE]
 
Upvote 0
Thứ nhất: Biến i khai báo kiểu Range thì không phù hợp với câu lệnh For phía dưới. Nếu dùng kiểu Range thì ở phía dưới nên là For Each i in mua, còn nếu muốn giữ câu lệnh For như cũ thì phải khai báo biến i kiểu Long hoặc Integer. Trong trường hợp có tham chiếu Cells(i, 1) ở dưới thì cần khai báo biến i kiểu Long hoặc Integer.

Thứ hai: 2 anh chàng Ma và sotien chưa được gán giá trị thì điều kiện của câu lệnh If trong For luôn luôn sai, do đó sẽ chẳng có ô nào được gán diễn giải cả.

Thứ ba: Giả sử có diễn giải được gán thì tham chiếu Cells(i, 1) cũng gán sai cột, diễn giải sẽ được gán vào cột A chứ không phải cột B (cột 1 là cột A).

Tôi đề xuất một phương án, bạn có thể tham khảo và phát triển:
[GPECODE=vb]Sub DienGiai()
Dim Rng As Range, Cll As Range
Set Rng = Sheet1.Range("A4:A" & Sheet1.[A65000].End(xlUp).Row)
For Each Cll In Rng
If Cll = 4420 And Cll.Offset(, 2) <> 0 Then Cll.Offset(, 1) = "Thu no BLTM_" & Cll.Offset(, 2)
Next
End Sub[/GPECODE]
Khai báo i em biết lỗi rồi ah
Anh Phúc luôn giải thích rất cặn kẽ , nhiệt tình
em làm được rồi ah,
Em cảm ơn anh nhé
 
Upvote 0
Khai báo i em biết lỗi rồi ah
Anh Phúc luôn giải thích rất cặn kẽ , nhiệt tình
em làm được rồi ah,
Em cảm ơn anh nhé
"Màu mè" hơn một tí tí có thể thay câu lệnh If trong vòng For thành thế này cho nó ra tiếng Việt cho đẹp:
Mã:
If Cll = 4420 And Cll.Offset(, 2) <> 0 Then Cll.Offset(, 1) = "Thu n" & ChrW(7907) & " BLTM_" & Cll.Offset(, 2)
 
Upvote 0
Em gửi một đoạn code khác để những bạn mới chập chững VBA như em, tham khảo
Mã:
Option Explicit
Sub BLTM()
Dim i As Long
With Sheet1.UsedRange
For i = 1 To 1000
If Cells(i, 1) = 4420 And Cells(i, 3) <> 0 Then
Cells(i, 2) = "Thu no BLTM" & Cells(i, 3)
End If
Next i
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Em gửi một đoạn code khác để những bạn mới chập chững VBA như em, tham khảo
Mã:
Option Explicit
Sub BLTM()
Dim i As Long
[COLOR=#ff0000][B][I]With Sheet1.UsedRange[/I][/B][/COLOR]
For i = 1 To 1000
If Cells(i, 1) = 4420 And Cells(i, 3) <> 0 Then
Cells(i, 2) = "Thu no BLTM" & Cells(i, 3)
End If
Next i
[I][B][COLOR=#ff0000]End With[/COLOR][/B][/I]
End Sub
**Kiểm tra thử dùng tô đỏ ở trên, mình thấy nó không cần thiết ! , hay bạn có mục đích khác ?
**
Mã:
If Cells(i, 1) = 4420 And Cells(i, 3) <> 0 Then
Cells(i, 2) = "Thu no BLTM" & Cells(i, 3)
End If
Nếu là mình mính sẽ viết thành 2 câu lệnh if lồng vào nhau :
Mã:
If Cells(i, 1) = 4420 
   if Cells(i, 3) <> 0 Then Cells(i, 2) = "Thu no BLTM" & Cells(i, 3)
End If
 
Upvote 0
**Kiểm tra thử dùng tô đỏ ở trên, mình thấy nó không cần thiết ! , hay bạn có mục đích khác ?
**
Mã:
If Cells(i, 1) = 4420 And Cells(i, 3) <> 0 Then
Cells(i, 2) = "Thu no BLTM" & Cells(i, 3)
End If
Nếu là mình mính sẽ viết thành 2 câu lệnh if lồng vào nhau :
Mã:
If Cells(i, 1) = 4420 
   if Cells(i, 3) <> 0 Then Cells(i, 2) = "Thu no BLTM" & Cells(i, 3)
End If
Em tập dùng cho quen thôi ah
Em cảm ơn anh đã góp ý ah
 
Upvote 0
Mã:
Sub BLTM()
Dim i&, Arr, Rng
Rng = Range([A4], [a65000].End(3)).Resize(, 3).Value2
ReDim Arr(1 To UBound(Rng, 1), 1 To 1)
For i = 1 To UBound(Rng, 1)
        If Rng(i, 1) = 4420 Then
            If Rng(i, 3) <> 0 Then
                Arr(i, 1) = "Thu no BLTM" & Rng(i, 3)
            End If
        End If
Next i
[B4:B5000].ClearContents
[B4].Resize(Ubound(rng,1), 1).Value = Arr
End Sub

Em thử đưa công thức bài này vào mảng khi Debug báo lỗi ở dòng Rng(i,1)=4420 nhưng chưa biết cách sửa,
Các anh chị giúp em với ah
 
Lần chỉnh sửa cuối:
Upvote 0
Em đã làm đúng nhưng do quên chưa xóa lỗi #N/A dưới cột A nên mới báo vậy ah
Em đã làm thành công, cảm ơn mọi người
 
Upvote 0
Mã:
Sub BLTM()
Dim i&, Arr, Rng
Rng = Range([A4], [a65000].End(3)).Resize(, 3).Value2
ReDim Arr(1 To UBound(Rng, 1), 1 To 1)
For i = 1 To UBound(Rng, 1)
        If Rng(i, 1) = 4420 Then
            If Rng(i, 3) <> 0 Then
                Arr(i, 1) = "Thu no BLTM" & Rng(i, 3)
            End If
        End If
Next i
[B4:B5000].ClearContents
[B4].Resize(Ubound(rng,1), 1).Value = Arr
End Sub

Em thử đưa công thức bài này vào mảng khi Debug báo lỗi ở dòng Rng(i,1)=4420 nhưng chưa biết cách sửa,
Các anh chị giúp em với ah


Cái Rng của bạn là một Range, mà bạn dùng rng(i,3) thì nó ra cái gì? Thay vào đó bạn dùng cells(i,3) thì còn đúng hơn.
 
Upvote 0
Web KT

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

Back
Top Bottom