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:
Em dùng record macro để tạo phím tắt tăng kích thước chữ (bằng cách ấn vào Increase Font Size button ở Tab Home).
Thay vì ấn Alt_H + FG thì ấn Ctrl + Shirt + M thì thu được code như sau:
...
Các bác thấy đó, nó lại chọn font là 11. Bác nào giúp em sửa code này cho nó thành tăng kích thước font với.
Tiện thể cho em thêm code để giảm kích thước font luôn càng tốt ạ.
Cám ơn các bác

Mã:
Selection.Font.Size = Selection.Font.Size + 1 'Tang
Selection.Font.Size = Selection.Font.Size - 1 'Giam
 
Lần chỉnh sửa cuối:
Upvote 0
Hẵn khoan nói về code của bạn.

Hix buồn quá! Không ai giúp hộ mình! Mình hì hục mấy hôm rồi mà chưa ra!

Hãy nói bạn muốn copy dữ liệu từ trang 1 sang trang 2 với điều kiện gì;

Biết đâu làm mới sẽ hay hơn cách mà bạn đang xài cũng nên!

(Thời gian của mọi người đa số là không nhiều; mà bạn lại ít lời quá; Ai lại bắt người khác dịch code để hiểu í bạn như thế bao giờ; Lại còn ngồi đó mà than khóc. . . )
 
Upvote 0
Hãy nói bạn muốn copy dữ liệu từ trang 1 sang trang 2 với điều kiện gì;

Biết đâu làm mới sẽ hay hơn cách mà bạn đang xài cũng nên!

(Thời gian của mọi người đa số là không nhiều; mà bạn lại ít lời quá; Ai lại bắt người khác dịch code để hiểu í bạn như thế bao giờ; Lại còn ngồi đó mà than khóc. . . )
Vâng! Cảm ơn bạn rất nhiều đã quan tâm! Bạn xem giúp mình với nhé! Mình muốn copy dữ liệu từ trang 1 sang trang 2 với điều kiện là cứ 2 dòng bất kì ở trang 1 khi ghép với nhau thành 1 cặp phải thoả mãn trong 4 ô cùng màu (2cột liên tiếp) có ít nhất một ô chứa số liệu được nhập vào! Bạn xem ví dụ minh hoạ ở trang 2 bản copy nhé (cặp 0-2 là thoả mãn). Mình có bản gốc nhưng chỉ làm được với số liệu ít quá! Mình nhờ bạn xem giúp và làm trên bản copy để số liệu nhập nhiều hơn từ B1:VI11343 (Cột A là cột số thứ tự của các dòng cho mình dễ theo dõi đó là dòng nào được ghép với nhau)! Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn xài macro sau xem sao nha

Mình muốn copy dữ liệu từ trang 1 sang trang 2 với điều kiện là cứ 2 dòng bất kì ở trang 1 khi ghép với nhau thành 1 cặp phải thoả mãn trong 4 ô cùng màu (2cột liên tiếp) có ít nhất một ô chứa số liệu được nhập vào! Bạn xem ví dụ minh hoạ ở trang 2 bản copy nhé (cặp 0-2 là thoả mãn). Mình có bản gốc nhưng chỉ làm được với số liệu ít quá!. . . Thân!

PHP:
Option Explicit
Sub Xet2Dong()
 Dim jJ As Long, Ww As Long, eRw As Long, Col As Byte, Zz As Integer
 Dim Rg1 As Range, Rg2 As Range, WF As Object, Rng As Range
 Dim Timer_ As Double
  
 Sheet1.Select:               Set WF = Application.WorksheetFunction
 eRw = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, _
   SearchDirection:=xlPrevious).Row
 ReDim Khong(1 To eRw) As Boolean:                 Timer_ = Timer()
 Sheet2.[A4].Resize(eRw, 256).Clear:   Application.ScreenUpdating = False
 For jJ = 1 To eRw - 1
   For Ww = jJ + 1 To eRw
      If Khong(jJ) = False And Khong(Ww) = False Then
         For Zz = 2 To 254 Step 2
            Set Rg1 = Cells(jJ, Zz).Resize(, 2)
            Set Rg2 = Cells(Ww, Zz).Resize(, 2)
            If WF.Sum(Union(Rg1, Rg2)) < 1 Then
9 '               Union(Rg1, Rg2).Interior.ColorIndex = 34 + Zz Mod 7'
               Khong(Ww) = True:                   Exit For
            End If
            If Zz > 253 Then
               With Sheet2.[a65500].End(xlUp).Offset(2)
                  Rg1.EntireRow.Copy Destination:=.Cells(1, 1)
                  Rg2.EntireRow.Copy Destination:=.Cells(2, 1)
               End With
            End If
         Next Zz
      End If
   Next Ww
 Next jJ:                                          Sheet2.Select
 MsgBox Timer - Timer_, , "GPE Xin Báo:"
End Sub
 
Upvote 0
PHP:
Option Explicit
Sub Xet2Dong()
Dim jJ As Long, Ww As Long, eRw As Long, Col As Byte, Zz As Integer
Dim Rg1 As Range, Rg2 As Range, WF As Object, Rng As Range
Dim Timer_ As Double
 
Sheet1.Select: Set WF = Application.WorksheetFunction
eRw = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
ReDim Khong(1 To eRw) As Boolean: Timer_ = Timer()
Sheet2.[A4].Resize(eRw, 256).Clear: Application.ScreenUpdating = False
For jJ = 1 To eRw - 1
For Ww = jJ + 1 To eRw
If Khong(jJ) = False And Khong(Ww) = False Then
For Zz = 2 To 254 Step 2
Set Rg1 = Cells(jJ, Zz).Resize(, 2)
Set Rg2 = Cells(Ww, Zz).Resize(, 2)
If WF.Sum(Union(Rg1, Rg2)) < 1 Then
9 ' Union(Rg1, Rg2).Interior.ColorIndex = 34 + Zz Mod 7'
Khong(Ww) = True: Exit For
End If
If Zz > 253 Then
With Sheet2.[a65500].End(xlUp).Offset(2)
Rg1.EntireRow.Copy Destination:=.Cells(1, 1)
Rg2.EntireRow.Copy Destination:=.Cells(2, 1)
End With
End If
Next Zz
End If
Next Ww
Next jJ: Sheet2.Select
MsgBox Timer - Timer_, , "GPE Xin Báo:"
End Sub
Tuyệt vời! Cách làm của bạn rất hay! Mình chân thành cảm ơn bạn! Mong bạn và mọi người chia sẻ và giúp đỡ những người khác khi gặp khó khăn như mình! Một lần nữa xin cảm ơn!
 
Upvote 0
PHP:
Option Explicit
Sub Xet2Dong()
Dim jJ As Long, Ww As Long, eRw As Long, Col As Byte, Zz As Integer
Dim Rg1 As Range, Rg2 As Range, WF As Object, Rng As Range
Dim Timer_ As Double

Sheet1.Select: Set WF = Application.WorksheetFunction
eRw = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
ReDim Khong(1 To eRw) As Boolean: Timer_ = Timer()
Sheet2.[A4].Resize(eRw, 256).Clear: Application.ScreenUpdating = False
For jJ = 1 To eRw - 1
For Ww = jJ + 1 To eRw
If Khong(jJ) = False And Khong(Ww) = False Then
For Zz = 2 To 254 Step 2
Set Rg1 = Cells(jJ, Zz).Resize(, 2)
Set Rg2 = Cells(Ww, Zz).Resize(, 2)
If WF.Sum(Union(Rg1, Rg2)) < 1 Then
9 ' Union(Rg1, Rg2).Interior.ColorIndex = 34 + Zz Mod 7'
Khong(Ww) = True: Exit For
End If
If Zz > 253 Then
With Sheet2.[a65500].End(xlUp).Offset(2)
Rg1.EntireRow.Copy Destination:=.Cells(1, 1)
Rg2.EntireRow.Copy Destination:=.Cells(2, 1)
End With
End If
Next Zz
End If
Next Ww
Next jJ: Sheet2.Select
MsgBox Timer - Timer_, , "GPE Xin Báo:"
End Sub

Bạn àh! Hôm nay mình đã thử kiểm tra lại một lần nữa thì thấy rằng kết quả xuất sang sheet2 không đủ ! Khi mình nhập thêm dữ liệu kiểm tra xem thử các dòng khác thì chỉ cho vài kết quả bạn àh! Hì, mong bạn bớt chút thêm thời gian hoàn thiện thêm sao cho có bao nhiêu kết quả đều xổ ra hết! Cảm ơn bạn!
 
Upvote 0
Đúng là còn bỏ sót;

Bạn thử chạy macro này trong nữa giờ xem sao, trong khi chờ f ương án khác cải thiện tốc độ hơn:

PHP:
Option Explicit
Sub Xet2Dong()
 Dim jJ As Long, Ww As Long, eRw As Long, Col As Byte, Zz As Integer
 Dim Rg1 As Range, Rg2 As Range, WF As Object, Rng As Range
 Dim Timer_ As Double
  
 Sheet1.Select:               Set WF = Application.WorksheetFunction
 eRw = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, _
   SearchDirection:=xlPrevious).Row
 ReDim Khong(1 To eRw) As Boolean:                 Timer_ = Timer()
 Sheet2.[A4].Resize(eRw, 256).Clear:   Application.ScreenUpdating = False
 For jJ = 1 To eRw - 1
   For Ww = jJ + 1 To eRw
'      If Khong(jJ) = False And Khong(Ww) = False Then'
         For Zz = 2 To 254 Step 2
            Set Rg1 = Cells(jJ, Zz).Resize(, 2)
            Set Rg2 = Cells(Ww, Zz).Resize(, 2)
            If WF.Sum(Union(Rg1, Rg2)) < 1 Then
9 '               Union(Rg1, Rg2).Interior.ColorIndex = 34 + Zz Mod 7'
'               Khong(Ww) = True:'
               Exit For
'            ElseIf WF.Sum(Rg2) < 1 Then'
'               Khong(Ww) = True  '
            End If
            If Zz > 253 Then
               With Sheet2.[a65500].End(xlUp).Offset(2)
                  Rg1.EntireRow.Copy Destination:=.Cells(1, 1)
                  Rg2.EntireRow.Copy Destination:=.Cells(2, 1)
               End With
            End If
         Next Zz
'      End If'
   Next Ww
 Next jJ:                                          Sheet2.Select
 MsgBox Timer - Timer_, , "GPE Xin Báo:"
End Sub


Khi nào hết kiên nhẫn với macro, hãy nhấn {CTRL}+{Pause Break} & thoát luôn khi được hỏi;

Cũng sẽ có những kết quả nào đó . . .
 
Upvote 0
Bạn xài cái ni, sẽ tiết kiệm hơn 1/10 thời gian đó nghe!

PHP:
Option Explicit
Sub CountValueToColumnA()
 Dim WF, Rng As Range, Cls As Range, cRg As Range, Rg1 As Range, Rg2 As Range
 Dim eRw As Long, jJ As Long, Ww As Long, zZ As Integer
 Const GN As String = "-"
 Dim Timer_ As Double

 Timer_ = Timer:                       Sheet1.Select
 eRw = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, _
   SearchDirection:=xlPrevious).Row: Sheet2.Rows("2:2").ClearContents
 Sheet2.[A4].Resize(eRw, 256).Clear:   Application.ScreenUpdating = False
 Set Rng = [B1].Resize(eRw):           Set WF = Application.WorksheetFunction
 Rng.Interior.ColorIndex = 0
 For Each Cls In Rng
   If WF.Count(Cls.Resize(, 255)) = 0 Then _
      Cls.Offset(, -1).Interior.ColorIndex = 38
 Next Cls                              '0.484'
 For jJ = 1 To eRw - 1
   If Cells(jJ, "A").Interior.ColorIndex < 9 Then
      For Ww = jJ + 1 To eRw
         If Cells(Ww, "A").Interior.ColorIndex < 9 Then
            For zZ = 2 To 254 Step 2
               Set Rg1 = Cells(jJ, zZ).Resize(, 2)
               Set Rg2 = Cells(Ww, zZ).Resize(, 2)
               If WF.Sum(Union(Rg1, Rg2)) < 1 Then Exit For
               If zZ > 253 Then
                  With Sheet2.[a65500].End(xlUp).Offset(2)
                     Rg1.EntireRow.Copy Destination:=.Cells(1, 1)
                     Rg2.EntireRow.Copy Destination:=.Cells(2, 1)
                  End With
                  [iv2].End(xlToLeft).Offset(, 1).Value = Timer - Timer_
               End If
            Next zZ
         End If
      Next Ww
   End If
 Next jJ
 MsgBox Timer() - Timer_
End Sub
 
Upvote 0
PHP:
Option Explicit
Sub CountValueToColumnA()
Dim WF, Rng As Range, Cls As Range, cRg As Range, Rg1 As Range, Rg2 As Range
Dim eRw As Long, jJ As Long, Ww As Long, zZ As Integer
Const GN As String = "-"
Dim Timer_ As Double
 
Timer_ = Timer: Sheet1.Select
eRw = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row: Sheet2.Rows("2:2").ClearContents
Sheet2.[A4].Resize(eRw, 256).Clear: Application.ScreenUpdating = False
Set Rng = [B1].Resize(eRw): Set WF = Application.WorksheetFunction
Rng.Interior.ColorIndex = 0
For Each Cls In Rng
If WF.Count(Cls.Resize(, 255)) = 0 Then _
Cls.Offset(, -1).Interior.ColorIndex = 38
Next Cls '0.484'
For jJ = 1 To eRw - 1
If Cells(jJ, "A").Interior.ColorIndex < 9 Then
For Ww = jJ + 1 To eRw
If Cells(Ww, "A").Interior.ColorIndex < 9 Then
For zZ = 2 To 254 Step 2
Set Rg1 = Cells(jJ, zZ).Resize(, 2)
Set Rg2 = Cells(Ww, zZ).Resize(, 2)
If WF.Sum(Union(Rg1, Rg2)) < 1 Then Exit For
If zZ > 253 Then
With Sheet2.[a65500].End(xlUp).Offset(2)
Rg1.EntireRow.Copy Destination:=.Cells(1, 1)
Rg2.EntireRow.Copy Destination:=.Cells(2, 1)
End With
[iv2].End(xlToLeft).Offset(, 1).Value = Timer - Timer_
End If
Next zZ
End If
Next Ww
End If
Next jJ
MsgBox Timer() - Timer_
End Sub
Hì! Hôm nay mình đã nhập xong dữ liệu và cho chạy theo cả 2 cách! Đều cho ra kết quả, nhưng đúng là phải có sự kiên nhẫn chờ đợi thật! Hì, mất gần 3 giờ đồng hồ!
 
Upvote 0
Nếu đây vẫn là công việc thường xuyên của bạn, ta tiếp tục cải tiến macro

Bạn có nhu cầu không vậy? --=0

Chúc thành công trong ngày!
 
Upvote 0
Em xin hỏi cách dùng cấu trúc này:
PHP:
If Not .... Is Nothing Then
.....
Thực ra, em cũng sử dụng rồi những chưa hiểu kỹ lắm. A/C vui lòng chỉ dùm em nha!!
 
Upvote 0
Em xin hỏi cách dùng cấu trúc này:
PHP:
If Not .... Is Nothing Then
.....
Thực ra, em cũng sử dụng rồi những chưa hiểu kỹ lắm. A/C vui lòng chỉ dùm em nha!!
Nếu sau từ khóa 'Not' là chữ "Intersect" thì đến chữ ký của Sa_DQ & nhấn vô từ đó để tham khảo.

Nhưng lần sau chớ chen ngang vậy nha; Hãy lập topic mới cho mình
 
Lần chỉnh sửa cuối:
Upvote 0
Nhưng nếu em muốn sau 'Not' là một biến. Anh có cthể cho em 1 hoặc 2 ví dụ dễ hiểu!!?

Not đơn giản là 1 phủ định, dùng cho 1 biến hoặc 1 expression, hoặc 1 kết quả của 1 hàm nào đó, với điều kiện biến, expression, hàm, ... phải có giá trị Logic (True, False)

Thí dụ:

1. Biến:

PHP:
Dim Test As Boolean
Test = True
Msgbox Not Test

2. Expression:

PHP:
Dim MyNum As Long
MyNum = [A1]
MsgBox Not (MyNum >10 And MyNum <100)

3. Kết quả của 1 hàm:

PHP:
MsgBox Not IsNumeric(15)
 
Upvote 0
Nhưng nếu em muốn sau 'Not' là một biến. Anh có cthể cho em 1 hoặc 2 ví dụ dễ hiểu!!?
Ví dụ thế này
PHP:
Sub Test
  Dim fRng as Range
  Set fRng = Range("gì gì đó").Find(.......)
  If Not fRng is Nothing then
     'Code
  End If
End Sub
Trong trường hợp này thì If Not fRng is Nothing là ý muốn nói: NẾU fRng CÓ TỒN TẠI THÌ (lở fRng không tồn tại thì code ở dưới liên quan đến fRng sẽ bị lỗi)
fRng is Nothing nghĩa là fRng.. chẳng có gì (không tồn tại)
Not fRng is Nothing: nghĩa là ngược với phát biểu trên, nghĩa là CÓ TỒN TẠI
 
Upvote 0
Đây là đoạn code em làm để ẩn hàng trong bảng excel nhưng tốc độ hơi chậm mong mọi người giúp cải tiến đoạn code này giùm em.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Arr(10) As Variant
Arr(1) = 43
Arr(2) = 44
Arr(3) = 45
Arr(4) = 46
Arr(8) = 47
Arr(5) = 50
Arr(6) = 15
Arr(7) = 16
Arr(8) = 51
Arr(9) = 52
Arr(10) = 17
Dim Ii As Variant
On Error Resume Next
Application.ScreenUpdating = False
For Each Ii In Arr
         If Not Intersect([K1], Target) Is Nothing Then
               If Range("b" & Ii).Value = 0 Then
                   Rows(Ii).EntireRow.Hidden = True
               Else
                   Rows(Ii).EntireRow.Hidden = False
               End If
         End If
 Next Ii
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là đoạn code em làm để ẩn hàng trong bảng excel nhưng tốc độ hơi chậm mong mọi người giúp cải tiến đoạn code này giùm em.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Arr(10) As Variant
Arr(1) = 43
Arr(2) = 44
Arr(3) = 45
Arr(4) = 46
Arr(8) = 47
Arr(5) = 50
Arr(6) = 15
Arr(7) = 16
Arr(8) = 51
Arr(9) = 52
Arr(10) = 17
Dim Ii As Variant
On Error Resume Next
Application.ScreenUpdating = False
For Each Ii In Arr
         If Not Intersect([K1], Target) Is Nothing Then
               If Range("b" & Ii).Value = 0 Then
                   Rows(Ii).EntireRow.Hidden = True
               Else
                   Rows(Ii).EntireRow.Hidden = False
               End If
         End If
 Next Ii
Application.ScreenUpdating = True
End Sub
Liên quan đến vụ NHANH CHẬM phải xem file mới biết bạn à... Vì có thể nó bị ảnh hưởng do những thứ khác (công thức chẳng hạn)
 
Upvote 0
Đây là file đính kèm của em.Nhờ mọi người xem giúp.Và cho em hỏi trong excel 2007 có thể tạo nút menu mới để gán marco như trong 2003 được không. Nếu được nhờ mọi người hướng dẫn giùm em.
 

File đính kèm

  • HSCL thi nghiem.rar
    108.1 KB · Đọc: 39
Upvote 0
Đây là file đính kèm của em.Nhờ mọi người xem giúp.Và cho em hỏi trong excel 2007 có thể tạo nút menu mới để gán marco như trong 2003 được không. Nếu được nhờ mọi người hướng dẫn giùm em.
Tôi đang nghĩ tại sao bạn không dùng AutoFilter nhỉ (cần gì vòng lập)
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$K$1" Then
    Range("B13:B1000").AutoFilter 1, "<>0", , , 0
  End If
End Sub
Nhìn code của bạn và đoán thế ---> Bạn chạy thử xem thế nào nhé!
Nói thêm rằng code mà bạn đưa ở trên, khi chạy trên máy tôi chẳng thấy chậm gì cả (chẳng qua là tôi rút gọn nó thôi)
 
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