Cách Xử Lý Ngày Tháng Năm Trong Code VBA (3 người xem)

Liên hệ QC

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

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,538
Được thích
4,129
Giới tính
Nam
Mình có viết một code khi sang một ngày mới mở File Excel lên thì tại [D1] tăng thêm một và cứ như vậy mỗi ngày + 1 Nhưng code phải lệ thuộc vào [A1] để nó kiểm tra ngày xong thì mới chạy code...

Vậy mình mong muốn nó kiểm tra Date ngay từ trong code luôn mà không lệ thuộc vào [A1] có được không... nếu được nhờ các Bạn trợ Giúp
Xin cảm ơn
PHP:
Sub Auto_Open()
With ActiveSheet
    If Date > .Range("A1") Then
        .Range("A1").Value = Date
        .Range("D1").Value = .Range("D1").Value + 1
    End If
End With
End Sub
 
Lần chỉnh sửa cuối:
người ta viết phần mềm phải suy nghĩ nên ghi các giá trị thiết lập vào đâu để lần chạy sau vẫn còn mà xài . Ở đây có sẵn cái file Excel lưu giá trị quá sướng thì lại nghĩ đến chuyện lưu giá trị vào 1 nơi khác ngoài Excel =))
Đời là bể khổ .....
Mình thấy cách nói này đáng suy ngẫm nè! --=0 --=0 --=0 //**/ //**/ //**/
Có khi xa tận chân trời mà gần ngay trước mắt.
 
Upvote 0
người ta viết phần mềm phải suy nghĩ nên ghi các giá trị thiết lập vào đâu để lần chạy sau vẫn còn mà xài . Ở đây có sẵn cái file Excel lưu giá trị quá sướng thì lại nghĩ đến chuyện lưu giá trị vào 1 nơi khác ngoài Excel =))
Đời là bể khổ .....
Tình là dây oan...............
thật ra ngồi buồn nghĩ cách ra quậy thôi mà .....
 
Lần chỉnh sửa cuối:
Upvote 0
Tình là dây oan...............
thật ra ngồi buồn nghĩ cách ra quậy thôi mà .....
Thực ra nhiều lúc quậy rồi mới ra vấn đề , nếu không được cũng biết làm thế không được. Vây bạn thử thêm file này xem đúng ý bạn không . Mình hỏi bài 4 vì mình nghĩ chắc bạn muốn theo dõi làm vấn đề gì đó được bao nhiêu ngày rồi ! Lấy date - ngày cố định (42300). Sửa 42300 thành ngày bắt đầu . Mình nghĩ nó theo dõi được số ngày liên tục đến khi không thích nó nữa !
 

File đính kèm

Upvote 0
Cách giản dị nhất là đặt một name. Ví dụ DEMNGAY
Nếu muốn giấu kỹ nó một chút thì đặt name trong một sheet và giấu kỹ sheet đó đi.

Dùng registry là phương pháp không bảo đảm chất lượng dữ liệu (*). Nếu người ta copy file ra nhiều mẫu thì kết quả có thể không như ý muốn.

(*) tôi chỉ nói về dữ liệu của chính file này. Sự lạm dung khiến registry ngày càng nở to phình là một việc khác hoàn toàn.
 
Upvote 0
Bạn thêm code này vào module:
Mã:
Public Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" ( _
    ByVal HKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
    ByVal samDesired As Long, ByRef phkResult As Long) As Long
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" ( _
    ByVal HKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" ( _
    ByVal HKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
    ByVal dwType As Long, LPData As Any, ByVal cbData As Long) As Long
Public Declare Function RegCloseKey Lib "advapi32" (ByVal HKey As Long) As Long


.................[/QUOTE]
Cái gì mà kinh khủng vậy trời?
Liên quan đến việc lưu và lấy giá trị từ Registry, ta có hàm [B]SaveSetting, GetSetting[/B] để làm gì mà không xài?
Ví dụ đơn giản:
[code]
Private Sub Auto_Open()
  Dim lCount As Long
  lCount = GetSetting("MySettings", "CountSeq", "Count", 0)
  lCount = lCount + 1
  SaveSetting "MySettings", "CountSeq", "Count", lCount
  MsgBox lCount
End Sub
Biến lCount chính là thứ ta cần
 
Upvote 0
Cái gì mà kinh khủng vậy trời?
Liên quan đến việc lưu và lấy giá trị từ Registry, ta có hàm SaveSetting, GetSetting để làm gì mà không xài?
Ví dụ đơn giản:
Mã:
Private Sub Auto_Open()
  Dim lCount As Long
  lCount = GetSetting("MySettings", "CountSeq", "Count", 0)
  lCount = lCount + 1
  SaveSetting "MySettings", "CountSeq", "Count", lCount
  MsgBox lCount
End Sub
Biến lCount chính là thứ ta cần
Em nhìn thấy cái mớ API là sợ rồi vì nếu Em chưa biết gì về code thì ok ..còn lại Em cũng biết một chút code két mà xài không làm chủ được nó thì tức lắm...+-+-+-+
Có thể thay cái mớ API cho code SetKeyDataValue đó thành code sau cũng ok
PHP:
Function AddValueToKeyExist(ByVal KeyExists As String, ByVal Name As String, Value, ByVal type_As String)
    CreateObject("WScript.Shell").RegWrite KeyExists & "\" & Name, Value, type_
End Function
Còn code Auto_Open Liên quan đến cái help Em tìm hoài ko ra...sau đó cũng Tìm ra...
và thắc mắc câu Lần đầu tiên sử dụng thì chắc chắn cửa sổ Help sẽ hiện ra. Đọc kỹ hướng dẫn trong đó là được rồi: (Bài #15)

Em Tìm hoài Rồi cuối cùng Em cũng tìm ra nó nằm ở đâu .... Anh tài thiệt

http://www.giaiphapexcel.com/forum/showthread.php?84992-Code-save-as-sheet-hiện-hành/page2

Cảm ơn Anh Nhiều

 
Lần chỉnh sửa cuối:
Upvote 0
Khôi Phục lại Bộ đếm code Bài #28
PHP:
Private Sub Reset_Auto_Open()
    Dim lCount As Long
    lCount = GetSetting("MySettings", "CountSeq", "Count", 0)
    If lCount > 1 Then DeleteSetting "MySettings", "CountSeq", "Count"
End Sub
 
Upvote 0
Từ bài #28 của Anh Ndu thì mình dựa vào code đó Viết thành hàm CountDate() để tính mỗi ngày Mở File Excel lên thì tại [A1] +1 tăng dần lên mà chưa được.....Vậy có cách nào để viết chung vào hàm đó mà mỗi ngày mở file lên thì tại [A1] + thêm 1 tăng dần lên không........Nhờ các Bạn chỉ giúp ....Xin cảm ơn
PHP:
Function CountDate() As Long
    Dim lCount As Long
    lCount = GetSetting("MySettings", "CountSeq", "Count", 0)+1     
    SaveSetting "MySettings", "CountSeq", "Count", lCount
    CountDate = lCount
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Từ bài #28 của Anh Ndu thì mình dựa vào code đó Viết thành hàm CountDate() để tính mỗi ngày Mở File Excel lên thì tại [A1] +1 tăng dần lên mà chưa được.....Vậy có cách nào để viết chung vào hàm đó mà mỗi ngày mở file lên thì tại [A1] + thêm 1 tăng dần lên không........Nhờ các Bạn chỉ giúp ....Xin cảm ơn
PHP:
Function CountDate() As Long
    Dim lCount As Long
    lCount = GetSetting("MySettings", "CountSeq", "Count", 0)+1     
    SaveSetting "MySettings", "CountSeq", "Count", lCount
    CountDate = lCount
End Function
Thử cách này, mình nghĩ là có thể hạn chế được cái vụ sửa ngày tháng trong hệ thống
PHP:
Private Sub Auto_Open()
  Dim lCount As Long

  lCount = GetSetting("MySettings", "CountSeq", "Count", 0)
    If lCount = 0 Then
        lCount = Date
    Else
        If Date + 1 <> lCount Then lCount = lCount + 1
    End If
  SaveSetting "MySettings", "CountSeq", "Count", lCount
  MsgBox lCount
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thử cách này, mình nghĩ là có thể hạn chế được cái vụ sửa ngày tháng trong hệ thống
PHP:
Private Sub Auto_Open()
  Dim lCount As Long
  MsgBox CLng(Date)
  lCount = GetSetting("MySettings", "CountSeq", "Count", 0)
    If lCount = 0 Then
        lCount = Date
    Else
        If Date + 1 <> lCount Then lCount = lCount + 1
    End If
  SaveSetting "MySettings", "CountSeq", "Count", lCount
  MsgBox lCount
End Sub
Em cũng có mấy cách rồi ....Nhưng em vẫn phải học và tham khảo thêm rất nhiều cách khác nữa
Anh rất hiểu ý em.......}}}}}}}}}}

Vẫn chưa được nếu một ngày mở lên 100 lần thì sao Anh
 
Lần chỉnh sửa cuối:
Upvote 0
Em cũng có mấy cách rồi ....Nhưng em vẫn phải học và tham khảo thêm rất nhiều cách khác nữa
Anh rất hiểu ý em.......}}}}}}}}}}

Vẫn chưa được nếu một ngày mở lên 100 lần thì sao Anh
Thì đã giao kèo là trong ngày muốn mở lên bao nhiêu lần thì tuỳ. Nhưng qua ngày mới thì biến Lcount mới tăng lên 1 mà.
 
Upvote 0
Thì mỗi lần chạy nó tăng 1 thì em mới nói....nếu em chạy 100 lần thì nó tăng 100 lần vậy
Trước hết phải Reset lại bộ đếm. Lúc này Lcount = 0. Khi mở file Lcount sẽ được gán giá trị = date. Lần tiếp theo mở file, Lcount = date thì lấy gì mà tăng lên chứ.
................................

Thử lại bằng cách Reset bộ đếm trước. Sau đó đổi chỗ này Lcount = date +1
 
Lần chỉnh sửa cuối:
Upvote 0
Trước hết phải Reset lại bộ đếm. Lúc này Lcount = 0. Khi mở file Lcount sẽ được gán giá trị = date. Lần tiếp theo mở file, Lcount = date thì lấy gì mà tăng lên chứ.
................................

Thử lại bằng cách Reset bộ đếm trước. Sau đó đổi chỗ này Lcount = date +1

Nếu ngày hôm nay mở file. 100 ngày tiếp theo không mở file, ngày thứ 101 mở file 100 lần thì mỗi lần bộ đếm tăng 1. Chưa đúng yêu cầu.
Sao không làm như bài #1? So ngày hiện tại với ngày đã lưu, nếu lớn hơn thì lưu ngày hiện tại và tăng bộ đếm 1 đơn vị.
 
Upvote 0
Nếu ngày hôm nay mở file. 100 ngày tiếp theo không mở file, ngày thứ 101 mở file 100 lần thì mỗi lần bộ đếm tăng 1. Chưa đúng yêu cầu.
Sao không làm như bài #1? So ngày hiện tại với ngày đã lưu, nếu lớn hơn thì lưu ngày hiện tại và tăng bộ đếm 1 đơn vị.
Chính xác như dòng màu đỏ vậy . Mỗi ngày cho dù có mở 100 lần thì [A1] cũng chỉ cộng thêm 1 và Nếu như 10 ngày sau mở tiếp thì [A1] cũng chỉ cộng tiếp thêm 1
 
Upvote 0
Chính xác như dòng màu đỏ vậy . Mỗi ngày cho dù có mở 100 lần thì [A1] cũng chỉ cộng thêm 1 và Nếu như 10 ngày sau mở tiếp thì [A1] cũng chỉ cộng tiếp thêm 1
Nếu đã hiểu rõ phương thức SaveSetting, GetSetting, DeleteSetting rồi thì phải biến tuỳ biến mới có thể tạo ra 1 đoạn code như ý. Chẳng hạn như ta tạo câu lệnh SaveSetting "MySettings", "CountSeq", "Count", lCount thì phải biết được trong Registry nó tạo ra cái gì. Ngoài cái CountSeq được tạo ra, ta có thể tạo thêm CountSeq2, CountSeq3... để chứa hết những điều kiện ta muốn. Những dạng code này không thể phơi hết ra đây được đâu.
 
Upvote 0
Theo tôi còn 1 phương pháp đơn giản hơn, đó là ghi vào 1 dòng ghi chú trong Code.

Mở file so sánh ngày và nhảy giá trị trong ghi chú Code.
 
Upvote 0
Theo tôi còn 1 phương pháp đơn giản hơn, đó là ghi vào 1 dòng ghi chú trong Code.

Mở file so sánh ngày và nhảy giá trị trong ghi chú Code.
Edit ghi chú trong code? Vụ này mới mình chưa thấy lần nào. Viết anh xem 1 cái demo đi Ninh.
 
Upvote 0
Web KT

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

Back
Top Bottom