Giải thích dùm em ý nghĩa 1 vài đoạn code (1 người xem)

Liên hệ QC

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

Status
Không mở trả lời sau này.

hondatron

Thành viên mới
Tham gia
14/9/10
Bài viết
49
Được thích
3
Em có đọc đoạn code của 1 anh. Nhưng không hiểu rõ lắm nên nhờ các bạn, các anh giải thích dùm em.
PHP:
Set VungDo = Sheets("DT").Range("C9:C" & Sheets("DT").[C65500].End(xlUp).Row - 18)
[b8:j1000].Clear
PHP:
Ws.Range(Ws.Cells(iDau, 3), Ws.Cells(iDau, 3).End(xlDown)(0)).Resize(, 8).Copy [d10000].End(xlUp).Offset(1, -1)
        [C10000].End(xlUp).Offset(, -1) = Stt + 1
 
Em có đọc đoạn code của 1 anh. Nhưng không hiểu rõ lắm nên nhờ các bạn, các anh giải thích dùm em.
PHP:
Set VungDo = Sheets("DT").Range("C9:C" & Sheets("DT").[C65500].End(xlUp).Row - 18)
[b8:j1000].Clear
Set VungDo = Sheets("DT").Range("C9:C" & Sheets("DT").[C65500].End(xlUp).Row - 18) đây là lệnh gán giá trị cho biến VungDo.
[b8:j1000].Clear là lệnh xóa vùng từ B8:J1000
 
Lần chỉnh sửa cuối:
Upvote 0
Em không hiểu ở đoạn " Sheets("DT").[C65500].End(xlUp).Row - 18" nhất là đoạn .End(xlUp),row-18
 
Upvote 0
Set VungDo = Sheets("DT").Range("C9:C" & Sheets("DT").[C65500].End(xlUp).Row - 18) đây là lệnh gán giá trị cho biến mảng VungDo.
[b8:j1000].Clear là lệnh xóa vùng từ B8:J1000
Biến mảng có dùng Set được không nhỉ?
VungDo là biến đối tượng Range.
Lệnh trên là gán địa chỉ từ C9 đến dòng cuối cùng có dữ liệu - 18 cho biến VungDo.
Ở đây dòng cuối cùng có dữ liệu được xác định bằng phương thức End: Tức là từ C65500 trở lên (xlUp) đến ô chứa dữ liệu, giống như khi mình dùng Ctrl+mũi tên Up.
 
Upvote 0
Em có sưu tầm được trên diễn đàn một đoạn code tô màu ô được chọn(Của bạn NgoaiThanh), em đang học VBA nên chưa hiểu hết ý nghĩa các câu lệnh.
Em muốn nhờ các chị giải thích giúp em ý nghĩa đoạn code sau:

Sub Tomau()
Dim i As Long, n As Long
Application.ScreenUpdating = False
On Error Resume Next
n = ActiveCell
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=ROW()=CELL(""ROW"")"
Selection.FormatConditions(1).Interior.ColorIndex = n
With Selection.FormatConditions(1).Font
.Bold = True
.ColorIndex = n - 3
End With
ActiveCell.Select
Application.ScreenUpdating = True
End Sub
Nhất là đoạn màu đỏ.
Em cảm ơn!
 

File đính kèm

Upvote 0
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=ROW()=CELL(""ROW"")"
Selection.FormatConditions(1).Interior.ColorIndex = n
With Selection.FormatConditions(1).Font
.Bold = True
.ColorIndex = n - 3
End With
Mở và Ghi lại Marco:
Chọn 1 vùng bất kỳ, vào Conditional Formatting > New Rule > User a formular ... và gõ công thức =row()=cell("row") > Format... Fill màu tùy ý > OK > OK > Stop Marco lại > Atl+F11 và xem code.
 
Upvote 0
Mở và Ghi lại Marco:
Chọn 1 vùng bất kỳ, vào Conditional Formatting > New Rule > User a formular ... và gõ công thức =row()=cell("row") > Format... Fill màu tùy ý > OK > OK > Stop Marco lại > Atl+F11 và xem code.
Anh có thể giải thích giúp em ý nghĩa của công thức: =row()=cell("row") không ạ???
 
Upvote 0
Anh có thể giải thích giúp em ý nghĩa của công thức: =row()=cell("row") không ạ???
ROW là Hàm lấy số dòng, CELL("row") là Hàm thông tin với tham số "row", cũng là lấy số dòng. Khi Excel tính toán (Caculation) thì CELL("Row") sẽ cập nhật số dòng mà con trỏ đang đứng. Nếu trong vùng đã chọn cho CF, thì ROW() cũng sẽ trả về số dòng con trỏ đang đứng, khi đó kết quả công thức trên sẽ trả về TRUE.
Trong file trên, có đoạn code trong ThisWorkbook, chèn 1 Name "curRow", chỉ để bảng tính thực hiện Caculation.
Theo tôi hiểu là vậy (có thể diễn giải chưa đúng).
 
Upvote 0
ROW là Hàm lấy số dòng, CELL("row") là Hàm thông tin với tham số "row", cũng là lấy số dòng

Nói chính xác là thế này:
- Hàm ROW() lấy chỉ số dòng tại vị trí chứa công thức (công thức gõ ở đâu thì lấy chỉ số dòng ở đó)
- Hàm CELL("ROW") lấy chỉ số dòng tại nơi ActiveCell (cell đang chọn)
Không phải lúc nào ROW() cũng = CELL("ROW")
Khi con trỏ chuột đặt tại nơi chứa công thức =ROW() thì khi ấy CELL("ROW") sẽ = ROW()
Dựa vào điều này, người ta sẽ dùng nó tô màu cell, dòng, cột gì gì đó tùy ý (HighLight)
 
Upvote 0
Em có sưu tầm được trên diễn đàn một đoạn code tô màu ô được chọn(Của bạn NgoaiThanh), em đang học VBA nên chưa hiểu hết ý nghĩa các câu lệnh.
Em muốn nhờ các chị giải thích giúp em ý nghĩa đoạn code sau:

Sub Tomau()
Dim i As Long, n As Long
Application.ScreenUpdating = False
On Error Resume Next
n = ActiveCell
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=ROW()=CELL(""ROW"")"
Selection.FormatConditions(1).Interior.ColorIndex = n
With Selection.FormatConditions(1).Font
.Bold = True
.ColorIndex = n - 3
End With
ActiveCell.Select
Application.ScreenUpdating = True
End Sub
Nhất là đoạn màu đỏ.
Em cảm ơn!
Trong các dòng bôi đỏ thì câu thứ nhất các thày đã giải thích cho bạn rồi. Câu thứ 2 cho màu nền, câu thứ 3 cho mầu chữ .
Ví dụ : Tại ô hiện hành bạn gõ số 6 rồi đặt chuột vào nó và chạy code thì mầu nền là mầu vàng (6) và màu chữ sẽ là mầu đỏ ( 6-3 = 3 ).Bạn có thể tự khảo sát các mầu khác .
 
Upvote 0
Trong các dòng bôi đỏ thì câu thứ nhất các thày đã giải thích cho bạn rồi. Câu thứ 2 cho màu nền, câu thứ 3 cho mầu chữ .
Ví dụ : Tại ô hiện hành bạn gõ số 6 rồi đặt chuột vào nó và chạy code thì mầu nền là mầu vàng (6) và màu chữ sẽ là mầu đỏ ( 6-3 = 3 ).Bạn có thể tự khảo sát các mầu khác .
Cảm ơn tác giả. Cho mình hỏi thêm ý nghĩa của thủ tục ở trong workbook với. Tại sao phải có thủ tục này?
 
Upvote 0
Cảm ơn tác giả. Cho mình hỏi thêm ý nghĩa của thủ tục ở trong workbook với. Tại sao phải có thủ tục này?
Thực ra kiến thức mình học các thày và các bạn thôi, kiến thức của mình chỉ có tí tẹo trong đó thôi . Thủ tục trong worbook nôm na là ( nếu code để tại Module thì khi chạy sub highlight các sheet khác trong worbook đều highlight được ).
 
Upvote 0
Nói chính xác là thế này:
- Hàm ROW() lấy chỉ số dòng tại vị trí chứa công thức (công thức gõ ở đâu thì lấy chỉ số dòng ở đó)
- Hàm CELL("ROW") lấy chỉ số dòng tại nơi ActiveCell (cell đang chọn)
Không phải lúc nào ROW() cũng = CELL("ROW")
Khi con trỏ chuột đặt tại nơi chứa công thức =ROW() thì khi ấy CELL("ROW") sẽ = ROW()
Dựa vào điều này, người ta sẽ dùng nó tô màu cell, dòng, cột gì gì đó tùy ý (HighLight)
Nhờ thầy và các bạn giải thích hộ em tại sao trong workbook lại phải có đoạn code này thì thủ tục highlight mới hoạt động đươc.(Nhờ thầy giải thích giúp em hiểu ý nghĩa của đoạn code trong workbook này với ạ!)
Đây là thủ tục trong workbook

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
ActiveWorkbook.Names.Add Name:="curRow", RefersToR1C1:="=1"
End Sub
Private Sub Workbook_Open()
Call Tomau
End Sub

Đây là thủ tục trong modul

Sub Tomau()
Dim i As Long, n As Long
Application.ScreenUpdating = False
On Error Resume Next
n = ActiveCell
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=ROW()=CELL(""ROW"")"
Selection.FormatConditions(1).Interior.ColorIndex = n
With Selection.FormatConditions(1).Font
.Bold = True
.ColorIndex = n - 3
End With
ActiveCell.Select
Application.ScreenUpdating = True
End Sub
 

File đính kèm

Upvote 0
Em chưa hiểu ý nghĩa của đoạn code này ạ!

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
ActiveWorkbook.Names.Add Name:="curRow", RefersToR1C1:="=1"
End Sub

Mong thầy ndu và các bạn giúp đỡ.
 
Upvote 0
Em chưa hiểu ý nghĩa của đoạn code này ạ!

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
ActiveWorkbook.Names.Add Name:="curRow", RefersToR1C1:="=1"
End Sub

Mong thầy ndu và các bạn giúp đỡ.

SelectionChange chắc bạn hiểu rồi? Code bên trong nó sẽ hoạt động khi bạn chọn cell nào đó
Vấn đề ở đây là: Nếu không có code này, khi chọn 1 cell, bắt buộc bạn phải bấm F9 nó mới cập nhật màu sắc (thí nghiệm sẽ biết)
Vậy nên trong trường hợp này, code SelectionChange chỉ có tác dụng là tạo 1 sự thay đổi gì đó trên sheet để cho màu sắc thay đổi theo.
Thay đổi cái gì là tùy ý bạn, chẳng hạn có thể thay đoạn:
Mã:
ActiveWorkbook.Names.Add Name:="curRow", RefersToR1C1:="=1"
thành:
Mã:
Application.ScreenUpdating = True
cũng hoàn toàn không có vấn đề
Ở đây người ta thay đổi bằng cách TẠO NAME. Vậy name này không có tác dụng tính toán, chỉ có tác dụng tương đương với việc ta bấm F9 mà thôi
--------------
Từ đây suy ra rằng:
- Giải pháp chủ lực để thay đổi màu là công thức trong Conditional Formating: =ROW()=CELL("ROW")
- Dù không có bất cứ code nào, màu sắc vẫn có thể thay đổi, chỉ cần bạn nhấn F9 khi di chuyển cell
 
Upvote 0
Có nhiều cách để làm sao trong trường hợp này tác giả lại chọn cách phức tạp là tạo name nhỉ, em đã thử thay đoạn code của thầy:
Application.ScreenUpdating = True
và thấy rất oke và với người mới học VBA như em thì thấy rất dễ hiểu ạ!
Em cảm ơn thầy!

Nhờ thấy ndu giải thích giúp em ý nghĩa 2 biến (tô màu đỏ)khai báo trong thủ tục nữa ạ!
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
ActiveWorkbook.Names.Add Name:="curRow", RefersToR1C1:="=1"
End Sub
Em vẫn chưa hiểu ý nghĩa và tác dụng của nó.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Có nhiều cách để làm sao trong trường hợp này tác giả lại chọn cách phức tạp là tạo name nhỉ, em đã thử thay đoạn code của thầy:
Application.ScreenUpdating = True
và thấy rất oke và với người mới học VBA như em thì thấy rất dễ hiểu ạ!
Em cảm ơn thầy!

Nhờ thấy ndu giải thích giúp em ý nghĩa 2 biến (tô màu đỏ)khai báo trong thủ tục nữa ạ!
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
ActiveWorkbook.Names.Add Name:="curRow", RefersToR1C1:="=1"
End Sub
Em vẫn chưa hiểu ý nghĩa và tác dụng của nó.
2 biến đó là 2 biến mặc định của sự kiện Workbook_SheetSelectionChange, bạn muốn bỏ nó đi cũng không được. Biến Sh và biến Target được hiểu là sheet và ô/vùng đang chọn.
Chẳng hạn với sự kiện này, bạn đang chọn vùng A1:B10 trên Sheet1 thì Sh chính là Sheets("Sheet1") và Target chính là
Sheets("Sheet1").[A1:B10]

Thông thường người ta hay dựa vào 2 biến này để quyết định việc có thực hiện code hay không.
 
Upvote 0
2 biến đó là 2 biến mặc định của sự kiện Workbook_SheetSelectionChange, bạn muốn bỏ nó đi cũng không được. Biến Sh và biến Target được hiểu là sheet và ô/vùng đang chọn.
Chẳng hạn với sự kiện này, bạn đang chọn vùng A1:B10 trên Sheet1 thì Sh chính là Sheets("Sheet1") và Target chính là
Sheets("Sheet1").[A1:B10]

Thông thường người ta hay dựa vào 2 biến này để quyết định việc có thực hiện code hay không.
Ra là vậy, chả trách em thử bỏ đi 2 biến này thì code không hoạt động được nữa, trong khi thấy có khai báo mà không nhìn thấy sử dụng nó trong thủ tục nên thấy khó hiểu. Em cảm ơn anh ạ!
Ngoài sự kiện Workbook_SheetSelectionChange em thấy còn có sự kiện worksheet_selectionchange(Byval Taget as Range) . Em nghĩ 2 sự kiện này giống nhau nhưng em thử thì code không hoạt động được, anh có thể giải thích giúp em không ạ???
 
Upvote 0
Ra là vậy, chả trách em thử bỏ đi 2 biến này thì code không hoạt động được nữa, trong khi thấy có khai báo mà không nhìn thấy sử dụng nó trong thủ tục nên thấy khó hiểu. Em cảm ơn anh ạ!
Ngoài sự kiện Workbook_SheetSelectionChange em thấy còn có sự kiện worksheet_selectionchange(Byval Taget as Range) . Em nghĩ 2 sự kiện này giống nhau nhưng em thử thì code không hoạt động được, anh có thể giải thích giúp em không ạ???
Về ý nghĩa thì 2 thủ tục này có tác dụng như nhau, tuy nhiên, thủ tục Worksheet_SelectionChange được đặt trong đối tượng Sheet và chỉ có tác dụng riêng với sheet chứa code, còn thủ tục Workbook_SheetSelectionChange được đặt trong đối tượng ThisWorkbook và có thể tác động đến tất cả các sheet có trong workbook này. Cũng chính vì vậy mà thủ tục Workbook_SheetSelectionChange còn có thêm tham số Sh để người dùng có thể tùy biến các sheet chịu tác động của code.
 
Upvote 0
Cũng chính vì vậy mà thủ tục Workbook_SheetSelectionChange còn có thêm tham số Sh để người dùng có thể tùy biến các sheet chịu tác động của code.
Anh ơi ví dụ em tùy biến như sau có được không ạ:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Sh=sheet1
ActiveWorkbook.Names.Add Name:="curRow", RefersToR1C1:="=1"

End Sub
Lúc này chỉ có sheet 1 chịu tác động đúng không anh?
Em đang test thử.
 
Upvote 0
Anh ơi ví dụ em tùy biến như sau có được không ạ:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Sh=sheet1
ActiveWorkbook.Names.Add Name:="curRow", RefersToR1C1:="=1"

End Sub
Lúc này chỉ có sheet 1 chịu tác động đúng không anh?
Em đang test thử.
Với các biến đối tượng (Object) hay biến Range bạn phải SET chứ không thể để Sh=Sheet1 vậy được, mà phải là như vầy: Set Sh = Sheet1
 
Lần chỉnh sửa cuối:
Upvote 0
Anh ơi ví dụ em tùy biến như sau có được không ạ:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Sh=sheet1
ActiveWorkbook.Names.Add Name:="curRow", RefersToR1C1:="=1"

End Sub
Trước hết thì câu lệnh Sh=sheet1 là sai cú pháp, vì biến Sh không thể gán bằng câu lệnh này được, nó phải có dạng Set Sh=Sheet1 hoặc đại loại như thế.

Thứ 2, với sự kiện này thì bạn không thể gán cho tham số Sh được, vì tham số này sẽ tự nó được gán cho sheet đang chọn.

Thứ 3, theo tôi hiểu thì bạn đang muốn quy định nếu chọn sheet1 thì sẽ chạy câu lệnh phía dưới. Như vậy thì bạn phải sửa thế này:
If Sh.Name=Sheet1.Name Then ... hoặc If Sh.Name="ABC" Then ...

Nếu bạn muốn code chỉ có tác động với các sheet: Sheet1, Sheet3, Sheet7, Sheet10 thì bạn làm như sau:
If Instr(".Sheet1.Sheet3.Sheet7.Sheet10.","." & Sh.Name & ".")>0 Then ...
 
Upvote 0
Với các biến đối tượng (Object) hay biến Range bạn phải SET chứ không thể để Sh=Sheet1 vậy được, mà phải là như vầy: Set Sh = Sheet1

Khi đã Set Sh rồi thì thay Sh cho ActiveWorkbook.
Em đã thử đoạn code sau trong workbook nhưng sheet1 vẫn chịu tác động anh ạ.
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Set Sh = Sheet2
ActiveWorkbook.Names.Add Name:="curRow", RefersToR1C1:="=1"
End Sub
 
Upvote 0
Em đã thử đoạn code sau trong workbook nhưng sheet1 vẫn chịu tác động anh ạ.
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Set Sh = Sheet2
ActiveWorkbook.Names.Add Name:="curRow", RefersToR1C1:="=1"
End Sub
Bạn xem lại bài trả lời phía trên của tôi nhé.
 
Upvote 0
Trước hết thì câu lệnh Sh=sheet1 là sai cú pháp, vì biến Sh không thể gán bằng câu lệnh này được, nó phải có dạng Set Sh=Sheet1 hoặc đại loại như thế.

Thứ 2, với sự kiện này thì bạn không thể gán cho tham số Sh được, vì tham số này sẽ tự nó được gán cho sheet đang chọn.

Thứ 3, theo tôi hiểu thì bạn đang muốn quy định nếu chọn sheet1 thì sẽ chạy câu lệnh phía dưới. Như vậy thì bạn phải sửa thế này:
If Sh.Name=Sheet1.Name Then ... hoặc If Sh.Name="ABC" Then ...

Nếu bạn muốn code chỉ có tác động với các sheet: Sheet1, Sheet3, Sheet7, Sheet10 thì bạn làm như sau:
If Instr(".Sheet1.Sheet3.Sheet7.Sheet10.","." & Sh.Name & ".")>0 Then ...
Chính xác ý em là như vậy đó anh!
Nếu như mình muốn cho nhiều hơn 1 sheet cùng hoạt động thì code phải sửa thế nào anh? (ví dụ sheet2 và sheet3) chẳng hạn.
 
Upvote 0
Chính xác ý em là như vậy đó anh!
Nếu như mình muốn cho nhiều hơn 1 sheet cùng hoạt động thì code phải sửa thế nào anh? (ví dụ sheet2 và sheet3) chẳng hạn.
Nhờ admin xóa dùm bài này, do mình chưa đọc kĩ bài của anh nghiaphuc.
Thành thật xin lỗi anh!
 
Upvote 0
Thứ 3, theo tôi hiểu thì bạn đang muốn quy định nếu chọn sheet1 thì sẽ chạy câu lệnh phía dưới. Như vậy thì bạn phải sửa thế này:
If Sh.Name=Sheet1.Name Then ... hoặc If Sh.Name="ABC" Then ...

Nếu bạn muốn code chỉ có tác động với các sheet: Sheet1, Sheet3, Sheet7, Sheet10 thì bạn làm như sau:
If Instr(".Sheet1.Sheet3.Sheet7.Sheet10.","." & Sh.Name & ".")>0 Then ...
Em đã test thử và rất oke anh ạ! Cảm ơn anh và các thầy!
 
Upvote 0
Em đã test thử và rất oke anh ạ! Cảm ơn anh và các thầy!
Lưu ý một chút là trong câu lệnh này, tôi sử dụng hàm Instr, trong đó, tôi có để các dấu chấm phân cách các tên sheet. Việc này là cần thiết vì nếu không có thì có thể xảy ra trường hợp bạn muốn Sheet10 chịu tác động của code nhưng thực tế thì Sheet1 cũng chịu tác động vì Sheet1 có chứa trong chuỗi Sheet10.

Nếu bạn chỉ muốn code tác động trong một số ít sheet thì có thể dùng phép toán Or thay vì hàm Instr cũng được. Chẳng hạn, bạn chỉ muốn code tác động với Sheet2 và Sheet4 thì bạn có thể làm thế này: If Sh.Name="Sheet2" Or Sh.Name="Sheet4" Then ...
 
Upvote 0
Anh ơi ví dụ em tùy biến như sau có được không ạ:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Sh=sheet1
ActiveWorkbook.Names.Add Name:="curRow", RefersToR1C1:="=1"

End Sub
Lúc này chỉ có sheet 1 chịu tác động đúng không anh?
Em đang test thử.

Không phải.
Sh là "thông tin" bạn được Excel cung cấp. Không phải tùy biến kiểu ấy.

Giả sử bạn muốn có thông báo khi trên mỗi sheet có sự lựa chọn - SelectionChange.
Cái tùy biến của bạn có thể thế này - tùy nhu cầu thực của bạn, ở đây chỉ là vd.

Mã:
Nếu user thay đổi lựa chọn trên sheet1 thì tôi chạy code "nấu cơm", nếu là trên sheet2 
thì tôi sẽ chạy code "nấu cháo" còn nếu trên sheet3 thì chạy code "đi ăn phở".

Khi user thay đổi lựa chọn trên sheet bất kỳ thì thì "người ta" sẽ tóm cổ Sub Workbook_SheetSelectionChange và bắt nó chạy, và người ta cũng truyền vào Sub đó 2 thông số là Sh và Target, tức nói nôm na là "người ta" cung cấp 2 thông tin: Sh, tức user thay đổi lựa chọn trên sheet nào, và Target, tức trên sheet "nọ" thì user chọn cell nào.

Lúc đó thì tùy biến code có dạng (có 3 sheet là Sheet1, Sheet2, Sheet3 với tên tương ứng trong VBE là mysh1, mysh2, mysh3 - tức các WorkSheet.CodeName)

Mã:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'    Select Case Sh.Name
'        Case "Sheet1": "nấu cơm"
'        Case "Sheet2": "nấu cháo"
'        Case "Sheet3": "đi ăn phở"
'    End Select

    If Sh Is mysh1 Then
        "nấu cơm"
    ElseIf Sh Is mysh2 Then
        "nấu cháo"
    Else
        "đi ăn phở"
    End If
End Sub

Ngoài ra nếu là Object thì phải dùng SET ...
 
Lần chỉnh sửa cuối:
Upvote 0
Không phải.
Sh là "thông tin" bạn được Excel cung cấp. Không phải tùy biến kiểu ấy.

Giả sử bạn muốn có thông báo khi trên mỗi sheet có sự lựa chọn - SelectionChange.
Cái tùy biến của bạn có thể thế này - tùy nhu cầu thực của bạn, ở đây chỉ là vd.

Mã:
Nếu user thay đổi lựa chọn trên sheet1 thì tôi chạy code "nấu cơm", nếu là trên sheet2 
thì tôi sẽ chạy code "nấu cháo" còn nếu trên sheet3 thì chạy code "đi ăn phở".

Khi user thay đổi lựa chọn trên sheet bất kỳ thì thì "người ta" sẽ tóm cổ Sub Workbook_SheetSelectionChange và bắt nó chạy, và người ta cũng truyền vào Sub đó 2 thông số là Sh và Target, tức nói nôm na là "người ta" cung cấp 2 thông tin: Sh, tức user thay đổi lựa chọn trên sheet nào, và Target, tức trên sheet "nọ" thì user chọn cell nào.

Lúc đó thì tùy biến code có dạng (có 3 sheet là Sheet1, Sheet2, Sheet3 với tên tương ứng trong VBE là mysh1, mysh2, mysh3 - tức các WorkSheet.CodeName)

Mã:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'    Select Case Sh.Name
'        Case "Sheet1": "nấu cơm"
'        Case "Sheet2": "nấu cháo"
'        Case "Sheet3": "đi ăn phở"
'    End Select

    If Sh Is mysh1 Then
        "nấu cơm"
    ElseIf Sh Is mysh2 Then
        "nấu cháo"
    Else
        "đi ăn phở"
    End If
End Sub

Ngoài ra nếu là Object thì phải dùng SET ...
Một phương pháp giảng dạy với ngôn ngữ rất mộc mạc, giản dị nhưng rất dễ hiểu. Cảm ơn thầy, có lẽ em sẽ học phương pháp này của thầy trong những giờ giảng của em!
 
Upvote 0
Có nhiều cách để làm sao trong trường hợp này tác giả lại chọn cách phức tạp là tạo name nhỉ, em đã thử thay đoạn code của thầy:
Application.ScreenUpdating = True
và thấy rất oke và với người mới học VBA như em thì thấy rất dễ hiểu ạ!
Em cảm ơn thầy!
Có thể nhiều người thấy người ta làm sao thì làm vậy mà không rõ nguyên nhân.
Chỉ có những ai thường xuyên dùng đến mấy cái HighLight này mới biết!
Nếu bạn dùng Application.ScreenUpdating = True thì bạn sẽ thấy màn hình hơi "giật giật" mỗi khi di chuyển cell (nhất là dữ liệu trong bảng tính lớn) trong khi dùng cách tạo name lại không bị hiện tượng này
 
Upvote 0
Có thể nhiều người thấy người ta làm sao thì làm vậy mà không rõ nguyên nhân.
Chỉ có những ai thường xuyên dùng đến mấy cái HighLight này mới biết!
Nếu bạn dùng Application.ScreenUpdating = True thì bạn sẽ thấy màn hình hơi "giật giật" mỗi khi di chuyển cell (nhất là dữ liệu trong bảng tính lớn) trong khi dùng cách tạo name lại không bị hiện tượng này
Cám ơn thày ! thực ra khi bị bạn "cu mì" phê bình code chạy bị giật, nhà em mất hàng tháng mới khắc phục được nhược điểm này .
 
Lần chỉnh sửa cuối:
Upvote 0
Nhân tiện có topic mới được mở ra, em nhờ các anh, các chú xem giúp vấn đề đoạn code em đang viết.
Mục đích của đoạn code này là copy dữ liệu có ký tự đầu là 01/03. Sau đó copy sang 1 sheet khác.
PHP:
Public Sub LocHoai()
'* Khai báo kieu du lieu
Dim DuLieu, VungDo, Cll, Wf, Ws, 
Dim giatri As String

Application.ScreenUpdating = False
Set Wf = Application.WorksheetFunction
Set Ws = Sheets("tonghop2014")
Set VungDo = Sheets("GPE").[a16:a27]
Set DuLieu = Ws.Range(Ws.[c2], Ws.[c40000].End(xlUp))
i = 16
      For Each Cll In DuLieu

'------------------------------------------------------------------
       If Range("d15").Value = Wf.Left(Cll, 5) Then Cll.Value = VungDo.Range("i+1,a").Value 
hiện tại chỗ này em đang sai
'------------------------------------------------------------

   Next Cll
  
 Application.ScreenUpdating = True
End Sub
 

File đính kèm

Upvote 0
Nhân tiện có topic mới được mở ra, em nhờ các anh, các chú xem giúp vấn đề đoạn code em đang viết.
Mục đích của đoạn code này là copy dữ liệu có ký tự đầu là 01/03. Sau đó copy sang 1 sheet khác.
PHP:
Public Sub LocHoai()
'* Khai báo kieu du lieu
Dim DuLieu, VungDo, Cll, Wf, Ws, 
Dim giatri As String

Application.ScreenUpdating = False
Set Wf = Application.WorksheetFunction
Set Ws = Sheets("tonghop2014")
Set VungDo = Sheets("GPE").[a16:a27]
Set DuLieu = Ws.Range(Ws.[c2], Ws.[c40000].End(xlUp))
i = 16
      For Each Cll In DuLieu

'------------------------------------------------------------------
       If Range("d15").Value = Wf.Left(Cll, 5) Then Cll.Value = VungDo.Range("i+1,a").Value 
hiện tại chỗ này em đang sai
'------------------------------------------------------------

   Next Cll
  
 Application.ScreenUpdating = True
End Sub
Khai báo biến cũng cho rõ ràng kiểu dữ liệu một chút bạn ơi, tôi giúp bạn theo nội dung file thôi, việc còn lại bạn tự làm nhé!

Mã:
Public Sub LocHoai()
    '* Khai báo kieu du lieu
    Dim Ws As Worksheet
    Dim giatri As String
    Dim DuLieu As Range, VungDo As Range, Cll As Range
    
    Application.ScreenUpdating = False
    
    
    Set Ws = Sheets("tonghop2014")
    Set VungDo = Sheets("GPE").[a16:a27]
    Set DuLieu = Range(Ws.[c2], Ws.[c40000].End(xlUp))
    
    For Each Cll In DuLieu
        If Ws.Range("d15").Value = Left(Cll, 5) Then
            i = i + 1
            VungDo(i) = Cll
            ''Ma NDKT:
            VungDo(i, 14) = Cll.Offset(, 1)
        End If
    Next Cll
  
 Application.ScreenUpdating = True
End Sub
 
Upvote 0
Em cảm ơn Thầy Hoàng Trọng Nghĩa, không có sự giúp đỡ của thầy thực sự em không biết làm sao sửa với kiến thức về vba còn yếu như của em.
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi thêm 1 chút về đoạn code.
PHP:
Public Sub LocHoa()
    '* Khai báo kieu du lieu
    Dim Ws As Worksheet
    Dim giatri As String
    Dim DuLieu As Range, VungDo As Range, Cll As Range
    Dim i As Integer
    
    Application.ScreenUpdating = False
    
    
    Set Ws = Sheets("tonghop2014")
    Set VungDo = Sheets("GPE").[a16:a27]
    Set DuLieu = Range(Ws.[c2], Ws.[c40000].End(xlUp))
    
    For Each Cll In DuLieu
        If Ws.Range("A2").Value = Left(Cll, 5) Then
            i = i + 1
            VungDo(i) = Right(Cll, Len(Cll) - 6)
            ''Ma NDKT:
            VungDo(i, 14) = Cll.Offset(, 1)
            '' Thanh toan cho DV:
            VungDo(i, 33) = Cll.Offset(, 2)
        End If
    Next Cll
  
 Application.ScreenUpdating = True


' Các sub em đã làm thường thì để chạy em đặt như ở dưới, nhưng trong đây có nhiều hơn 1 giá trì thì em không biết sử lý ntn!
 LocHoa = VungDo
End Sub

Đoạn code của thầy em đã hiểu các bước hoạt động, giờ em muốn thêm 1 chút nhỏ để khi em thay đổi giá trị ô D15 trong đoạn code :
Ws.Range("d15").Value thì kết quả tự nhảy luôn không phải thông qua bước alt+11 thì mình làm sao vậy thầy
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi thêm 1 chút về đoạn code.
PHP:
Public Sub LocHoa()
    '* Khai báo kieu du lieu
    Dim Ws As Worksheet
    Dim giatri As String
    Dim DuLieu As Range, VungDo As Range, Cll As Range
    Dim i As Integer
    
    Application.ScreenUpdating = False
    
    
    Set Ws = Sheets("tonghop2014")
    Set VungDo = Sheets("GPE").[a16:a27]
    Set DuLieu = Range(Ws.[c2], Ws.[c40000].End(xlUp))
    
    For Each Cll In DuLieu
        If Ws.Range("A2").Value = Left(Cll, 5) Then
            i = i + 1
            VungDo(i) = Right(Cll, Len(Cll) - 6)
            ''Ma NDKT:
            VungDo(i, 14) = Cll.Offset(, 1)
            '' Thanh toan cho DV:
            VungDo(i, 33) = Cll.Offset(, 2)
        End If
    Next Cll
  
 Application.ScreenUpdating = True


' Các sub em đã làm thường thì để chạy em đặt như ở dưới, nhưng trong đây có nhiều hơn 1 giá trì thì em không biết sử lý ntn!
 LocHoa = VungDo
End Sub

Đoạn code của thầy em đã hiểu các bước hoạt động, giờ em muốn thêm 1 chút nhỏ để khi em thay đổi giá trị ô D15 trong đoạn code :
Ws.Range("d15").Value thì kết quả tự nhảy luôn không phải thông qua bước alt+11 thì mình làm sao vậy thầy


Bạn đặt trong Sheet Module của sheet TongHop2014 thủ tục sau:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$D$15" And Target.Value > "" Then
        Call LocHoai
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thưa các anh, thầy xem dùm em đoạn merge clearcontents ở dưới giúp em với. Mục đích của em là clear ở sheet GPE nhưng không biết vì sao nó xoá luôn các vùng ở bên sheet tonghop2014.
Y thứ 2 em muốn nhờ Thầy Hoàng xem giúp em đoạn code.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$2" And Target.Value > "" Then
        Call LocHoa
    End If
End Sub
Đoạn code của thầy đúng rồi thầy ah nhưng khi em đưa vào file này thì bị báo lỗi 13 type mismatch. Nhưng để file khác thì chạy vô tư. Em nghi file này có liên quan vấn đề merge clearcontent. Bởi em bỏ nó đi thì chạy tốt.

PHP:
Public Sub LocHoa()
    '* Khai báo kieu du lieu
    Dim Ws As Worksheet
    Dim WsGPE As Worksheet
    Dim giatri As String
    Dim DuLieu As Range, VungDo As Range, Cll As Range
    
    Dim i As Integer
    
    Application.ScreenUpdating = False
    
    
    Set Ws = Sheets("tonghop2014")
    Set VungDo = Sheets("GPE").[a16:a27]
    Set DuLieu = Range(Ws.[c2], Ws.[c40000].End(xlUp))
     '---- Xoá dứ liệu vùng merge -----------
    Application.Goto Reference:=Sheets("GPE").[a16:p27,ad16:ai27]
    Selection.ClearContents
   '---------------------------------- 
        For Each Cll In DuLieu
        If Ws.Range("A2").Value = Left(Cll, 5) Then
            i = i + 1
            VungDo(i) = Right(Cll, Len(Cll) - 6)
            ''Ma NDKT:
            VungDo(i, 14) = Cll.Offset(, 1)
            '' Thanh toan cho DV:
            VungDo(i, 33) = Cll.Offset(, 2)
        End If
    Next Cll
  Application.ScreenUpdating = True

End Sub

p/s vì lý do công việc nên thông tin trong file excell em có bỏ bớt đi.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thưa các anh, thầy xem dùm em đoạn merge clearcontents ở dưới giúp em với. Mục đích của em là clear ở sheet GPE nhưng không biết vì sao nó xoá luôn các vùng ở bên sheet tonghop2014.
Y thứ 2 em muốn nhờ Thầy Hoàng xem giúp em đoạn code.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$2" And Target.Value > "" Then
        Call LocHoa
    End If
End Sub
Đoạn code của thầy đúng rồi thầy ah nhưng khi em đưa vào file này thì bị báo lỗi 13 type mismatch. Nhưng để file khác thì chạy vô tư. Em nghi file này có liên quan vấn đề merge clearcontent. Bởi em bỏ nó đi thì chạy tốt.

PHP:
Public Sub LocHoa()
    '* Khai báo kieu du lieu
    Dim Ws As Worksheet
    Dim WsGPE As Worksheet
    Dim giatri As String
    Dim DuLieu As Range, VungDo As Range, Cll As Range
    
    Dim i As Integer
    
    Application.ScreenUpdating = False
    
    
    Set Ws = Sheets("tonghop2014")
    Set VungDo = Sheets("GPE").[a16:a27]
    Set DuLieu = Range(Ws.[c2], Ws.[c40000].End(xlUp))
     '---- Xoá dứ liệu vùng merge -----------
    Application.Goto Reference:=Sheets("GPE").[a16:p27,ad16:ai27]
    Selection.ClearContents
   '---------------------------------- 
        For Each Cll In DuLieu
        If Ws.Range("A2").Value = Left(Cll, 5) Then
            i = i + 1
            VungDo(i) = Right(Cll, Len(Cll) - 6)
            ''Ma NDKT:
            VungDo(i, 14) = Cll.Offset(, 1)
            '' Thanh toan cho DV:
            VungDo(i, 33) = Cll.Offset(, 2)
        End If
    Next Cll
  Application.ScreenUpdating = True

End Sub

p/s vì lý do công việc nên thông tin trong file excell em có bỏ bớt đi.


Tôi đã sửa lại như sau:

1) Với sheet GPE tôi đặt lại tên MauC2

2) Với code trong sheet TongHop2014, tôi sửa lại như sau:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$2" Then
        Call LocHoa
    End If
End Sub

Vì tôi nghĩ lại, nếu xóa điều kiện thì nội dung của MauC2 cũng phải được xóa.

3) Code LocHoa tôi sửa lại cho bạn như sau:

Mã:
Public Sub LocHoa()
    '* Khai báo kieu du lieu
    
    Dim i As Integer
    Dim Ws As Worksheet
    Dim DieuKien As String
    Dim DuLieu As Range, VungDo As Range, Cll As Range
    
    Set Ws = Sheets("TongHop2014")
    Set VungDo = Sheets("MauC2").Range("A16:A27")
    Set DuLieu = Range(Ws.Range("C2"), Ws.Range("C40000").End(xlUp))
    
    Application.ScreenUpdating = False
    
    [COLOR=#ff0000]VungDo.Resize(, 35).ClearContents[/COLOR]

[COLOR=#0000ff]    DieuKien = Ws.Range("A2").Value[/COLOR]
    
[COLOR=#0000ff]    If Len(DieuKien) = 0 Then[/COLOR]
[COLOR=#0000ff]        Application.ScreenUpdating = True[/COLOR]
[COLOR=#0000ff]        Exit Sub[/COLOR]
[COLOR=#0000ff]    End If[/COLOR]
    
    For Each Cll In DuLieu
        If [COLOR=#0000ff]Left(Cll, 5) = DieuKien[/COLOR] Then
            i = i + 1
            VungDo(i) = Right(Cll, Len(Cll) - 6)
            ''Ma NDKT:
            VungDo(i, 14) = Cll.Offset(, 1)
            '' Thanh toan cho DV:
            VungDo(i, 33) = Cll.Offset(, 2)
        End If
    Next Cll
    
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
Mã:
For Each Cll In DuLieu
        If Left(Cll, 5) = DieuKien Then
            i = i + 1
            VungDo(i) = Right(Cll, Len(Cll) - 6)
            ''Ma NDKT:
            VungDo(i, 14) = Cll.Offset(, 1)
            '' Thanh toan cho DV:
            VungDo(i, 33) = Cll.Offset(, 2)
         [COLOR=#0000ff]   Ws.Range("AM40").Value = Cll(1).Offset(, 3).Value[/COLOR]
        End If
  Next Cll

Thầy cho em hỏi thêm 1 chút, em muốn lấy giá trị 1 phần tử offset(,3) từ cll có i=1. Nhờ thầy định hướng giúp em với ah.
 
Upvote 0
Mã:
For Each Cll In DuLieu
        If Left(Cll, 5) = DieuKien Then
            i = i + 1
            VungDo(i) = Right(Cll, Len(Cll) - 6)
            ''Ma NDKT:
            VungDo(i, 14) = Cll.Offset(, 1)
            '' Thanh toan cho DV:
            VungDo(i, 33) = Cll.Offset(, 2)
         [COLOR=#0000ff]   Ws.Range("AM40").Value = Cll(1).Offset(, 3).Value[/COLOR]
        End If
  Next Cll

Thầy cho em hỏi thêm 1 chút, em muốn lấy giá trị 1 phần tử offset(,3) từ cll có i=1. Nhờ thầy định hướng giúp em với ah.
Bạn nên nhớ, Ws.Range("AM40") chính là Sheets("TongHop2014").Range("AM40") đó nhé.

Vậy cụ thể, bạn muốn gán giá trị gì ở ô này?
 
Upvote 0
Bên dưới em có gửi file đính kèm, em muốn lấy giá trị ô Đơn vị thụ hưởng trong sheet "tonghop" sang ô Đơn vị thụ hưởng của sheet GPE.
 

File đính kèm

Upvote 0
Bên dưới em có gửi file đính kèm, em muốn lấy giá trị ô Đơn vị thụ hưởng trong sheet "tonghop" sang ô Đơn vị thụ hưởng của sheet GPE.
Đúng là thực tế một đằng, code ở bài vừa rồi một nẽo! Rút kinh nghiệm lần sau bạn phải nói rõ yêu cầu hơn trong khi gửi bài nha bạn!

Mã:
Public Sub LocTheoDieuKien()
    '* Khai báo kieu du lieu
    
    Dim i As Integer
    Dim Ws As Worksheet
    Dim DieuKien As String
    Dim VungDuLieu As Range, VungKetQua As Range, Cll As Range
    
    Set Ws = Sheets("TongHop2014")
    Set VungKetQua = Sheets("MauC2").Range("A16:A27")
    Set VungDuLieu = Range(Ws.Range("C2"), Ws.Range("C40000").End(xlUp))
    
    Application.ScreenUpdating = False
    
    VungKetQua.Resize(, 35).ClearContents
    DieuKien = Ws.Range("A2").Value
    
    If Trim(DieuKien) = "" Then
        Application.ScreenUpdating = True
        Exit Sub
    End If
    
    For Each Cll In VungDuLieu
        If Left(Cll, 5) = DieuKien Then
            i = i + 1
            VungKetQua(i) = Right(Cll, Len(Cll) - 6)
            ''Ma NDKT:
            VungKetQua(i, 14) = Cll.Offset(, 1)
            ''Thanh toan cho DV:
            VungKetQua(i, 33) = Cll.Offset(, 2)
[COLOR=#0000ff]            ''Don vi thu huong:[/COLOR]
[COLOR=#0000ff]            If i = 1 Then[/COLOR]
[COLOR=#0000ff]                Sheets("MauC2").Range("F39") = Cll.Offset(, 3)[/COLOR]
[COLOR=#0000ff]            End If[/COLOR]
        End If
    Next Cll
    
    Application.ScreenUpdating = True
End Sub
 

File đính kèm

Upvote 0
Em cảm ơn thầy, em xin rút kinh nghiệm lần sau. Nhìn code của thầy viết sao dễ thế mà em nghĩ hoài cũng hem ra. Đúng là em còn ít kinh nghiệm về VBA quá chứ chưa nói gì đến lập trình.
 
Lần chỉnh sửa cuối:
Upvote 0
6.14 Am, Chào ngày mới. Chúc gia đình GPE 1 ngày hạnh phúc.

Sau em có 1 câu hỏi nhỏ nhờ các Thầy và các bạn chỉ dùm mình.
Mã:
Public Sub LocHoa()
    '* Khai báo kieu du lieu
    
    Dim i As Integer
    Dim Ws As Worksheet
    Dim DieuKien As String
    Dim DuLieu As Range, VungDo As Range, Cll As Range, VungXoa As Range, temp As Range
    Dim Rws As Long
    Set Ws = Sheets("TongHop2014")
    Set VungDo = Sheets("MauC2").Range("A16:A27")
    Set VungXoa = Sheets("MauC2").Range("AG16:AI27")
    Set DuLieu = Range(Ws.Range("C2"), Ws.Range("C40000").End(xlUp))
    
    Application.ScreenUpdating = False
    
    VungDo.Resize(, 16).ClearContents
    VungXoa.ClearContents
    DieuKien = Ws.Range("A1").Value
    
    If Trim(DieuKien) = "" Then
        Application.ScreenUpdating = True
        Exit Sub
    End If
  
    For Each Cll In DuLieu
        If Left(Cll, 5) = DieuKien Then
            i = i + 1
            VungDo(i) = Right(Cll, Len(Cll) - 6)
           
       If i = 1 Then
            Sheets("MauC2").Range("F40") = Cll.Offset(, 3)
            End If
            
        End If
    Next Cll
    
      '--------------------------------------------
    '' hide rows
    [COLOR=#0000ff]With VungDo
    Application.ScreenUpdating = False
    For Each temp In VungDo
     If temp = "" Then
        .Parent.ShowAllData
     End If
    Next temp
     .AutoFilter 1, "<>", , , False
   'Else
         Application.ScreenUpdating = True
  End With[/COLOR]
    
End Sub

Mục đích: Em muốn lồng luôn đoạn code cho phép khi copy dữ liệu từ Sheets"tonghop2014" sang Vungdo của sheets"MauC2" thì đoạn code sẽ ẩn đi các dòng không chưa dữ liệu trong Vungdo. Em có sử dụng phương thức .parent.showalldata nhưng bị báo lỗi ngay chỗ này. Nhờ các Thầy chỉ dùm em với.
 
Upvote 0
6.14 Am, Chào ngày mới. Chúc gia đình GPE 1 ngày hạnh phúc.

Sau em có 1 câu hỏi nhỏ nhờ các Thầy và các bạn chỉ dùm mình.
Mã:
Public Sub LocHoa()
    '* Khai báo kieu du lieu
    
    Dim i As Integer
    Dim Ws As Worksheet
    Dim DieuKien As String
    Dim DuLieu As Range, VungDo As Range, Cll As Range, VungXoa As Range, temp As Range
    Dim Rws As Long
    Set Ws = Sheets("TongHop2014")
    Set VungDo = Sheets("MauC2").Range("A16:A27")
    Set VungXoa = Sheets("MauC2").Range("AG16:AI27")
    Set DuLieu = Range(Ws.Range("C2"), Ws.Range("C40000").End(xlUp))
    
    Application.ScreenUpdating = False
    
    VungDo.Resize(, 16).ClearContents
    VungXoa.ClearContents
    DieuKien = Ws.Range("A1").Value
    
    If Trim(DieuKien) = "" Then
        Application.ScreenUpdating = True
        Exit Sub
    End If
  
    For Each Cll In DuLieu
        If Left(Cll, 5) = DieuKien Then
            i = i + 1
            VungDo(i) = Right(Cll, Len(Cll) - 6)
           
       If i = 1 Then
            Sheets("MauC2").Range("F40") = Cll.Offset(, 3)
            End If
            
        End If
    Next Cll
    
      '--------------------------------------------
    '' hide rows
    [COLOR=#0000ff]With VungDo
    Application.ScreenUpdating = False
    For Each temp In VungDo
     If temp = "" Then
        .Parent.ShowAllData
     End If
    Next temp
     .AutoFilter 1, "<>", , , False
   'Else
         Application.ScreenUpdating = True
  End With[/COLOR]
    
End Sub

Mục đích: Em muốn lồng luôn đoạn code cho phép khi copy dữ liệu từ Sheets"tonghop2014" sang Vungdo của sheets"MauC2" thì đoạn code sẽ ẩn đi các dòng không chưa dữ liệu trong Vungdo. Em có sử dụng phương thức .parent.showalldata nhưng bị báo lỗi ngay chỗ này. Nhờ các Thầy chỉ dùm em với.

Bạn làm như sau:

Mã:
Public Sub LocHoa()
    '* Khai báo kieu du lieu
    
    Dim i As Integer
    Dim Ws As Worksheet
    Dim DieuKien As String
    Dim DuLieu As Range, VungDo As Range, Cll As Range, VungXoa As Range, temp As Range
    Dim Rws As Long
    Set Ws = Sheets("TongHop2014")
    Set VungDo = Sheets("MauC2").Range("A16:A27")
    Set VungXoa = Sheets("MauC2").Range("AG16:AI27")
    Set DuLieu = Range(Ws.Range("C2"), Ws.Range("C40000").End(xlUp))
    
    Application.ScreenUpdating = False
    
[COLOR=#0000ff]    ''UnHide cac hang da bi Hide:[/COLOR]
[COLOR=#0000ff]    VungDo.EntireRow.Hidden = False[/COLOR]

    VungDo.Resize(, 16).ClearContents
    VungXoa.ClearContents
    DieuKien = Ws.Range("A1").Value
    
    If Trim(DieuKien) = "" Then
        Application.ScreenUpdating = True
        Exit Sub
    End If
  
    For Each Cll In DuLieu
        If Left(Cll, 5) = DieuKien Then
            i = i + 1
            VungDo(i) = Right(Cll, Len(Cll) - 6)
            If i = 1 Then
                Sheets("MauC2").Range("F40") = Cll.Offset(, 3)
            End If
        End If
    Next Cll
    
[COLOR=#0000ff]    ''Hide cac dong trong:[/COLOR]
[COLOR=#0000ff]    VungDo.SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True[/COLOR]

    Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Em cảm ơn thầy đã giúp em, hôm nay phải chuẩn bị cho công tác tiếp đoàn khách vào ngày mai nên giờ em mới đọc được hướng dẫn của thầy.Em cũng có 1 câu hỏi định hỏi thầy nhưng để em ngâm cứu thêm về vấn đề đó thật kỹ, khi nào thiệt bí mới dám nhờ thầy.
 
Upvote 0
Em có 1 yêu cầu trong công việc nhỏ.

Ví dụ: em có 1 đoạn nội dung "Thanh toán tiền sửa xe ô tô hoá đơn số 0000493 ngày 04/03/2014" và em muốn lấy số hoá đơn và số ngày để đưa ra nội dung " 0000493 ngày 04/03/2014" trong thì mình làm ntn ah. Vì nội dung liên quan đến cả số hoá đơn và ngày nên nên không biết hướng làm sao.

Em nghĩ phương án là dùng vòng lặp để lấy nhưng em chạy không được.
PHP:
Public Sub FindNumberAndDate()
Dim arr, x As String, i As Integer, temp As String, VungXoa As Range, _
Cll As Range

Set VungXoa = Sheets("MauC2").Range("BA16:BA26")

    For Each Cll In VungXoa
         x = Trim(Cll)
        arr = Split(x, " ")
        For i = 0 To UBound(arr)
        If IsNumeric(arr(i)) = True Then
'------------------------------------------------------------------
Đoạn này em cố ý tách ra để test thử. Nhưng kết quả lại ra 1000000
           Sheets("BangKe2014").Range("b10") = Application.Transpose(arr(i))
        Else
            Exit For
        End If
        If IsDate(arr(i)) = True Then
'------------------------------------------------------------
Đoạn này em cũng có ý tách ra để thử.
           Sheets("BangKe2014").Range("b10").ofset(, 1) = Application.Transpose(arr(i))

        Else
            Exit For
        End If
        Next i
    Next Cll
 
Lần chỉnh sửa cuối:
Upvote 0
Ví dụ: em có 1 đoạn nội dung "Thanh toán tiền sửa xe ô tô hoá đơn số 0000493 ngày 04/03/2014" và em muốn lấy số hoá đơn và số ngày để đưa ra nội dung " 0000493 ngày 04/03/2014" trong thì mình làm ntn ah.

Lấy số hoá đơn thì căn cứ vô vị trí cụm từ đầu đã được tô màu;
Số ngày thì căn cứ vô 2 gạch xiên trong chuỗi biểu thị ngày
Nếu có gì khác thì đưa hết các mệnh đề nguồn lên!
Chúc thành công!
 
Upvote 0
Em có 1 yêu cầu trong công việc nhỏ.

Ví dụ: em có 1 đoạn nội dung "Thanh toán tiền sửa xe ô tô hoá đơn số 0000493 ngày 04/03/2014" và em muốn lấy số hoá đơn và số ngày để đưa ra nội dung " 0000493 ngày 04/03/2014" trong thì mình làm ntn ah. Vì nội dung liên quan đến cả số hoá đơn và ngày nên nên không biết hướng làm sao.

Em nghĩ phương án là dùng vòng lặp để lấy nhưng em chạy không được.
PHP:
Public Sub FindNumberAndDate()
Dim arr, x As String, i As Integer, temp As String, VungXoa As Range, _
Cll As Range

Set VungXoa = Sheets("MauC2").Range("BA16:BA26")

    For Each Cll In VungXoa
         x = Trim(Cll)
        arr = Split(x, " ")
        For i = 0 To UBound(arr)
        If IsNumeric(arr(i)) = True Then
'------------------------------------------------------------------
Đoạn này em cố ý tách ra để test thử. Nhưng kết quả lại ra 1000000
           Sheets("BangKe2014").Range("b10") = Application.Transpose(arr(i))
        Else
            Exit For
        End If
        If IsDate(arr(i)) = True Then
'------------------------------------------------------------
Đoạn này em cũng có ý tách ra để thử.
           Sheets("BangKe2014").Range("b10").ofset(, 1) = Application.Transpose(arr(i))

        Else
            Exit For
        End If
        Next i
    Next Cll
Trước tiên, cho tôi hỏi có liên quan gì đến bài vừa rồi không? Nếu không thì bạn mở topic khác và đưa file mẫu lên, kết quả bạn cần mong muốn.
 
Upvote 0
Dạ thầy Hoàng, cùng nguồn dữ liệu bảng dự toán đó thầy. Mục đích mình lấy thông tin từ sheet MauC2 để làm bảng kê. Vì bên kho bạc họ yêu cầu nộp Bảng dự toán cùng bảng kê. Nêu lúc đầu em cũng định tính tạo topic mới nhưng song lại thôi vì nó có liên quan đến phần trước. Còn phần bảng em sẽ bổ sung ngay. Hình ảnh em xoá hơi tèm lem 1 tí, mong mọi người cảm thông cho.
13209081173_98f34c2655_b.jpg
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Dạ thầy Hoàng, cùng nguồn dữ liệu bảng dự toán đó thầy. Mục đích mình lấy thông tin từ sheet MauC2 để làm bảng kê. Vì bên kho bạc họ yêu cầu nộp Bảng dự toán cùng bảng kê. Nêu lúc đầu em cũng định tính tạo topic mới nhưng song lại thôi vì nó có liên quan đến phần trước. Còn phần bảng em sẽ bổ sung ngay. Hình ảnh em xoá hơi tèm lem 1 tí, mong mọi người cảm thông cho.

Làm công thức luôn cho rồi!

Cột STT: A15

=IF(B15>"",MAX($A$14:A14)+1,"")

Cột Số Hóa đơn: B15

=IF(MauC2!A16>"",TRIM(SUBSTITUTE(SUBSTITUTE(MauC2!A16,F15 & " (hoá đơn số ",""),")","")),"")

Cột Số: C15

=IF(B15>"",TRIM(LEFT(B15,FIND(" ",B15))),"")

Cột Ngày: D15

=IF(B15>"",TRIM(RIGHT(B15,LEN(B15)-FIND("ngày",B15)-4)),"")

Cột Mục, tiểu mục: E15

=IF(B15>"",MauC2!N16,"")

Cột Nội dung chi: F15

=IF(MauC2!A16>"",TRIM(LEFT(MauC2!A16,FIND("(",MauC2!A16)-2)),"")

Cột Số tiền: G15

=IF(B15>"",MauC2!Y16,"")

Rồi sau đó fill xuống các hàng trong biểu mẫu.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cái topic này cuối cùng là đi đến đâu mình cũng không biết nữa
???
Cứ như là... LẨU
 
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom