Cách Xử Lý Ngày Tháng Năm Trong Code VBA (2 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:
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 ngày 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
Theo tôi nghĩ có thể không lưu ngày trong ô A1 mà lưu vào regedit có được không? khi đó mình sẽ đọc từ khóa regedit mà không đọc từ A1.
 
Upvote 0
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
Sao mình xem mà chưa hiểu lắm . Vậy ý bạn là cứ qua ngày mới , mở ra thì D1 tăng thêm 1 ngày ; Ví dụ : Hôm này là 29/10/15+1 thì D1 là 30/10/15 , ngày mai 30/10/15, khi mở file D1 tăng lên 1 thành 31/10/15 hay ngày mai D1 =2, Ngày kia thành 3,4....
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy cũng ok nhờ bạn xử một tay
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


Function RegKeyDelete(i_RegKey As String) As Boolean
Dim myWS As Object


  On Error GoTo ErrorHandler
  Set myWS = CreateObject("WScript.Shell")
  myWS.RegDelete i_RegKey
  RegKeyDelete = True
  Exit Function


ErrorHandler:
  RegKeyDelete = False
End Function


Sub SetKeyDataValue(RegKeyRoot As Long, RegKeyName As String, KeyDataType As Long, KeyValueName As String, KeyValueDate As Variant)
  On Error Resume Next
    Dim OpenKey As Long, SetValue As Long, HKey As Long
    OpenKey = RegOpenKeyEx(RegKeyRoot, RegKeyName, 0, KEY_ALL_ACCESS, HKey)
    If (OpenKey <> 0) Then
        Call RegCreateKey(RegKeyRoot, RegKeyName, HKey)
    End If
    SetValue = RegSetValueEx(HKey, KeyValueName, 0&, KeyDataType, ByVal CStr(KeyValueDate & Chr$(0)), Len(KeyValueDate))
    SetValue = RegCloseKey(HKey)
End Sub


Function RegKeyRead(i_RegKey As String) As String
Dim myWS As Object
  On Error Resume Next
  Set myWS = CreateObject("WScript.Shell")
  RegKeyRead = myWS.RegRead(i_RegKey)
End Function
Function RegKeyExists(i_RegKey As String) As Boolean
Dim myWS As Object
 
  On Error GoTo ErrorHandler
  Set myWS = CreateObject("WScript.Shell")
  myWS.RegRead i_RegKey
  RegKeyExists = True
  Exit Function
   
ErrorHandler:
  RegKeyExists = False
End Function


Sub Auto_Open()
If (RegKeyExists("HKEY_CURRENT_USER\SOFTWARE\lDate") = True) Then
Dim m As Date
    m = RegKeyRead("HKEY_CURRENT_USER\SOFTWARE\lDate")
    If Date > m Then
        Call SetKeyDataValue(&H80000001, "SOFTWARE", 1, "lDate", Date)
        Sheet1.Range("D1").Value = Sheet1.Range("D1").Value + 1
    End If
Else
        Call SetKeyDataValue(&H80000001, "SOFTWARE", 1, "lDate", Date)
End If
End Sub
 
Upvote 0
Sao mình xem mà chưa hiểu lắm . Vậy ý bạn là cứ qua ngày mới , mở ra thì D1 tăng thêm 1 ngày ; Ví dụ : Hôm này là 29/10/15+1 thì D1 là 30/10/15 , ngày mai 30/10/15, khi mở file D1 tăng lên 1 thành 31/10/15 hay ngày mai D1 =12, Ngày kia thành 3,4....
Đúng vậy đó bạn...........Có nghĩa mỗi ngày [D1]+1
 
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


Function RegKeyDelete(i_RegKey As String) As Boolean
Dim myWS As Object


  On Error GoTo ErrorHandler
  Set myWS = CreateObject("WScript.Shell")
  myWS.RegDelete i_RegKey
  RegKeyDelete = True
  Exit Function


ErrorHandler:
  RegKeyDelete = False
End Function


Sub SetKeyDataValue(RegKeyRoot As Long, RegKeyName As String, KeyDataType As Long, KeyValueName As String, KeyValueDate As Variant)
  On Error Resume Next
    Dim OpenKey As Long, SetValue As Long, HKey As Long
    OpenKey = RegOpenKeyEx(RegKeyRoot, RegKeyName, 0, KEY_ALL_ACCESS, HKey)
    If (OpenKey <> 0) Then
        Call RegCreateKey(RegKeyRoot, RegKeyName, HKey)
    End If
    SetValue = RegSetValueEx(HKey, KeyValueName, 0&, KeyDataType, ByVal CStr(KeyValueDate & Chr$(0)), Len(KeyValueDate))
    SetValue = RegCloseKey(HKey)
End Sub


Function RegKeyRead(i_RegKey As String) As String
Dim myWS As Object
  On Error Resume Next
  Set myWS = CreateObject("WScript.Shell")
  RegKeyRead = myWS.RegRead(i_RegKey)
End Function
Function RegKeyExists(i_RegKey As String) As Boolean
Dim myWS As Object
 
  On Error GoTo ErrorHandler
  Set myWS = CreateObject("WScript.Shell")
  myWS.RegRead i_RegKey
  RegKeyExists = True
  Exit Function
   
ErrorHandler:
  RegKeyExists = False
End Function


Sub Auto_Open()
If (RegKeyExists("HKEY_CURRENT_USER\SOFTWARE\lDate") = True) Then
Dim m As Date
    m = RegKeyRead("HKEY_CURRENT_USER\SOFTWARE\lDate")
    If Date > m Then
        Call SetKeyDataValue(&H80000001, "SOFTWARE", 1, "lDate", Date)
        Sheet1.Range("D1").Value = Sheet1.Range("D1").Value + 1
    End If
Else
        Call SetKeyDataValue(&H80000001, "SOFTWARE", 1, "lDate", Date)
End If
End Sub
Cụ thể nó nằm ở key nào trong Registry vậy bạn mình mới tìm không thấy
 
Upvote 0
Ý tác giả là gán giá trị ngày đã lưu vào 1 biến mà có thể nhớ trong bộ nhớ máy tính, kể cả khi tắt máy mở lên ấy... Sáng hôm sau mở máy tính lên, code chạy thì lấy giá trị đã lưu cuối cùng lần trước + với 1...
Mình nghĩ chắc không phải vậy !
 
Lần chỉnh sửa cuối:
Upvote 0
Nhưng vẫn để là phải ý bạn không? nó nầm ở đây "HKEY_CURRENT_USER\SOFTWARE\lDate"
Bạn có thể đổi theo ý mình
Mình mới chỉnh lại ngày thử chạy thì ok rồi đó ... những key đó mình tìm lại vẫn ko thấy theo bạn chỉ
 
Upvote 0
đúng vậy đó ..mỗi một ngày thì [D1] chỉ +1 thôi
Tức là bạn muốn bỏ ngày tại A1 chỉ để ngày tại D1 và tự động tăng lên 1 ngày khi qua ngày mới , Không biết ý bạn có phải vậy không ? Nếu không đúng thì ...tèo .
 

File đính kèm

Upvote 0
Tức là bạn muốn bỏ ngày tại A1 chỉ để ngày tại D1 và tự động tăng lên 1 ngày khi qua ngày mới , Không biết ý bạn có phải vậy không ? Nếu không đúng thì ...tèo .
Không phải như vậy mà ý mình là mỗi ngày mới thì [D1] cộng thêm 1 là 2,3,4,5.... tăng lên theo số đến thôi chứ ko phải ngày
 
Upvote 0
Mình đã phân vân hỏi lại ở bài 4 bạn có trả lời mình đâu ? Nên mình phân vân không biết theo hướng nào !
Bạn thử nghĩ xem có hướng nào mà không liên quan đến Registry không nha... Mình muốn thử nhiều cách xem thế nào thôi....Sorry bạn bài 4 chưa kịp trả lời
 
Upvote 0
Bạn thử nghĩ xem có hướng nào mà không liên quan đến Registry không nha... Mình muốn thử nhiều cách xem thế nào thôi....Sorry bạn bài 4 chưa kịp trả lời
Theo mình nghĩ thì nếu lưu giá trị để đọc tiếp theo thì ngoài cách ghi ra file excel (Chính nó, hoặc file khác), file text thì chỉ ghi ra regedit thôi. Còn cao siêu hơn thì mình mù tịch chưa nghĩ ra hướng nào khác.
 
Upvote 0
Theo mình nghĩ thì nếu lưu giá trị để đọc tiếp theo thì ngoài cách ghi ra file excel (Chính nó, hoặc file khác), file text thì chỉ ghi ra regedit thôi. Còn cao siêu hơn thì mình mù tịch chưa nghĩ ra hướng nào khác.
Mình định sử dụng code sau ghi ra File Text nhưng thấy nó rắc rối quá không hay bằng Registry
Sau đó lại thêm mấy code nữa check nó.... còn viết một code cho nó gọn lại là quá khó với mình vậy là Tịt..
PHP:
Public Sub Create_Date()
    Dim B, Fs As Object
    Set Fs = CreateObject("Scripting.FileSystemObject")
    Set B = Fs.createtextfile(ThisWorkbook.Path & "\MyDate.txt", True, False)
    B.WriteLine Date ''Ghi ngay\Thang\Nam vao File Text
    B.Close
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử nghĩ xem có hướng nào mà không liên quan đến Registry không nha... Mình muốn thử nhiều cách xem thế nào thôi....Sorry bạn bài 4 chưa kịp trả lờ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ổ .....
 
Upvote 0
Web KT

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

Back
Top Bottom