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:
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.
Hướng mà anh nói em e rằng không khả thi, ít nhất là đối với bài này!
Em dùng công thức bình thường rất dễ dàng (nếu anh thích có thể tự chuyển thành code)
Em làm như sau:
- AutoFilter cột E với điều kiện NonBlanks
- Quét chọn từ I10 đến I83 rồi gõ vào thanh Formula công thức
PHP:
=SUM($I11:$I$86)-2*SUMIF($E11:$E$86,"*",$I11:$I$86)
- Bấm tổ hợp phím Ctrl + Enter để kết thúc
- Show All cột E
------------
Vậy là xong!
Những phần SUM còn lại anh có thể tự mình suy nghĩ thêm
Để viết thành code, anh làm theo hướng này ---> Khỏe re, chỉ có mấy dòng code là xong!
Ẹc... Ẹc...
-----------------
Em nói thêm: Xem file của anh Trung Chinh, em thấy hình như anh bỏ mất dòng Option Explicit ở đầu code, chính điều này nên anh không cần khai báo biến nó cũng chẳng nói gì! Cái này có 2 mặt lợi hại:
- Lợi: Anh đở tốn công khai báo
- Hại: Anh bị mất các ToolTip hổ trợ về các thuộc tính của biến ---> Xem hình:

untitled.JPG

Vậy làm sao anh có thể nhớ hết tất cả các thuộc tính, nhất là những thuộc tính mà anh ít khi dùng đến... Ngoài ra nếu anh không khai báo đàng hoàng thì khi code bị lỗi anh rất khó theo dỏi
------------------------------------
Để dòng Option Explicit luôn tự chèn vào code (khỏi gõ), trong cửa sổ VBE, anh vào menu Tools\Options và làm giống như hình

untitled2.JPG
 

File đính kèm

  • Sum_All.xls
    36.5 KB · Đọc: 18
Lần chỉnh sửa cuối:
Upvote 0
Nhờ Mod, Smod xóa giúp bài này. Thanks !
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các bạn giải thích giúp:
1- Số-2 trong công thức này có ý nghĩa gì ?
2- Ý nghĩa (tác dụng) của việc dùng hàm Sum(...)-2 để nhân với hàm Sumif(...)
Thanks !
Cũng chẳng biết giải thích với anh thế nào nữa... Tuy nhiên có thể gợi ý rằng: Hàm này được tính từ dưới lên, tức từ cell I83 trở lên ---> Vậy anh hãy đến cell I83 và I80 mà nghiên cứu, tự nhiên sẽ hiểu ===> Từ đó suy ngược lên trên
(lúc làm hàm này, em cũng bắt đầu từ dưới lên trên đấy)
------------------
Ngoài ra anh có thể tham khảo thêm bài này:
http://www.giaiphapexcel.com/forum/...tổng-con-cho-từng-phân-đoạn&p=87995#post87995
 
Lần chỉnh sửa cuối:
Upvote 0
Cũng chẳng biết giải thích với anh thế nào nữa... Tuy nhiên có thể gợi ý rằng: Hàm này được tính từ dưới lên, tức từ cell I83 trở lên ---> Vậy anh hãy đến cell I83 và I80 mà nghiên cứu, tự nhiên sẽ hiểu ===> Từ đó suy ngược lên trên
(lúc làm hàm này, em cũng bắt đầu từ dưới lên trên đấy)
------------------
Ngoài ra anh có thể tham khảo thêm bài này:
http://www.giaiphapexcel.com/forum/...tổng-con-cho-từng-phân-đoạn&p=87995#post87995

Cảm ơn Em ! Hôm nay đánh vật với mấy đoạn code nên đầu óc mụ mẫm quá. Sau Post bài thì anh tiếp tục nghiên cứu và mới nhớ đến thứ tự ưu tiên của các phép tính (nhân chia trước, cộng trừ sau) từ đó anh đã hiểu là trừ 2 lần Sumif chứ không phải là Sum(...)-2 như anh đã hỏi. Còn tại sao phải trừ 2 lần thì anh biết rồi. Do đã hiểu và chưa thấy ai trả lời nên anh mới xóa bài, không biết là em đã xem.

Xin chân thành cảm ơn sự quan tâm giúp đỡ của các bạn !
 
Upvote 0
icon10.gif
Tìm MAX, MIN bằng MACRO ?


Em đang xử lý đoạn code tìm 6 giá trị MAX ở ROW thứ 34 mà chưa biết làm thế nào ca +-+-+-+ -> -+*/
Các huynh cứu em với )(&&@@)(&&@@
Em đa tạ các huynh nhiêuuuuuuuuuuuu -=.,,-=.,,-=.,,
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'End Sub
Dim i%, n%, tam%, j%
Dim tim As Integer
For n = 3 To 1116 Step 34
If Sheet2.Cells(n, 2) <> "" Then
tam = 0
For i = 5 To 28
For j = n To n + 32
tam = tam + Sheet2.Cells(j, i)
Next j
Sheet2.Cells(n + 33, i) = tam
tam = 0
Next i
End If
Next n
End Sub


 
Upvote 0
icon10.gif
Tìm MAX, MIN bằng MACRO ?


Em đang xử lý đoạn code tìm 6 giá trị MAX ở ROW thứ 34 mà chưa biết làm thế nào ca +-+-+-+ -> -+*/
Các huynh cứu em với )(&&@@)(&&@@
Em đa tạ các huynh nhiêuuuuuuuuuuuu -=.,,-=.,,-=.,,
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'End Sub
Dim i%, n%, tam%, j%
Dim tim As Integer
For n = 3 To 1116 Step 34
If Sheet2.Cells(n, 2) <> "" Then
tam = 0
For i = 5 To 28
For j = n To n + 32
tam = tam + Sheet2.Cells(j, i)
Next j
Sheet2.Cells(n + 33, i) = tam
tam = 0
Next i
End If
Next n
End Sub

 
Upvote 0
Mọi người choe em hỏi? Đoạn code:
PHP:
Sub Loc_Ngay()
    With S1.Range("A1:B10")
        .AdvancedFilter 2, Range("G1:H2"), Range("A5")
        '.AdvancedFilter 2, Range("G1:H2"), Range("A5:B5") 'Cai thi duoc
    End With
End Sub
Sao nó chỉ lọc ngày mà không lọc được tên hàng?
 

File đính kèm

  • GPEv.rar
    7.5 KB · Đọc: 24
Upvote 0
Với dòng lệnh này:
PHP:
 .AdvancedFilter 2, S2.Range("G1:H2"), S2.Range("A5:B5")

Nó sẽ xuất ra cho bạn 2 cột dữ liệu; Còn lệnh trên ta bảo nó xuất ra 1 cột, thì nó làm đúng rồi còn gì!

Cớ gì trách nó & theo mình, bạn nên viết tường minh hơn
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
các huynh đệ xin cho hỏi,có cách nào để ngắt giữa đoạn một chương trình,rồi dùng form và drag chuột để nhận vùng selection mới không.Tôi lấy ví dụ trong một ứng dụng,tôi muốn ngắt chương trình và cho người sử dụng chọn một vùng và xử lí tiếp trong vùng đó.cảm ơn
 
Upvote 0
Vâng. Điều này thì đúng rùi ah. Nhưng em thắc mắc tại sao trong ví dụ này em làm thế này thì lại được:
PHP:
Sub Loc()
  Range("A7:C1000").Clear
  With Sheet1.Range("A1:C1000")
    .AdvancedFilter 2, Range("K1:L2"), Range("A7")
  End With
End Sub
nhờ anh xem dùm?
 

File đính kèm

  • loc dk ngay.rar
    7.4 KB · Đọc: 30
Upvote 0
Mọi người choe em hỏi? Đoạn code:
PHP:
Sub Loc_Ngay()
With S1.Range("A1:B10")
.AdvancedFilter 2, Range("G1:H2"), Range("A5")
'.AdvancedFilter 2, Range("G1:H2"), Range("A5:B5") 'Cai thi duoc
End With
End Sub
Sao nó chỉ lọc ngày mà không lọc được tên hàng?

Mình kiểm tra thấy code của bạn lọc được mà? Mình tham gia thêm chút xíu ha: Bạn nên thêm
PHP:
Range("A1:B1000").Clear
Đây là code mình sửa lại của bạn chút nhé:
PHP:
Sub Loc_Ngay()
    Range("A5:B1000").Clear
    With S1.Range("A1").CurrentRegion
        .AdvancedFilter 2, Range("G1:H2"), Range("A5")
    End With    
End Sub
Bạn tham khảo nhé!
 
Upvote 0
Hình như nó liên quan đến vấn đề này (trong help)

Mã:
[B][I]CopyToRange[/I][/B]    Optional [B]Variant[/B]. The destination range for the copied rows if [B][I]Action[/I][/B] is [B]xlFilterCopy[/B]. Otherwise,  this argument is ignored.


Mình thử trường hợp sau:


(*) Đổi dòng lệnh đầu tiên thành:
PHP:
Range("A7:C1000").Offset(1).Clear
Sau đó xóa [B7:C7] & chạy macro, sẽ ra kết quả chỉ 1 cột 'A'


Rất cảm ơn bạn!
 
Upvote 0
các huynh đệ xin cho hỏi,có cách nào để ngắt giữa đoạn một chương trình,rồi dùng form và drag chuột để nhận vùng selection mới không.Tôi lấy ví dụ trong một ứng dụng,tôi muốn ngắt chương trình và cho người sử dụng chọn một vùng và xử lí tiếp trong vùng đó.cảm ơn

Dùng 1 câu lệnh inputbox là được.
 
Upvote 0
Mình có đoạn code dùng để trích lọc dữ liệu theo tên sheet (do mình sử dụng lại của 1 bạn trên diễn đàn) để áp dụng trong file Quản ly cong van của mình. Tuy nhiên mình không hiểu ý nghĩa của từng câu lệnh nên chỉnh sửa theo một số ý kiến giúp đỡ của các bạn trên diễn đàn, nay nhờ giải thích dùm ý nghĩa của đoạn code sau:
Mã:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim A As String, Vung As Range, K As Integer
    Application.ScreenUpdating = False
    A = ActiveSheet.Name
    Set Vung = Sheets("CV DEN").[A5:Z5]
        If A <> "CV DEN" Then
        Sheets("CV DEN").Unprotect "bld"
        On Error Resume Next
        K = Application.WorksheetFunction.Match(A, Vung, 0)
            ActiveSheet.Cells.Clear
            With Sheets("CV DEN").Range(Sheets("CV DEN").[a5], Sheets("CV DEN").[a10000].End(xlUp)).Resize(, 26)
                ThisWorkbook.UnprotectSharing SharingPassword:="bld"
                .AutoFilter K, "x"
                .SpecialCells(12).Copy ActiveSheet.[a5]
                .AutoFilter
            End With
        End If
        Application.ScreenUpdating = True
        Sheets("CV DEN").Protect "bld"
End Sub
Ở đây mình muốn chỉnh sửa lại để có thể thực hiện được những công việc sau:
1. Nếu tên sheet là "CV DEN" hoặc là "THONG KE" thì không thực hiện hành động nào hết.

2. Nếu file đang ở chế độ Protect and share (có password) thì khi click vào tên các sheet (có tên khác sheet "CV DEN" hoặc "THONG KE") thì sẽ tự động tắt chức năng Protect and share, rồi thực hiện việc lọc dữ liệu từ sheet "CV DEN" chép qua. Sau khi thực hiện xong thì tự động bật chức năng Protect and share lại với password mặc định.

3. Có thể giới hạn chỉ xóa và copy nội dung của sheet "CV DEN" từ cột A --> Z, những cột còn lại của sheet được copy vẫn giữ nguyên nội dung (Mục đích là để lưu lại ghi chú kết quả thực hiện của từng người có liên quan để người văn thư cập nhật lại vào sheet "CV DEN").

Mình đính kèm theo file để mọi người dễ hình dung. rất mong được sự hướng dẫn và góp ý của các bạn. Thanks
 

File đính kèm

  • QLCV.zip
    26.2 KB · Đọc: 31
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Macro của bạn đang còn lỗi ngay sau dòng On Error Resume Next

Bạn nên sửa lỗi này, sau đó mới tính tiếp

PHP:
Option Explicit
Sub QQGPE()
 Dim strA As String, Vung As Range, jJ As Integer, Sh As Worksheet     '*'
 
 Application.ScreenUpdating = False
 strA = ActiveSheet.Name:                       Set Sh = Sheets("CV DEN") '*'
 Set Vung = Sh.[A5:X5]
 If strA <> "CV DEN" Then
   Sh.Unprotect "bld"
'   On Error Resume Next '
   jJ = Application.WorksheetFunction.Match(strA, Vung, 0)  '<=| Dòng Lenh Dang Sai, Dè Nghi Ban Xem & Sua Lai'
   ActiveSheet.Cells.Clear
   With Sh.Range(Sh.[a5], Sh.[a10000].End(xlUp)).Resize(, 21)
      ThisWorkbook.UnprotectSharing SharingPassword:="bld"
      .AutoFilter jJ, "x"
      .SpecialCells(12).Copy ActiveSheet.[a5]
      .AutoFilter
   End With
 End If
 Application.ScreenUpdating = True
 Sh.Protect "bld"
End Sub
 
Upvote 0
Bạn nên sửa lỗi này, sau đó mới tính tiếp

PHP:
Option Explicit
Sub QQGPE()
 Dim strA As String, Vung As Range, jJ As Integer, Sh As Worksheet     '*'
 
 Application.ScreenUpdating = False
 strA = ActiveSheet.Name:                       Set Sh = Sheets("CV DEN") '*'
 Set Vung = Sh.[A5:X5]
 If strA <> "CV DEN" Then
   Sh.Unprotect "bld"
'   On Error Resume Next '
   jJ = Application.WorksheetFunction.Match(strA, Vung, 0)  '<=| Dòng Lenh Dang Sai, Dè Nghi Ban Xem & Sua Lai'
   ActiveSheet.Cells.Clear
   With Sh.Range(Sh.[a5], Sh.[a10000].End(xlUp)).Resize(, 21)
      ThisWorkbook.UnprotectSharing SharingPassword:="bld"
      .AutoFilter jJ, "x"
      .SpecialCells(12).Copy ActiveSheet.[a5]
      .AutoFilter
   End With
 End If
 Application.ScreenUpdating = True
 Sh.Protect "bld"
End Sub


Sao mình chép đoạn code trên đè phần code của mình thì khi click vào các sheet khác ngoài sheet "CV DEN" thì không thấy thực hiện lọc dữ liệu bạn ơi. Bạn xem và chỉnh dùm nha. Thanks
 
Upvote 0
Bạn lấy macro này & chép đè lên macro ở ThisWorkBook, thử xem

PHP:
Option Explicit
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
 Dim A As String, Vung As Range, K As Integer, Sht As Worksheet
 
 Application.ScreenUpdating = False
 A = ActiveSheet.Name:                    Set Sht = Sheets("CV DEN")
 Set Vung = Sht.[A5:Z5]
 If A <> "CV DEN" And A <> "THONG KE" Then  '<=|'
   Sht.Unprotect "bld"
   On Error Resume Next
   K = Application.WorksheetFunction.Match(A, Vung, 0)
   ActiveSheet.Cells.Clear
   With Sht.Range(Sht.[a5], Sht.[a10000].End(xlUp)).Resize(, 26)
      ThisWorkbook.UnprotectSharing SharingPassword:="bld"
      .AutoFilter K, "x"
      .SpecialCells(12).Copy ActiveSheet.[a5]
      .AutoFilter
   End With
 End If
 Application.ScreenUpdating = True
 Sht.Protect "bld"
End Sub
 
Upvote 0
Nhìn code này sao thấy "wen wen"

PHP:
Option Explicit
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
 Dim A As String, Vung As Range, K As Integer, Sht As Worksheet
 
 Application.ScreenUpdating = False
 A = ActiveSheet.Name:                    Set Sht = Sheets("CV DEN")
 Set Vung = Sht.[A5:Z5]
 If A <> "CV DEN" And A <> "THONG KE" Then  '<=|'
   Sht.Unprotect "bld"
   On Error Resume Next
   K = Application.WorksheetFunction.Match(A, Vung, 0)
   ActiveSheet.Cells.Clear
   With Sht.Range(Sht.[a5], Sht.[a10000].End(xlUp)).Resize(, 26)
      ThisWorkbook.UnprotectSharing SharingPassword:="bld"
      .AutoFilter K, "x"
      .SpecialCells(12).Copy ActiveSheet.[a5]
      .AutoFilter
   End With
 End If
 Application.ScreenUpdating = True
 Sht.Protect "bld"
End Sub
Chị Hải Yến ơi, em thấy code này mà dùng On eror ...là không ổn
"Thằng" K là tìm vị trí cột để filter, lúc đầu bài này chỉ có sheet "CV DEN" và 4 hay 5 sheet tên lãnh đạo gì đó (em quên mất rồi), đến lần sửa thứ 2 mới giống giống 'bi" giờ. Nếu thêm Sheet "THONG KE" thì cũng chẳng sao nhưng trừ 2 tên "CV DEN" & "THONG KE" thì tất cả tên sheet còn lại phải có tên trong vùng [A5:Z5]nên K luôn luôn > 0 ==> không được xảy ra lỗi ==> nếu lỗi là do tên sheet & tên trong "Vung" không giống nhau
Theo em, nếu xảy ra lỗi ở hàng đó thì nên sửa dữ liệu lại đến khi nào hết lỗi thi code mới chuyển đủ dữ liệu trong các sheet muốn chuyển
 
Upvote 0
Mình rất dốt về VBA nếu không nói là nát nhưng lại bắt đầu phải dùng đến nó trong công việc. Mình có đoạn code thế này các bác giải thích giúp. Trực tiếp trên diễn đàn hoặc nếu được thì mail cho mình thì càng tốt: chipsandcrisps@gmail.com. Mình cảm ơn nhiều lắm:
PHP:
Sub VanDoi() ‘Activate sheet truoc tien
 Application.DisplayAlerts = False
 Dim xMax As Object, xDiem As Object
 Set xDiem = ThisWorkbook.ActiveSheet
 xDiem.Copy After:=xDiem
 Activesheet.Name= “VanDoi_TrichDiem” ‘Sua ten sheet vua duoc copy
 a = 0
 b = 0
 Set xMax = ActiveSheet
 r = 7
 Do
   For c = 6 To 62
     If Cells(r, c) <> "" Then
       vt = 1
       diem = Cells(r, c) & ";"
       vt1 = InStr(1, diem, ";")
       If vt1 > 0 Then
         diem1 = Val(Mid(diem, vt, vt1 - vt))
         vt = vt1 + 1
         Do
           vt1 = InStr(vt, diem, ";")
           a = 0
           If vt1 > 0 Then
             diem2 = Val(Mid(diem, vt, vt1 - vt))
             vt = vt1 + 1
             If diem1 < diem2 Then diem1 = diem2
           Else
             Cells(r, c) = diem1
             Exit Do
           End If
         b = 0
          a = 0
         Loop
       End If
     End If
   Next
   r = r + 1
   If Cells(r, 1) = "" Then Exit Do
 Loop
 End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Chị Hải Yến ơi, em thấy code này mà dùng On eror ...là không ổn
"Thằng" K là tìm vị trí cột để filter, lúc đầu bài này chỉ có sheet "CV DEN" và 4 hay 5 sheet tên lãnh đạo gì đó (em quên mất rồi), đến lần sửa thứ 2 mới giống giống 'bi" giờ. Nếu thêm Sheet "THONG KE" thì cũng chẳng sao nhưng trừ 2 tên "CV DEN" & "THONG KE" thì tất cả tên sheet còn lại phải có tên trong vùng [A5:Z5]nên K luôn luôn > 0 ==> không được xảy ra lỗi ==> nếu lỗi là do tên sheet & tên trong "Vung" không giống nhau
Theo em, nếu xảy ra lỗi ở hàng đó thì nên sửa dữ liệu lại đến khi nào hết lỗi thi code mới chuyển đủ dữ liệu trong các sheet muốn chuyển

Đúng nên là (như thế chuyển sang vị trí chuẩn hơn)

On Error Go to ....

 
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