Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây

Liên hệ QC
Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Phần Filter em chưa biết. Anh đã giúp giúp cho trót giúp em đoạn code bỏ chế độ lọc filter ở đầu code với.
 
Upvote 0
Bạn đã fix dịa chỉ của từng sheet rồi mà, với câu lệnh của bạn thì nguồn là TaoPW đích đến là Dangky, như vậy bạn muốn đi theo chiều ngược lại thì phải sủa lại nuồn và đích đến theo chiều ngược lại, chúng ta có thể làm 2 đoạn khác nhau

Sub CopyError()
Sheets("TaoPw").Range([A2], [B65536].End(xlUp)).Copy
Sheets
("DangKy").[A2].PasteSpecial Paste:=xlPasteValues
MsgBox
"Copy thanh cong"
End Sub

Sub CopyError1()
Sheets("
DangKy").Range([A2], [B65536].End(xlUp)).Copy
Sheets
("TaoPw").[A2].PasteSpecial Paste:=xlPasteValues
MsgBox
"Copy thanh cong"
End Sub
 
Upvote 0
Xin được chỉ giáo code access

Em mới được người bạn cho 1 phần mềm viết bằng Access. Bây giời em muốn sửa lại code một ít để theo ý của mình (VD: Hình nền; form Tác giả; thông tin trên các form khác..) thì phải làm sao? Em đã dùng nhấn phím Shift+Open để chỉnh sửa nhưng khi sửa xong không biết cách để lưu lại ở đâu. Mong các anh chỉ giáo giùm. Thank các anh nhiều!-=.,,
 
Upvote 0
Anh ndu!
Nhờ anh xem lại dùm em file nầy, nó đang bị lổi ở phần date.
 

File đính kèm

  • SO.rar
    51.4 KB · Đọc: 13
Lần chỉnh sửa cuối:
Upvote 0
Tôi muốn gộp 2 vòng lặp này thành 1 để quét từ cột 3 đến 6 rồi lại quét tiếp từ cột 9 đến 14 thì viết như thế nào ?

Mã:
Sub Sum()
    For j = 3 To 6
        Cells(5, j) = Application.Sum(Cells(6, j).Resize(20))
    Next
    For j = 9 To 14
        Cells(5, j) = Application.Sum(Cells(6, j).Resize(20))
    Next

End Sub

Nhờ các bạn chỉ giúp. Thanks !
 
Lần chỉnh sửa cuối:
Upvote 0
Anh thử cái này xem:

PHP:
Sub Sum()
    For j = 3 To 14
        If j = 7 Then j = 9
        Cells(5, j) = Application.Sum(Cells(6, j).Resize(20))
    Next
End Sub
 
Upvote 0
Anh thử cái này xem:

PHP:
Sub Sum()
    For j = 3 To 14
        If j = 7 Then j = 9
        Cells(5, j) = Application.Sum(Cells(6, j).Resize(20))
    Next
End Sub

Học được chiêu: cứ cho biến chạy từ cột đầu đến cột cuối cùng, khi quét đến cột cuối của vùng này thì nhẩy ngay sang cột đầu của vùng kế tiếp: If j = 7 Then j = 9
Thật là tuyệt vời. Cảm ơn ptm0412 !
 
Lần chỉnh sửa cuối:
Upvote 0
Biết thêm 1 chiêu, không bổ bề ngang cũng bổ bề dọc nhỉ anh nhỉ. Biếu thêm 1 chiêu không dùng vòng lặp:

PHP:
Sub sum()
    Set rng = Union(Range("C5:F5"), Range("I5:N5"))
    rng.FormulaR1C1 = "=sum(R[1]C:R[20]C)"
    rng.Value = rng.Value
End Sub
 
Upvote 0
Nhờ giải thích cách xử lý code về sử lý chuỗi !
Thông báo lỗi ở hàm char(10)

Sub Data_Reading()
Dim MyRequest As String, title As String
Dim lengh As Integer
Repeat:
MyRequest = InputBox(" Cho sè th¸ng tÝnh to¸n", "Tính toán thu?", "1-12")
title = "Error: Vµo sai sè th¸ng tÝnh to¸n" & Chr(10) & Chr(10) & "VÝ dô : Muèn tÝnh tõ th¸ng 1 ®Õn th¸ng 5 cÇn khai b¸o : 1-5"
lengh = Len(MyRequest)

Select Case lengh
Case 0
Exit Sub
Case 1
MsgBox (title)
GoTo Repeat
Case 2
MsgBox (title)
GoTo Repeat
Case 3
StartMonth = Left(MyRequest, 1)
EndMonth = Right(MyRequest, 1)
Case 4
StartMonth = Left(MyRequest, 1)
EndMonth = Right(MyRequest, 2)
Case 5
StartMonth = Left(MyRequest, 2)
EndMonth = Right(MyRequest, 2)
End Select
If StartMonth > EndMonth Or StartMonth > 12 Then
MsgBox (title)
GoTo Repeat
End If
NumberOfMonth = EndMonth - StartMonth + 1
End Sub
 
Upvote 0
Sửa dùm code

Anh chị xem file giúp mình nhé.
Mình đã làm thử nhiều cách nhưng k được đành phải làm phiền các Anh Chị vậy!
Mình muốn khi bấm vào cột Tên thuốc vào chọn tên thuốc bấm Enter combo tự đông cập nhật Tên thuốc , ĐVT, Đơn giá xong thì con trỏ tự động nhảy đến cột Số lượng để mình nhập số lương xong mình bấm Enter sẽ nhảy xuông dòng kế tiếp của cột Tên thuốc để mình tiếp tục nhập tiếp.
Xin các Anh Chị chỉ giáo em thành thật cám ơn
 

File đính kèm

  • Nhap thuoc BHYT.xls
    66 KB · Đọc: 12
Upvote 0
Nhờ sửa giúp Code trong Sub Sum !

Chào các bạn ! trong file ví dụ đính kèm Tôi viêt code để thực hiện các lệnh Sum như sau:
Mã:
Sub Sum_All(Cls As Range)
'Dim j As Long
With Application
    .ScreenUpdating = 0
    .Calculation = 2
    On Error Resume Next
    With ActiveSheet
        Rz = Cls(65000, 3).End(3).Row
 [COLOR=red]       j = Cls(1, 5).Column - Cls.Column[/COLOR]
'Cong Diem
        With [Cls].Offset(1).Resize(Rz).SpecialCells(4).Offset(, 1).SpecialCells(4)
            For j = j To j + 2
            For i = 1 To .Areas.Count
                  .Areas(i)(0, 3) = Application.CountA(.Areas(i).Offset(, 2))
                  .Areas(i)(0, j) = Application.Sum(.Areas(i).Offset(, j - 1))
            Next
            Next
        End With
'Cong khu
        With [Cls].Resize(Rz).SpecialCells(4)
[COLOR=red]'        j = Cls(1, 5).Column - Cls.Column[/COLOR]
            For j = j To j + 3
           For i = 1 To .Areas.Count
                .Areas(i)(0, j) = Application.Sum(.Areas(i).Offset(, 1).SpecialCells(2).Offset(, j - 2))
            Next
            Next
        End With
'Cong huyen
[COLOR=red]'       j = Cls(1, 5).Column - Cls.Column[/COLOR]
       For j = j To j + 5
            Cls(0, j) = Application.Sum(Cls.Resize(Rz).SpecialCells(2).Offset(, j - 1))
        Next
    End With
End With
End Sub

Mã:
Sub R_Sum()
    Sum_All [d9]
End Sub

Để kết quả đúng thì trước mỗi For tôi phải đặt lại câu lệnh j = Cls(1, 5).Column - Cls.Column
Vậy phải viết như thế nào thì tránh được việc nhắc lại câu lệnh trên trước mỗi vòng lặp. Tôi đã thử viết truyền tham số cho J nhưng không được (tôi đang học viết kiểu Sub có tham số truyền nên chưa biết nhiều).
Nhờ các bạn nghiên cứu sửa giúp. Thanhks !
 

File đính kèm

  • Sum_All.rar
    16.5 KB · Đọc: 26
Upvote 0
Chào các bạn ! trong file ví dụ đính kèm Tôi viêt code để thực hiện các lệnh Sum như sau:
Mã:
Sub Sum_All(Cls As Range)
  .....
  .....
End Sub

Mã:
Sub R_Sum()
    Sum_All [d9]
End Sub

Để kết quả đúng thì trước mỗi For tôi phải đặt lại câu lệnh j = Cls(1, 5).Column - Cls.Column
Vậy phải viết như thế nào thì tránh được việc nhắc lại câu lệnh trên trước mỗi vòng lặp. Tôi đã thử viết truyền tham số cho J nhưng không được (tôi đang học viết kiểu Sub có tham số truyền nên chưa biết nhiều).
Nhờ các bạn nghiên cứu sửa giúp. Thanhks !
Anh ơi, có thể mô tả cho mọi người ý anh muốn SUM như thế nào không? Đọc code vả quá
 
Upvote 0
Chào các bạn ! trong file ví dụ đính kèm Tôi viêt code để thực hiện các lệnh Sum như sau:
Mã:
Sub Sum_All(Cls As Range)
'Dim j As Long
With Application
    .ScreenUpdating = 0
    .Calculation = 2
    On Error Resume Next
    With ActiveSheet
        Rz = Cls(65000, 3).End(3).Row
 [COLOR=red]       j = Cls(1, 5).Column - Cls.Column[/COLOR]
'Cong Diem
        With [Cls].Offset(1).Resize(Rz).SpecialCells(4).Offset(, 1).SpecialCells(4)
            For j = j To j + 2
            For i = 1 To .Areas.Count
                  .Areas(i)(0, 3) = Application.CountA(.Areas(i).Offset(, 2))
                  .Areas(i)(0, j) = Application.Sum(.Areas(i).Offset(, j - 1))
            Next
            Next
        End With
'Cong khu
        With [Cls].Resize(Rz).SpecialCells(4)
[COLOR=red]'        j = Cls(1, 5).Column - Cls.Column[/COLOR]
            For j = j To j + 3
           For i = 1 To .Areas.Count
                .Areas(i)(0, j) = Application.Sum(.Areas(i).Offset(, 1).SpecialCells(2).Offset(, j - 2))
            Next
            Next
        End With
'Cong huyen
[COLOR=red]'       j = Cls(1, 5).Column - Cls.Column[/COLOR]
       For j = j To j + 5
            Cls(0, j) = Application.Sum(Cls.Resize(Rz).SpecialCells(2).Offset(, j - 1))
        Next
    End With
End With
End Sub

Mã:
Sub R_Sum()
    Sum_All [d9]
End Sub

Để kết quả đúng thì trước mỗi For tôi phải đặt lại câu lệnh j = Cls(1, 5).Column - Cls.Column
Vậy phải viết như thế nào thì tránh được việc nhắc lại câu lệnh trên trước mỗi vòng lặp. Tôi đã thử viết truyền tham số cho J nhưng không được (tôi đang học viết kiểu Sub có tham số truyền nên chưa biết nhiều).
Nhờ các bạn nghiên cứu sửa giúp. Thanhks !
ANH THỬ CÁI NÀY TRƯỚC XEM SAO
On Error Resume Next
Set j = Cls(1, 5).Column - Cls.Column
 
Upvote 0
Anh ơi, có thể mô tả cho mọi người ý anh muốn SUM như thế nào không? Đọc code vả quá
Xin lỗi các bạn vì đã không mô tả kỹ. Code tôi viết có ý như sau:
1- Cộng tất cả các dòng trong 1 Điểm TĐC lên dòng Điểm TĐC. Ví dụ: I10 = Sum(I11:I12).
2- Cộng tất cả các điểm TĐC trong 1 khu TĐC lên dòng Khu TĐC. Ví dụ: I9 = Sum(I10, I13, I15,.....I30).
3- Cộng tất cả các Khu TĐC lên dòng toàn huyện. Ví dụ: I8 = Sum(I9, I29, I32,.....I66).

Để tiện sử dụng phương thức Specialcells tôi đã bố trí dữ liệu theo từng mảng: mảng Khu TĐC để riêng tại cột D, mảng Điểm TDC để riêng tại cột E, dữ liệu của mảng Điểm TĐC để riêng tại cột F.

Để xác định vùng chứa dữ liệu của Điểm TĐC và Khu TĐC tôi dùng phương thức Specialcells(...) để xác định mảng cần phải cộng - thay cho sử dụng SumIf.

Để xác định các dòng, cột để cộng tôi chọn 1 Range để truyền tham số Cls. Ví dụ [d9]

Tôi sử dụng biến i để quét dòng và biến j để quét cột.
Ví dụ khi cộng theo điểm thì biến J chạy từ cột 4 đến cột cuối
- Khi không dùng tham số truyền tôi phải viết i = 4 to ...
- Khi dùng tham số truyền tôi j = Cls(1, 5).Column - Cls.Column để xác định cột đầu tiên là cột 4

Vấn đề là tại mỗi một kiểu cộng (điểm, khu, huyện) tôi phải viết lại câu lệnh j = Cls(1, 5).Column - Cls.Column để xác định cột đầu tiên.

Tôi không hiểu nhiều về biến nhưng cứ thử bừa vụ Set j = Cls(1, 5).Column - Cls.Column cũng đã thử và kết quả là linh tinh beng chẳng biết đường nào mà lần.

Trong file đính kèm chỉ cần mở lại các dòng lệnh j = Cls(1, 5).Column - Cls.Column ở đầu mỗi vòng lặp là kết quả đúng ngay.

Rất mong các bạn nghiên cứu và trợ giúp.

Lưu ý: Tôi muốn được các bạn giúp theo hướng của tôi đang làm dù là chưa tối ưu vì vấn đề ở đây là ví dụ để học. Nếu chuyển sang hướng khác tôi sợ không tiếp thu được.
 
Lần chỉnh sửa cuối:
Upvote 0
Cái macro R_Sum() chả để làm chi cả đó & tham khảo cái ní xem sao

PHP:
Sub Sum_All()
 Dim Cls As Range:             Dim jJ As Long
 
 Set Cls = [D9]
 With Application
    .ScreenUpdating = 0
    .Calculation = 2
 End With                      '<=|'
 On Error Resume Next
    With ActiveSheet
        Rz = Cls(65000, 3).End(3).Row
        jJ = Cls(1, 5).Column - Cls.Column
'Cong Diem:'
        With [Cls].Offset(1).Resize(Rz).SpecialCells(4).Offset(, 1).SpecialCells(4)
            For j = jJ To jJ + 2
            For i = 1 To .Areas.Count
                  .Areas(i)(0, 3) = Application.CountA(.Areas(i).Offset(, 2))
                  .Areas(i)(0, j) = Application.Sum(.Areas(i).Offset(, j - 1))
            Next
            Next
        End With
'Cong Khu:'
        With [Cls].Resize(Rz).SpecialCells(4)
        jJ = Cls(1, 5).Column - Cls.Column
            For j = jJ To jJ + 3
            For i = 1 To .Areas.Count
                .Areas(i)(0, j) = Application.Sum(.Areas(i).Offset(, 1).SpecialCells(2).Offset(, j - 2))
            Next
            Next
        End With
'Cong Huyen:'
       jJ = Cls(1, 5).Column - Cls.Column
       For j = jJ To jJ + 5
            Cls(0, j) = Application.Sum(Cls.Resize(Rz).SpecialCells(2).Offset(, j - 1))
        Next
    End With

With Application
    .ScreenUpdating = 100  '?'
    .Calculation = 1  '?'
End With
End Sub
 
Upvote 0
PHP:
Sub Sum_All()
 Dim Cls As Range:             Dim jJ As Long
 
 Set Cls = [D9]
 With Application
    .ScreenUpdating = 0
    .Calculation = 2
 End With                      '<=|'
 On Error Resume Next
    With ActiveSheet
        Rz = Cls(65000, 3).End(3).Row
        jJ = Cls(1, 5).Column - Cls.Column
'Cong Diem:'
        With [Cls].Offset(1).Resize(Rz).SpecialCells(4).Offset(, 1).SpecialCells(4)
            For j = jJ To jJ + 2
            For i = 1 To .Areas.Count
                  .Areas(i)(0, 3) = Application.CountA(.Areas(i).Offset(, 2))
                  .Areas(i)(0, j) = Application.Sum(.Areas(i).Offset(, j - 1))
            Next
            Next
        End With
'Cong Khu:'
        With [Cls].Resize(Rz).SpecialCells(4)
        jJ = Cls(1, 5).Column - Cls.Column
            For j = jJ To jJ + 3
            For i = 1 To .Areas.Count
                .Areas(i)(0, j) = Application.Sum(.Areas(i).Offset(, 1).SpecialCells(2).Offset(, j - 2))
            Next
            Next
        End With
'Cong Huyen:'
       jJ = Cls(1, 5).Column - Cls.Column
       For j = jJ To jJ + 5
            Cls(0, j) = Application.Sum(Cls.Resize(Rz).SpecialCells(2).Offset(, j - 1))
        Next
    End With

With Application
    .ScreenUpdating = 100  '?'
    .Calculation = 1  '?'
End With
End Sub

Em cảm ơn Thầy ! em đã test thử Code cho kết quả đúng rồi và câu lệnh Set Cls=... đã thay thế cho Sub R-Sum.
Em viết thêm sub này là vì em đang tập viết sub có tham số truyền.

Và có một số điều em chưa hiểu:
1- Tại sao nhiều khi không cần khai báo biến: Dim... mà code vẫn hoạt động bình thường - ngay trong code này bỏ Dim... code vẫn chạy đúng. Chính vì lý do này nên khi viết code em thường bỏ Dim ... ?

2- Trường hợp nào thì sử dụng Set... ? em gặp nhiều trường hợp nếu Set ... thì code chạy đúng nhưng cũng có nhiều trường hợp dùng Set... thì code bị lỗi hoặc cho kết quả sai ?
 
Upvote 0
(0) Em viết thêm sub này là vì em đang tập viết sub có tham số truyền.

Và có một số điều em chưa hiểu:
(1)- Tại sao nhiều khi không cần khai báo biến: Dim... mà code vẫn hoạt động bình thường - ngay trong code này bỏ Dim... code vẫn chạy đúng. Chính vì lý do này nên khi viết code em thường bỏ Dim ... ?

(2) - Trường hợp nào thì sử dụng Set... ? em gặp nhiều trường hợp nếu Set ... thì code chạy đúng nhưng cũng có nhiều trường hợp dùng Set... thì code bị lỗi hoặc cho kết quả sai ?

(0) Macro gọi 1 macro khác
Mã:
  Sub GPE_ ()
    Dim jJ As Byte, Zz As Byte
 
    For jJ = 1 To 10 Step 3
        GPE_COM jJ 
        
    Next jJ
  End Sub

PHP:
 Sub GPE_COM(Zz As Byte)
   Const StrC As String = "@0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
   Dim Jj As Integer

   For Jj = 1 To Zz
       MsgBox Mid(StrC,Jj,1),,Zz
  Next Jj
 End Sub

(1) Bỏ cũng chạy, nhưng fải là:
(*) Nhà lập trình luôn nắm vững các biến của mình;
(*) Macro cỏn con, không tốn nhiêu bộ nhớ;
(*) Không cần đến sự hỗ trợ về chính tả của trình biên dịch luôn theo dõi bạn trong suốt quá trình việt code;
. . .

(2) NDU đã nói, nhưng chưa hết í để bạn hiểu:

Các biến đối tượng như

Dim Rng As Range, Sh As WorkSheet,. . .

Cần dùng Set

Còn những cái nhỏ lẻ khác như Long, Integer, String, Double, . . . ta có thể

StrC = "GPE": MyNum = 35 , . . . .

Tạm thế nha & fải chi bạn ở lớp VBA, nhỉ?
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom