Cách Xử Lý Ngày Tháng Năm Trong Code VBA (1 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,133
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
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
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.
Anh Hải lại trêu em rồi.
Ý tưởng của em là thế này:

Tạo 1 Module Test để ghi 2 ghi chú:

1/ Số lần mở: Opened times
2/ Ngày mở cuối cùng: Last Opened

Sau đó dùng Code khi mở Wb để xử lý cái ghi chú này. Việc ghi thẳng vào ghi chú này sẽ đơn giản hơn chỉ có điều phải tick Trust access to the VBA project model trong Macro setting.

Mã:
Sub Test()
On Error Resume Next


Dim OpTimes As Long
Dim LastOpened As Date
Dim CurDate As Date


With ThisWorkbook.VBProject.VBComponents("Test").CodeModule
    OpTimes = CLng(Right(.Lines(1, 1), 4))
    LastOpened = CDate(Right(.Lines(2, 1), 10))
    CurDate = VBA.DateSerial(Year(Now()), Month(Now()), Day(Now()))
    If LastOpened < CurDate Then
    .DeleteLines 1, 1
    .InsertLines 1, "'Opened Times: " & Format(OpTimes + 1, "0000")
    .DeleteLines 2, 1
    .InsertLines 2, "'Last Opened: " & Format(CurDate, "mm/dd/yyyy")
    End If
End With


On Error GoTo 0
End Sub

Đúng là múa rìu qua mắt thợ rồi. +-+-+-+
 
Upvote 0
Anh Hải lại trêu em rồi.
Ý tưởng của em là thế này:

Tạo 1 Module Test để ghi 2 ghi chú:

1/ Số lần mở: Opened times
2/ Ngày mở cuối cùng: Last Opened

Sau đó dùng Code khi mở Wb để xử lý cái ghi chú này. Việc ghi thẳng vào ghi chú này sẽ đơn giản hơn chỉ có điều phải tick Trust access to the VBA project model trong Macro setting.

Mã:
Sub Test()
On Error Resume Next


Dim OpTimes As Long
Dim LastOpened As Date
Dim CurDate As Date


With ThisWorkbook.VBProject.VBComponents("Test").CodeModule
    OpTimes = CLng(Right(.Lines(1, 1), 4))
    LastOpened = CDate(Right(.Lines(2, 1), 10))
    CurDate = VBA.DateSerial(Year(Now()), Month(Now()), Day(Now()))
    If LastOpened < CurDate Then
    .DeleteLines 1, 1
    .InsertLines 1, "'Opened Times: " & Format(OpTimes + 1, "0000")
    .DeleteLines 2, 1
    .InsertLines 2, "'Last Opened: " & Format(CurDate, "mm/dd/yyyy")
    End If
End With


On Error GoTo 0
End Sub

Đúng là múa rìu qua mắt thợ rồi. +-+-+-+
Mình mới thử chạy nó Êm du.......không biết xài nó kiểu gì........--=0
 
Upvote 0
Mình mới thử chạy nó Êm du.......không biết xài nó kiểu gì........--=0
Bạn tạo 1 module Test, sau đó cho vào đầu dòng lệnh số 1, 2 đoạn ghi chú
Mã:
'Opened Times: 0000
'Last Opened: 10/30/2015

Tại sự kiện Workbook_open thì gọi Sub Test lên.

Phần ghi chú Opened Times sẽ nhảy khi mở Workbook lần đầu tiên trong ngày.

Chú ý tick Trust access to the VBA project model trong Macro setting.
 
Upvote 0
Bạn tạo 1 module Test, sau đó cho vào đầu dòng lệnh số 1, 2 đoạn ghi chú
Mã:
'Opened Times: 0000
'Last Opened: 10/30/2015

Tại sự kiện Workbook_open thì gọi Sub Test lên.

Phần ghi chú Opened Times sẽ nhảy khi mở Workbook lần đầu tiên trong ngày.

Chú ý tick Trust access to the VBA project model trong Macro setting.
Thông thường nếu không có gì bí mật thì người ta lưu trực tiếp trên sheet hoặc name cho đơn giản. Nếu muốn dấu thì ít ra người ta cũng khóa VBA, vậy làm sao mà đọc với ghi ghi chú đây?
Ngoài ra, tùy mục đích mà nên chọn ghi thông tin ở đâu. Ví dụ như nếu bạn muốn giới hạn số lần sử dụng thì không nên lưu thông tin trên file để tránh trường hợp người ta copy ra nhiều file, ngược lại nếu thông tin phục vụ cho dữ liệu của file thì lưu trên file để đảm bảo đồng bộ dữ liệu khi sử dụng cùng lúc nhiều file.
 
Upvote 0
Anh Hải lại trêu em rồi.
Ý tưởng của em là thế này:

Tạo 1 Module Test để ghi 2 ghi chú:

1/ Số lần mở: Opened times
2/ Ngày mở cuối cùng: Last Opened

Sau đó dùng Code khi mở Wb để xử lý cái ghi chú này. Việc ghi thẳng vào ghi chú này sẽ đơn giản hơn chỉ có điều phải tick Trust access to the VBA project model trong Macro setting.

Mã:
Sub Test()
On Error Resume Next


Dim OpTimes As Long
Dim LastOpened As Date
Dim CurDate As Date


With ThisWorkbook.VBProject.VBComponents("Test").CodeModule
    OpTimes = CLng(Right(.Lines(1, 1), 4))
    LastOpened = CDate(Right(.Lines(2, 1), 10))
    CurDate = VBA.DateSerial(Year(Now()), Month(Now()), Day(Now()))
    If LastOpened < CurDate Then
    .DeleteLines 1, 1
    .InsertLines 1, "'Opened Times: " & Format(OpTimes + 1, "0000")
    .DeleteLines 2, 1
    .InsertLines 2, "'Last Opened: " & Format(CurDate, "mm/dd/yyyy")
    End If
End With


On Error GoTo 0
End Sub

Đúng là múa rìu qua mắt thợ rồi. +-+-+-+
Cũng là ý tưởng hay để tham khảo. Nhưng nếu có nhu cầu thì anh sẽ sử dụng file .dll và dùng phương thức SaveSetting chắc cũng tạo ra được đoạn code theo ý riêng.
 
Upvote 0

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

Back
Top Bottom