Cách chọn Cells có Format là: "mm/dd/yyy"

Liên hệ QC

alias1313

Thành viên hoạt động
Tham gia
7/4/17
Bài viết
163
Được thích
13
Mã:
Sub ngay()
Dim Range1 as range
Dim lr as interger
lr = Cells(Rows.Count, "A").End(xlUp).Row
For each Range1 in Range("A:A"&lr)
Next Range1
End sub

Range("A:A"&lr) gồm: Cells format kiểu Date(mm/dd/yy), cells chứa text, và cells rỗng.
Em muốn lấy Range1 chỉ là các Cells format kiểu : Date thì phải làm thế nào
Mong các Anh chỉ giúp!
 
Còn chưa rành mà đã...
Dim lr as interger
For each Range1 in Range("A:A"&lr)

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

Nhập 24/06/2017 (format là date) vào A1, rồi chạy đoạn sau.
PHP:
Sub hibe()
Dim d
d = Range("A1")
MsgBox TypeName(d)
End Sub
 
Bạn thử thêm cách này xem sao
Mã:
Sub ngay()
    Dim Range1 As Range
    Dim lr As Long, Ms
lr = Cells(Rows.Count, "A").End(xlUp).Row
For Each Range1 In Range("A1:A" & lr)
    If IsDate(Range1) Then Ms = Ms & " " & Range1
Next Range1
MsgBox Ms
End Sub
 
Còn chưa rành mà đã...
Dim lr as interger
For each Range1 in Range("A:A"&lr)

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

Nhập 24/06/2017 (format là date) vào A1, rồi chạy đoạn sau.
PHP:
Sub hibe()
Dim d
d = Range("A1")
MsgBox TypeName(d)
End Sub
@befaint Cảm ơn Anh đã hướng dẫn!

Em chạy msbox = Date, em thử code:
Mã:
Sub Date()
Dim WS_count as Interger
Dim j as interger
Dim Range1 as range
Dim lr as Long
lr = Cells(Rows.Count, "C").End(xlUp).Row
WS_Count = ActiveWorkbook.Worksheets.Count        
         For j = 1 To WS_Count  
For Each Range1 In ActiveWorkbook.Worksheets(j).Range("C1:C" & lr)
     If TypeName(Range1) = "Date" Then
     Debug.Print Range1
    End If
Chạy nó im ru..chẳng báo lỗi, Range1 = emty, Mong anh giúp đỡ!

P/s: cái vụ Dim lr as interger ...tại em nghĩ nó là số nguyên lên phang đại..^_^...
 
Lần chỉnh sửa cuối:
Bạn thử thêm cách này xem sao
Mã:
Sub ngay()
    Dim Range1 As Range
    Dim lr As Long, Ms
lr = Cells(Rows.Count, "A").End(xlUp).Row
For Each Range1 In Range("A1:A" & lr)
    If IsDate(Range1) Then Ms = Ms & " " & Range1
Next Range1
MsgBox Ms
End Sub

Mã:
Sub Date()
Dim WS_count as Interger
Dim j as interger
Dim Range1 as range
Dim lr as Long
lr = Cells(Rows.Count, "C").End(xlUp).Row
WS_Count = ActiveWorkbook.Worksheets.Count         
        For j = 1 To WS_Count   
For Each Range1 In ActiveWorkbook.Worksheets(j).Range("C1:C" & lr)
   If IsDate(Range1) Then
     Debug.Print Range1

   End If

Code anh chỉ em đã chạy thử, và chạy tốt! Cám ơn Anh @PacificPR Rất nhiều!

P/s: anh cho em hỏi thêm, khi em chọn sheet theo kiều trên ( Sheets.count) có cách nào để chỉ chọn sheet.visible(không chọn sheets hide) như kiểu hồi sáng anh chỉ em: For each sheet in Sheets không anh.( em thử nhiều cách mà không được)
 
Range("A:A"&lr) gồm: Cells format kiểu Date(mm/dd/yy), cells chứa text, và cells rỗng.
Em muốn lấy Range1 chỉ là các Cells format kiểu : Date thì phải làm thế nào!

Mình có câu nghi vấn: Sao trong 1 cột mà dữ liệu của bạn lại có đủ thứ làm vậy?
 
Mình có câu nghi vấn: Sao trong 1 cột mà dữ liệu của bạn lại có đủ thứ làm vậy?
Em viết giùm cho người bạn..tiện cũng để học thêm.
File đó nhiều sheets, mỗi sheet có nhiều bảng dữ liệu, kiểu dữ liệu giống nhau nhưng không gộp chung được, khoảng giữa các bảng: có tiêu đề(text) và khoảng trắng.
Nên em muốn chỉ chọn ô dữ liệu cần tình, cho code nó chạy nhanh.
 
Mã:
Sub Date()
Dim WS_count as Interger
Dim j as interger
Dim Range1 as range
Dim lr as Long
lr = Cells(Rows.Count, "C").End(xlUp).Row
WS_Count = ActiveWorkbook.Worksheets.Count        
        For j = 1 To WS_Count  
For Each Range1 In ActiveWorkbook.Worksheets(j).Range("C1:C" & lr)
   If IsDate(Range1) Then
     Debug.Print Range1

   End If

Code anh chỉ em đã chạy thử, và chạy tốt! Cám ơn Anh @PacificPR Rất nhiều!

P/s: anh cho em hỏi thêm, khi em chọn sheet theo kiều trên ( Sheets.count) có cách nào để chỉ chọn sheet.visible(không chọn sheets hide) như kiểu hồi sáng anh chỉ em: For each sheet in Sheets không anh.( em thử nhiều cách mà không được)
Bạn chạy thử Code này xem sao
Mã:
Sub CodeDate()
    Dim Ws As Worksheet
    Dim Rng As Range, lr As Long
For Each Ws In Worksheets
    If Ws.Visible = True Then
        lr = Ws.Range("C65535").End(3).Row
        Set Rng = Ws.Range("C1:C" & lr)
        For Each Cll In Rng
            If IsDate(Cll) Then
                Debug.Print Cll
            End If
        Next
    End If
Next
End Sub
 
Bạn chạy thử Code này xem sao
Mã:
Sub CodeDate()
    Dim Ws As Worksheet
    Dim Rng As Range, lr As Long
For Each Ws In Worksheets
    If Ws.Visible = True Then
        lr = Ws.Range("C65535").End(3).Row
        Set Rng = Ws.Range("C1:C" & lr)
        For Each Cll In Rng
            If IsDate(Cll) Then
                Debug.Print Cll
            End If
        Next
    End If
Next
End Sub
@PacificPR Cảm ơn Anh!
Khi chạy kiểu: For each Ws in Worksheets thì không chọn sheet Hide có tác dụng ( If Ws.Visible = True Then)
Nhưng nó lại bị 1 vấn đề là: khi code chạy xong trên sheet.active...nó không chạy qua các sheets khác
Muốn chạy sheet khác lại phại chọn sheet đó rồi chạy.

Em không hiểu ở chỗ, rõ ràng mình đã: For each Ws...Next Ws....mà sao nó không next qua sheet khác....!
 
@PacificPR Cảm ơn Anh!
Khi chạy kiểu: For each Ws in Worksheets thì không chọn sheet Hide có tác dụng ( If Ws.Visible = True Then)
Nhưng nó lại bị 1 vấn đề là: khi code chạy xong trên sheet.active...nó không chạy qua các sheets khác
Muốn chạy sheet khác lại phại chọn sheet đó rồi chạy.

Em không hiểu ở chỗ, rõ ràng mình đã: For each Ws...Next Ws....mà sao nó không next qua sheet khác....!
Cái đó là nó duyệt qua tất cả các Sheet trong file tương tự như dòng này vậy For j = 1 To WS_Count ............ Next J
Bạn xem kết quả nó Debug xem
 
Lần chỉnh sửa cuối:
Bạn chạy thử Code này xem sao
Mã:
Sub CodeDate()
    Dim Ws As Worksheet
    Dim Rng As Range, lr As Long
For Each Ws In Worksheets
    If Ws.Visible = True Then
        lr = Ws.Range("C65535").End(3).Row
        Set Rng = Ws.Range("C1:C" & lr)
        For Each Cll In Rng
            If IsDate(Cll) Then
                Debug.Print Cll
            End If
        Next
    End If
Next
End Sub
Chẳng biết tại sao phải duyệt qua từng cell trong khi ta có thể "bắt" toàn bộ các cell date 1 phát mà không cần phải vòng lập
Mã:
Sub CodeDate()
  Dim ws As Worksheet
  Dim rng As Range, lr As Long
  For Each ws In Worksheets
    If ws.Visible = xlSheetVisible Then
      On Error Resume Next
      Set rng = ws.Range("C1:C60000").SpecialCells(xlCellTypeConstants, 1)
      If Not rng Is Nothing Then Debug.Print rng.Address(, , , True)
      Set rng = Nothing
      On Error GoTo 0
    End If
  Next
End Sub
----------------
Rồi còn cái vụ này nữa:
Chuẩn cơm..Mẹ nấu...hihi....thêm ws.select code chạy tất cả các Sheets!
Cảm ơn bạn @phuyen89 rất nhiều!
ws.Select để làm cái gì?
 
Chẳng biết tại sao phải duyệt qua từng cell trong khi ta có thể "bắt" toàn bộ các cell date 1 phát mà không cần phải vòng lập
Mã:
Sub CodeDate()
  Dim ws As Worksheet
  Dim rng As Range, lr As Long
lr = Cells(Rows.Count, "C").End(xlUp).Row
  For Each ws In Worksheets
    If ws.Visible = xlSheetVisible Then
      On Error Resume Next
      Set rng = ws.Range("C1:C60000").SpecialCells(xlCellTypeConstants, 1)
      If Not rng Is Nothing Then Debug.Print rng.Address(, , , True)
      Set rng = Nothing
      On Error GoTo 0
    End If
  Next
End Sub
.
----------------
Mã:
Sub TinhLai_Ngay()
   Dim Ws As Worksheet
   Dim Rng As Range, lr As Long
For Each Ws In Worksheets
   If Ws.Visible = True Then
       lr = Ws.Range("C65535").End(3).Row
       Set Rng = Ws.Range("C1:C" & lr)
       For Each Cll In Rng
           If IsDate(Cll) Then
Ngay = DateDiff("d", Cll, Cll.Offset(0, 5))        ' Cll chứa ngày vay tiền,  Cll.Offset(0, 5) chứa ngày trả tiền
               Debug.Print Ngay
           End If
       Next
   End If
Next
End Sub


Em tách từng Cell để tính giá trị ngày chênh lệch giữa 2 Cell bằng cách dùng DateDiff ( Tính lãi ngày ngân hàng).

Làm theo cách của Thầy code chạy rất nhanh, nhưng em suy nghĩ từ hôm qua đến giờ mà cũng không biết cách nào để tính ngày chênh lệch
Tại vì tính theo cách cảu Thầy "Rng" là một nhóm Range, em không biết cách nào để đặt DateDiff vào cả. em thử sử dụng split nhưng không được.
Mong Thầy hướng dẫn thêm.

P/s: Cảm ơn Thầy @ndu96081631 đã cho em biết thêm về cách sử dụng SpecialCells, thực sự rất hữu dụng....hihi..., việc xác định TypeCells trở lên rất đơn giản
 
Lần chỉnh sửa cuối:
Rồi còn cái vụ này nữa:

ws.Select để làm cái gì?

Mã:
Sub TinhLai_Ngay()
   Dim Ws As Worksheet
   Dim Rang1 As Range, lr As Long
lr = Cells(Rows.Count, "C").End(xlUp).Row
For Each ws In Worksheets
    If ws.Visible = True Then
    ws.Select
Debug.Print ws.Name
 
For Each Cll In Range("C1:C" & lr)
   If (IsDate(Cll)) Then
 
Ngay = DateDiff("d", Cll, Cll.Offset(0, 5))
    If (IsDate(Cll.Offset(0, 5))) Then

Debug.Print Ngay

Cll.Offset(0, 9).Value2 = Ngay
Debug.Print Range1.Offset(0, 9).Value2
End if
End if
Next Cll
End if
Next ws
End sub


Không ws.select:
- Vẫn Quét hếtcác sheets để xác định sheet.visible
- Nhưng khi gán giá trị : Cll.Offset(0, 9).Value2 = Ngay thì chì gán cho sheet.active
Chọn ws.select:
- Quét hếtcác sheets để xác định sheet.visible
- Khi gán giá trị : Cll.Offset(0, 9).Value2 = Ngay thì gán cho tất cả các sheets.

Mong Thầy hướng dẫn thêm!
 
Lần chỉnh sửa cuối:
Mã:
Sub TinhLai_Ngay()
   Dim Ws As Worksheet
   Dim Rang1 As Range, lr As Long
For Each ws In Worksheets
    If ws.Visible = True Then
    ws.Select
Debug.Print ws.Name
 
For Each Cll In Range("C1:C" & lr)
   If (IsDate(Cll)) Then
 
Ngay = DateDiff("d", Cll, Cll.Offset(0, 5))
    If (IsDate(Cll.Offset(0, 5))) Then

Debug.Print Ngay

Cll.Offset(0, 9).Value2 = Ngay
Debug.Print Range1.Offset(0, 9).Value2
End if
End if
Next Cll
End if
Next ws
End sub


Không ws.select:
- Vẫn Quét hếtcác sheets để xác định sheet.visible
- Nhưng khi gán giá trị : Cll.Offset(0, 9).Value2 = Ngay thì chì gán cho sheet.active
Chọn ws.select:
- Quét hếtcác sheets để xác định sheet.visible
- Khi gán giá trị : Cll.Offset(0, 9).Value2 = Ngay thì gán cho tất cả các sheets.

Mong Thầy hướng dẫn thêm!
Khi viết code VBA người ta hạn chế mấy cái vụ Select, vì nó làm cho màn hình giật giật rất khó chịu (có thể khiến cho tốc độ code giảm xuống)
Cái chuyện không .Select mà khiến cho code ra kết quả sai thì chỉ có thể trách bạn không biết cách viết thôi. Lấy ví dụ:
For Each Cll In Range("C1:C" & lr)
là sai hoàn toàn. Lý ra phải là:
For Each Cll In ws.Range("C1:C" & lr)
Nói chung khi truy xuất 1 vị trí nào đó, nếu bạn không ghi địa chỉ đầy đủ thì mặc định nó sẽ lấy theo địa chỉ của cái nào đang active. Ngược lại, nếu bạn ghi rõ địa chỉ tuyệt đối thì đâu việc gì phải Select
-------------------
Ngoài lề chút: không biết biến lr trong code của bạn có tác dụng gì?
 
Khi viết code VBA người ta hạn chế mấy cái vụ Select, vì nó làm cho màn hình giật giật rất khó chịu (có thể khiến cho tốc độ code giảm xuống)
Cái chuyện không .Select mà khiến cho code ra kết quả sai thì chỉ có thể trách bạn không biết cách viết thôi. Lấy ví dụ:
For Each Cll In Range("C1:C" & lr)
là sai hoàn toàn. Lý ra phải là:
For Each Cll In ws.Range("C1:C" & lr)
Nói chung khi truy xuất 1 vị trí nào đó, nếu bạn không ghi địa chỉ đầy đủ thì mặc định nó sẽ lấy theo địa chỉ của cái nào đang active. Ngược lại, nếu bạn ghi rõ địa chỉ tuyệt đối thì đâu việc gì phải Select
-------------------
Ngoài lề chút: không biết biến lr trong code của bạn có tác dụng gì?

Em đã bỏ ws.select, sửa For Each Cll In Range("C1:C" & lr) thành For Each Cll In ws.Range("C1:C" & lr) như Thầy chỉ, và code chạy tốt, đã lấy dữ liệu tất cả các sheets
lr phía trên em quên thêm vào :
lr = Cells(Rows.Count, "C").End(xlUp).Row
em dùng lr vì em nghĩ như thế vòng for sẽ quét nhanh hơn nếu mình chọn ws.Range("C1:C65000)

Thầy cho em hỏi thêm:
Set rng = ws.Range("C1:C60000").SpecialCells(xlCellTypeConstants, 1)
- Số 1 bên trên có phải là :
xlNumbers
- Một cell có định dạng : Date thì sẽ được tính luôn ra giá trị số dạng hằng số
-Vì thế đối với cell dạng: Date sẽ được xác định là: hằng số + number
Mong Thầy hướng dẫn thêm cho em!
Em cảm ơn Thầy rất nhiều!
 
Em đã bỏ ws.select, sửa For Each Cll In Range("C1:C" & lr) thành For Each Cll In ws.Range("C1:C" & lr) như Thầy chỉ, và code chạy tốt, đã lấy dữ liệu tất cả các sheets
lr phía trên em quên thêm vào :bie
lr = Cells(Rows.Count, "C").End(xlUp).Row
em dùng lr vì em nghĩ như thế vòng for sẽ quét nhanh hơn nếu mình chọn ws.Range("C1:C65000)
Nếu vậy thì biến lr này thiết lập sai luôn. Đúng phải là
lr = ws.Cells(Rows.Count, "C").End(xlUp).Row
Thầy cho em hỏi thêm:
Set rng = ws.Range("C1:C60000").SpecialCells(xlCellTypeConstants, 1)
- Số 1 bên trên có phải là :
xlNumbers
- Một cell có định dạng : Date thì sẽ được tính luôn ra giá trị số dạng hằng số
-Vì thế đối với cell dạng: Date sẽ được xác định là: hằng số + number
Mong Thầy hướng dẫn thêm cho em!
Em cảm ơn Thầy rất nhiều!
Số 1 đúng đang nói đến number. Mà trong Excel thì number là nói chung tất cả dạng dữ liệu có thể TÍNH TOÁN được (cộng trừ nhân chia) nên đương nhiên Date cũng thuộc number (vì Date cũng cộng trừ nhân chia được)
 
Nếu vậy thì biến lr này thiết lập sai luôn. Đúng phải là
lr = ws.Cells(Rows.Count, "C").End(xlUp).Row

Số 1 đúng đang nói đến number. Mà trong Excel thì number là nói chung tất cả dạng dữ liệu có thể TÍNH TOÁN được (cộng trừ nhân chia) nên đương nhiên Date cũng thuộc number (vì Date cũng cộng trừ nhân chia được)

Em cảm ơn Thầy..!
 
Web KT
Back
Top Bottom