Xin Giải Thích Giúp 1 đoạn code update trong file chấm công (4 người xem)

Liên hệ QC

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

tommybull

Thành viên hoạt động
Tham gia
21/7/08
Bài viết
191
Được thích
29
Giới tính
Nam
PHP:
Sub cmd_updatelist()
Dim i, n, m As Integer
Dim confirm As Boolean
n = Sheets("Danhsach_NV").Cells(Rows.Count, "B").End(xlUp).Row
m = Sheets("Chamcong").Cells(Rows.Count, 6).End(xlUp).Row
confirm = MsgBox("Da co du lieu, xem lai truoc khi import!", vbOKCancel, "Warning")
If (Not IsEmpty(Sheets("ChamCong"))) And confirm Then
For i = 6 To n
    If Not IsEmpty(Sheets("Danhsach_NV").Cells(i, 1).Value) Then
        Sheets("ChamCong").Cells(i - 1, 1).Value = i - 6
        Sheets("ChamCong").Cells(i - 1, 2).Value = Sheets("Danhsach_NV").Cells(i, 2)
        Sheets("ChamCong").Cells(i - 1, 3).Value = Sheets("Danhsach_NV").Cells(i, 6)
        Sheets("chamcong").Range("D" & (i - 1) & ": AH" & (i - 1)).Select
        Selection.ClearContents
        Sheets("Chamcong").Range("AI" & (i - 1)).Select
        ActiveCell.FormulaR1C1 = "=COUNTIF(RC[-31]:RC[-1],R4C35)"
        Sheets("Chamcong").Range("AJ" & (i - 1)).Select
        ActiveCell.FormulaR1C1 = "=COUNTIF(RC[-32]:RC[-2],""P"")+COUNTIF(RC[-32]:RC[-2],""P5"")/2"
        Sheets("ChamCong").Range("AK" & (i - 1)).Select
        ActiveCell.FormulaR1C1 = "=COUNTIF(RC[-33]:RC[-3],R4C37)"
        Sheets("ChamCong").Range("AL" & (i - 1)).Select
        ActiveCell.FormulaR1C1 = "=COUNTIF(RC[-33]:RC[-3],R4C37)"
        Sheets("ChamCong").Range("AM" & (i - 1)).Select
        ActiveCell.FormulaR1C1 = "=COUNTIF(RC[-35]:RC[-5],R4C39)"
trong đó: 1. If Not IsEmpty(Sheets("Danhsach_NV").Cells(i, 1).Value) Then : NGHĨA LÀ SAO?
2. Cells(i - 1, 1).Value = i - 6: NGHĨA LÀ SAO?
3. Cells(i - 1, 2).Value = Sheets("Danhsach_NV").Cells(i, 2): NGHĨA LÀ SAO?
4. COUNTIF(RC[-31]:RC[-1],R4C35)" : NGHĨA LÀ SAO?
5. (RC[-32]:RC[-2] : NGHĨA LÀ SAO?
6. (RC[-33]:RC[-3],R4C37)" : NGHĨA LÀ SAO?

RẤT MỌNG NHẬN ĐƯỢC SỰ CHỈ GIÁO CỦA CÁC TIỀN BỐI
XIN CHÂN THÀNH CẢM ƠN
TOMMY
 
Chỉnh sửa lần cuối bởi điều hành viên:
trong đó: 1. If Not IsEmpty(Sheets("Danhsach_NV").Cells(i, 1).Value) Then
NGHĨA LÀ : Nếu ô thuộc dòng i của cột 'A' có dữ liệu, thì . . .
2. Cells(i - 1, 1).Value = i - 6
NGHĨA LÀ : dữ liệu ô thuộc dòng i-1 của cột 'A' được gán trị i-6 ; (Nếu VD i=7, thì 'A6' => 1
3. Cells(i - 1, 2).Value = Sheets("Danhsach_NV").Cells(i, 2)
NGHĨA LÀ: Ô thuộc dòng i-1 của cột 'B' được gán trị bỡi ô 'B' & i của sheet("Dấnhch_NV")
4. COUNTIF(RC[-31]:RC[-1],R4C35)"
NGHĨA LÀ lập công thức/hàm COUNTIF()
5. (RC[-32]:RC[-2] & 6. (RC[-33]:RC[-3],R4C37)"
: NGHĨA LÀ vùng giới hạn bỡi dòng (r) & cột (C): từ trên trái nhất đến dưới, phải nhất (Thường vùng này là mảng các ô tạo thành hình chữ nhật hay hãn hữu: hình vuông
 
Upvote 0
Hỏi về VBA - Macro

Mình xem bài Copy nối dữ liệu của bạn ndu96081631. Nhưng do mình mới tìm hiểu về VBA nên không hiểu hết nghĩa của đoạn code dưới đây, mình cần dịch "diễn nôm" để hiểu, càng kỹ càng tốt. rất mong được giúp đỡ. Thanks!

Dim Src As Range, Des As Range
On Error Resume Next
Set Src
= Sheet1.[A2].Resize(Sheet1.[A65536].End(xlUp).Row-1, 2)
Set Des = Sheet2.Cells(Sheet2.[A65536].End(xlUp).Row + 1, 1)
Src.Copy Destination:=Des
Src
.Clear
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các bạn dịch giúp mình đoạn code dưới đây có nghĩa là gì
Set Nguon = Sheet1.[A6].Resize(Sheet1.[B65536].End(xlUp).Row - 1, 4)
Set ketqua = Sheet2.Cells(Sheet2.[BZ65536].End(xlUp).Row + 3, 2)

Một cách khác để tiếp cận với 2 dòng lệnh này:

* Trước tiên ta tìm hiểu thuộc tính End(); Thuộc tính này có 4 hướng chuyển động, nôm na là vậy;

Vậy từ ô 'B65536' chuyển động lên (ô đầu cột) gặp ô có chứa dữ liệu thì ngưng.
Cụ thể, bạn có CSDL với các ô cột 'B' từ B2-B9' & 'B13-B20' thì lệnh
[B65536].End(Xlup).row -1 sẽ cho ta trị 19;
Nếu cột 'BZ' của bạn cũng có dữ liệu như trên cột 'B' thì
[BZ65536].End(Xlup).Row + 3 sẽ cho giá trị 23;
Vậy trong dòng lệnh 2, biến KetQua sẽ được gán sẽ là 'B23'

* Thuộc tính Resize(RowCount, ColumnCount) sẽ mở rọng vùng chọn thêm RowCount hàng & ColumnCount cột
Ví dụ Msgbox [A6].Resize(19,4).Address sẽ hiện trong hộp thoại sẽ là
$A$6:$D$24

* Cần nói thêm, rằng chúng ta có thể dùng lệnh MSGBOX() để giao tiếp với VBA rất tiện lợi mọi lúc, mọi nơi

* BS: http://giaiphapexcel.com/forum/showthread.php?t=12903 tham khảo tại đây về thuộc tính End()

Về Resize() trong khi chờ đợi eBook của Lê Văn Duyệt & các cộng sự, hãy nhấn vô chữ Resize trong chữ ký của Sa_DQ


Chúc các bạn thành công!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
định dạng có điều kiện cho vùng có dữ liệu

...hãy nhấn vô chữ Resize trong chữ ký của Sa_DQ
Chúc các bạn thành công!

Cảm ơn bạn HYen17;92354 đã chỉ dẫn, mình đã tìm được và vô Resize trong chữ ký của Sa_DQ nhưng đọc mà chẳng hiểu chi - do mình mới bắt đầu nên cần phải có thời gian đọc và nghiên cứu dân mới có thể hiểu được...

Mình nhờ Bạn viết giúp đoạn lệnh định dạng có điều kiện cho vùng có dữ liệu trong ví dụ sau: Cột A ghi số thứ tự của phòng (1, 2, 3...) ; Cột B ghi tên phòng (phòng kế hoạch, phòng kế toán, phòng hành chính...) và các dòng ghi tên nhân viên trong phòng.

Yêu cầu tại dòng tên phòng (dòng có đánh số thứ tự) tô nền xám, chữ đậm để phân biệt tên phòng và tên người.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn HYen17;92354 đã chỉ dẫn, mình đã tìm được và vô Resize trong chữ ký của Sa_DQ nhưng đọc mà chẳng hiểu chi - do mình mới bắt đầu nên cần phải có thời gian đọc và nghiên cứu dân mới có thể hiểu được...
Bạn tìm hiểu hàm OFFSET trong công thức Excel là tự nhiên hiếu ngay!
Tôi nhận xét rằng hàm OFFSET trong công thức Excel gần tương đương với OFFSET + RESIZE của VBA đấy!
Offset(Cell, Tham số 1, Tham số 2) <===> Offset của VBA
Offset(Cell, , , Tham số 3, Tham số 4) <===> Resize của VBA
 
Upvote 0
Không ngờ tới!

Phần bổ sung của bạn:
Mình nhờ Bạn viết giúp đoạn lệnh định dạng có điều kiện cho vùng có dữ liệu trong ví dụ sau: Cột A ghi số thứ tự của phòng (1, 2, 3...) ; Cột B ghi tên phòng (phòng kế hoạch, phòng kế toán, phòng hành chính...) và các dòng ghi tên nhân viên trong phòng.
Yêu cầu tại dòng tên phòng (dòng có đánh số thứ tự) tô nền xám, chữ đậm để phân biệt tên phòng và tên người.

Có lẻ lần sau bạn nên tạo 1 bài mới, thứ nữa, nên nhờ các bạn, . . .
Thứ nhất, may mà mình ghé lại, chứ không thì không biết bạn bổ sung phần này (& như vậy bạn chờ dài cổ !) Mình nói chờ dài cổ, vì bạn chỉ định đích danh người định nhờ, sẽ làm 1 số người, vì lý do gì đó sẽ không viết trả lời, dù họ đủ khả năng (& nhất là khi mình vắng DĐàn lâu, thì sao?!)
Mình ghé lại đây vì mình định đưa thêm cho bạn đường dẫn này: http://giaiphapexcel.com/forum/showthread.php?t=13005

Trở lại vụ án trên: Theo mình bạn nên lập CSDL gồm các trường:
[TT], [HoDem], [Ten], [MaDVi],. . . .
Còn 1 sheet nữa gồm [Ma], [TenDV] , .. .
Lúc đó bạn thuận tiện hơn; vì cách quản lý kiểu này ngài BG khuyến cáo ta xài đó!

Nhưng nếu bạn vẫn giữ nguyên ý định ban đầu, thì nên đưa file lên, dù chỉ là giả lập
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
định dạng có điều kiện bằng VBA

Phần bổ sung của bạn:

Có lẻ lần sau bạn nên tạo 1 bài mới, thứ nữa, nên nhờ các bạn, . . .

...Nhưng nếu bạn vẫn giữ nguyên ý định ban đầu, thì nên đưa file lên, dù chỉ là giả lập

Nhờ các bạn giúp mình định dạng có điều kiện cho vùng có dữ liệu bằng VBA

ví dụ sau: Cột B ghi số thứ tự của phòng (1, 2, 3...) ; Cột C ghi tên phòng (phòng kế hoạch, phòng kế toán, phòng hành chính...) và các dòng ghi tên nhân viên trong phòng.
Yêu cầu tại dòng tên phòng (dòng có đánh số thứ tự) tô nền xám, chữ đậm để phân biệt tên phòng và tên người (mình gửi file đính kèm theo bài).
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhờ các bạn giúp mình định dạng có điều kiện cho vùng có dữ liệu bằng VBA

ví dụ sau: Cột B ghi số thứ tự của phòng (1, 2, 3...) ; Cột C ghi tên phòng (phòng kế hoạch, phòng kế toán, phòng hành chính...) và các dòng ghi tên nhân viên trong phòng.
Yêu cầu tại dòng tên phòng (dòng có đánh số thứ tự) tô nền xám, chữ đậm để phân biệt tên phòng và tên người (mình gửi file đính kèm theo bài).
Nhất định phải dùng VBA sao? Tôi thấy dùng cách thông thường là Conditional Formating cũng đủ làm được yêu cầu này rồi mà
 
Upvote 0
Nhất định phải dùng VBA sao? Tôi thấy dùng cách thông thường là Conditional Formating cũng đủ làm được yêu cầu này rồi mà

Cảm ơn bạn đã quan tâm ! Vấn đề mình nêu ra chỉ là ví dụ để mọi người giúp mình tiếp cận với VBA vì vậy nhất định phải dùng VBA rồi.
 
Upvote 0
Cảm ơn bạn đã quan tâm ! Vấn đề mình nêu ra chỉ là ví dụ để mọi người giúp mình tiếp cận với VBA vì vậy nhất định phải dùng VBA rồi.
Vậy thì cũng không khó lắm, bạn record macro rồi từ từ chỉnh code...
Tôi gợi ý 1 code như sau:
PHP:
Option Explicit
Sub Kekhung_ToMau()
   Dim DS As Range, Clls As Range
   Dim Kieu As Byte, i As Byte
   Set DS = [B4].CurrentRegion
   For i = 7 To 12
    If i = 7 Or i = 10 Then
        Kieu = 2
    Else:
        Kieu = 1
    End If
    With DS.Borders(i)
        .Weight = Kieu
    End With
   Next i
   For Each Clls In DS.Resize(, 1)
     If Clls <> "" Then
        With Clls.Resize(, 2)
           .Font.Bold = True
           .Interior.ColorIndex = 8
        End With
      End If
   Next Clls
End Sub
Làm gì tiếp nữa tự bạn "chế tác" nhé
 

File đính kèm

Upvote 0
Cảm ơn bạn đã quan tâm ! Vấn đề mình nêu ra chỉ là ví dụ để mọi người giúp mình tiếp cận với VBA vì vậy nhất định phải dùng VBA rồi.
bạn chon vùng cần định dạng rồi nhấn nút
PHP:
Sub format()
Dim cll As Range
For Each cll In Selection
    If cll > 0 And Left(cll.Offset(, 1), 5) = "Ph" & ChrW(242) & "ng" Then
        With cll.Resize(1, 2)
            .Font.Bold = True
            .Interior.ColorIndex = 34
        End With
    End If
Next
End Sub
 

File đính kèm

Upvote 0
Giải thích code

Bạn ndu96081631 vừa giúp mình đoạn code định dạng có điều kiện cho vùng dữ liệu mình đã chạy thử và thấy rất tốt... nhưng do mình mới tiếp cận VBA nên không hiểu ý nghĩa của một số dòng lệnh trong đoạn code này vì vậy mình nhờ các bạn "dịch nôm" những dòng có chữ đỏ dưới đây.


Option Explicit
Sub Kekhung_ToMau
()

Dim DS As Range, Clls As Range
Dim Kieu As Byte, i As Byte
Set DS = [B4].CurrentRegion 'không hiểu CurrentRegion ...
For i = 7 To 12 'ý nghĩa của số 12, số khác có được không?
If i = 7 Or i = 10 Then 'ý nghĩa của số 10 ?
Kieu
= 2
.
Else:
Kieu = 1

End If
With DS.Borders(i)
.
Weight = Kieu

End With
Next i
For Each Clls In DS.Resize(, 1) 'không hiểu ?
If
Clls <> "" Then
With Clls
.Resize(, 2)
'không hiểu ?
.Font.Bold = True
.Interior.ColorIndex = 8
End With
End
If
Next Clls
End Sub

Đây là một cách học của riêng mình các bạn đừng cười nhé. Nếu các bạn cười thì lần sau hổng dám đâu...
 
Lần chỉnh sửa cuối:
Upvote 0
Tiếp tục phát triển và hoàn thiện, với tiêu chí không bằng lòng với những thứ đã làm được... Vậy ta cải tiến tiến đoạn code Tô màu và kẽ khung nhé:
PHP:
Option Explicit
Sub BorderAndFillColor()
    Dim Rng As Range, Clls As Range
    Dim Dk As Boolean
    Set Rng = [B4].CurrentRegion
    For Each Clls In Rng.Resize(, 1)
      Dk = (Clls <> "")
      With Clls.Resize(, Rng.Columns.Count)
          .Borders(3).Weight = 1
          .Borders(1).Weight = 1
          .Font.Bold = Dk
          .Interior.ColorIndex = -Dk * 28
      End With
    Next Clls
    Rng.BorderAround Weight:=2
End Sub
Giãi thích thêm về thắc mắc của bạn:
1> Set DS = [B4].CurrentRegion: Bạn làm thí nghiệm sẽ biết liền...
a) Mở chức năng record macro lên
b) Đặt con trỏ tại B4, bấm Ctrl + G, chọn Special\CurrentRegion rồi OK... bạn sẽ thấy vùng chọn bao toàn bộ vùng dử liệu
c) Tắt record macro, bấm Alt + F11 xem code viết gì (Cái này gần tương đương với Define name cho vùng dử liệu)
2>
For i = 7 To 12 'ý nghĩa của số 12, số khác có được không?
If i = 7 Or i = 10 Then 'ý nghĩa của số 10 ?
Mấy số từ 7 đến 12 tương ứng với việc kẽ khung bên trái, bên trên, bên dứoi, bên phải, kẽ dọc ở giữa và kẽ ngang ở giữa (đúng 6 mục) Bạn thí nghiệm để biết số nào thuộc về mục nào nhé
3> DS.Resize(, 1) 'không hiểu ?
Resize nói nôm na là mở rông vùng đang có, gần giống với hàm Offset của công thức Excel
 

File đính kèm

Upvote 0
Tiếp tục phát triển và hoàn thiện, với tiêu chí không bằng lòng với những thứ đã làm được... Vậy tal
Thêm 1 cái nữa, Cải tiến tốc độ đáng kể đây!
PHP:
Sub FormatByFind()
 Dim Rng As Range, Clls As Range:         Dim bJ As Byte
  
 For bJ = 1 To 99
   Set Rng = Range("B1:B500").Find(what:=bJ, LookIn:=xlValues)
   If Not Rng Is Nothing Then
      If Clls Is Nothing Then
         Set Clls = Rng.Resize(, 2)
      Else
         Set Clls = Union(Clls, Rng.Resize(, 2))
      End If
   Else:                                  Exit For
   End If
 Next bJ
 With Clls
   .Borders(3).Weight = 1:                .Borders(1).Weight = 1
   .Font.Bold = True:                     .Interior.ColorIndex = 38
 End With
End Sub
 
Upvote 0
Đoạn code này tô màu thì đúng, nhưng kẽ khung thì chưa chính xác sư phụ ơi!
Em xem qua nhưng không biết phải sửa lại như thế nào nữa... Sư phụ ra tay nhé
 
Upvote 0
ndu96081631 đã viết:
Tiếp tục phát triển và hoàn thiện, với tiêu chí không bằng lòng với những thứ đã làm được... Giãi thích thêm về thắc mắc của bạn:
ndu96081631 đã viết:
Cảm ơn các bạn ndu96081631 và bạn HYen17 đã nhiệt tình giúp đỡ, mình sẽ tranh thủ nghiên cứu và thực hành theo hướng dẫn của các bạn (mình chỉ tranh thủ được ngoài giờ hành chính) mình rất muốn tiếp tục theo đuổi chủ đề này nên chắc chắn còn làm phiền các bạn nhiều mong các bạn thông cảm và tiếp tục giúp đỡ. Thaks !!!
 
Lần chỉnh sửa cuối:
Upvote 0
Ah... em sửa được rồi:
PHP:
Sub FormatByFind()
 Dim Rng As Range, TempRng As Range, Clls As Range:         Dim bJ As Byte
 Set Rng = [B4].CurrentRegion
 For bJ = 1 To 99
   Set TempRng = Range("B1:B500").Find(what:=bJ, LookIn:=xlValues)
   If Not TempRng Is Nothing Then
      If Clls Is Nothing Then
         Set Clls = TempRng.Resize(, 2)
      Else
         Set Clls = Union(Clls, TempRng.Resize(, Rng.Columns.Count))
      End If
   Else:                                  Exit For
   End If
 Next bJ
 With Clls
   .Font.Bold = True: .Interior.ColorIndex = 38
 End With
 With Rng
    .Borders(3).Weight = 1: .Borders(1).Weight = 1: .BorderAround Weight:=2
 End With
End Sub
 
Upvote 0
Chạy đưa tốc độ với sư phụ, em dùng Special Cells (chả biết có nhanh hơn không, nhưng cực ngắn)
PHP:
Option Explicit
Sub FormatBySpecial()
  Dim Rng As Range, Clls As Range
  Set Rng = [B4].CurrentRegion
  For Each Clls In Rng.SpecialCells(xlCellTypeConstants, 1)
    With Clls.Resize(, Rng.Columns.Count)
      .Font.Bold = True
      .Interior.ColorIndex = 38
    End With
  Next
  With Rng
    .Borders(3).Weight = 1: .Borders(1).Weight = 1: .BorderAround Weight:=2
 End With
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom