Khai báo biến và kiểm tra thứ trong tuần.

Liên hệ QC

emgaingayngo

Thành viên hoạt động
Tham gia
9/2/07
Bài viết
141
Được thích
5
Tại Cell I22 của Sheet1 mình đặt tên là ChonNgay, và định dạng là dd/mm/yyyy.
Trong VBA mình muốn gán biến m= Range("ChonNgay").Value
Cho hỏi khai báo biến m như thế nào cho chính xác. Và cách dùng hàm WeekDay(m) như thế nào để kiểm tra số thứ tự của ngày trong tuần ?
Mong các bạn gíup đỡ. Cảm ơn nhiều.
 
Tại Sheet1 mình đặt tên là ChonNgay, và định dạng là dd/mm/yyyy.
Trong VBA mình muốn gán biến m= Range("ChonNgay").Value
Cho hỏi khai báo biến m như thế nào cho chính xác.
Bạn tham khảo code sau:
Mã:
[b]Sub DirNames()[/b]
 Dim NName, NTNam
    For Each NName In ThisWorkbook.Names
        If NName.Name = "ChonNgay" Then
            NTNam = Format(Range(NName.Value), "dd/mm/yyyy"):           MsgBox NTNam
        End If
    Next NName[b]
End Sub[/b]
)*&^)
 
Sao dài vậy SA_DQ ơi!
Dim Dai as String
Dai = Range("ChonDai").Text
Excel OK

Dim m as Date
m = Range("ChonNgay").???
Excel not Ok.
 
Lần chỉnh sửa cuối:
emgaingayngo đã viết:
Cho hỏi khai báo biến m như thế nào cho chính xác.
Không ổn rồi anh SQL ơi (gọi tắt cho dễ nhớ!), em gái đang muốn biết kiểu biến nào thích hợp nhất với dữ liệu ngày tháng. Nếu khai báo biến không tường minh như trên thì các biến mặc định có kiểu là Variant (Anything) như vậy sẽ không tối ưu.
1. Muốn biết sẽ dùng kiểu biến gì, em gái phải xác định giá trị sẽ gán vào là kiểu gì, ví dụ:
Ctrl+G: ?TypeName(Range("ChonNgay").Value)
Kết quả: Date
Như vậy cần khai báo biến ChonNgay As Date.
Cũng tùy theo, nếu bạn muốn Set ChonNgay= Range("ChonNgay") (không có "chấm" Value) thì biến chọn ngày nên được khai báo:
Dim ChonNgay As Range
vì ?TypeName(Range("ChonNgay")) là một Range
2. Cách dùng hàm WeekDay(m) như thế nào để kiểm tra số thứ tự của ngày trong tuần:
Thứ Hai là ngày đầu tuần - đương nhiên rồi! Nhưng với VBA thì ngày đầu tuần là Thứ mấy là tùy bạn. Hãy tham khảo ví dụ sau:
Ctrl+G:
?Weekday(vbMonday,vbMonday) = 1
KQ: TRUE
Đúng rồi! Nhưng:
?Weekday(vbMonday)
KQ: 2
Nghĩa là VBA mặc định ngày đầu tuần là Chủ Nhật đó:
?Weekday(vbSunday)
KQ: 1
Túm lại, thứ tự ngày trong tuần phụ thuộc vào tham số [FirstDayOfWeek] mà bạn chỉ định, nếu không chỉ định thì ngày đầu tuần là Chủ Nhật.
F1 {Weekday} để hiểu thêm về hàm này:
Mã:
[B][SIZE=2]
Constant[/SIZE]        [SIZE=2]Value[/SIZE]           [/B][SIZE=2][B]Description[/B]
[/SIZE][SIZE=2]vbUseSystem[/SIZE]       [SIZE=2]0[/SIZE]              [SIZE=2]Use the NLS API setting
[/SIZE][SIZE=2]vbSunday[/SIZE]         [SIZE=2]1[/SIZE]              [SIZE=2] Sunday (default)[/SIZE]
[SIZE=2]vbMonday[/SIZE]         [SIZE=2]2[/SIZE]               [SIZE=2]Monday
[/SIZE][SIZE=2]vbTuesday[/SIZE]        [SIZE=2]3[/SIZE]               [SIZE=2]Tuesday[/SIZE]
[SIZE=2]vbWednesday      [/SIZE] [SIZE=2]4[/SIZE]              [SIZE=2] Wednesday[/SIZE]
[SIZE=2]vbThursday[/SIZE]       [SIZE=2]5[/SIZE]               [SIZE=2]Thursday[/SIZE]
[SIZE=2]vbFriday[/SIZE]         [SIZE=2]6[/SIZE]              [SIZE=2] Friday
[/SIZE][SIZE=2]vbSaturday[/SIZE]       [SIZE=2]7[/SIZE]               [SIZE=2]Saturday[/SIZE]


 
Lần chỉnh sửa cuối:
Nếu để
Range("ChonNgay").value = Range("ChonNgay").Value + 1
thì chạy được
Còn xài :
Dim m as Date
m= Range("ChonNgay").Value
m=m+1
thì không chạy được.
Xin cho em hỏi tại sao vậy?
 
Dear emgai (không biết có ngây thơ thật không - hôm nào phải kiểm tra!)*&^))
-----------
Đoạn code rất ổn đấy chứ! Em gái kiểm tra lại xem, mã lỗi là gì?
 
Đọan mã tại command button có tên GiamNgay :
-----------------------------------------------------------------------
Private Sub cmdGiamNgay_Click()

If Range("ChonNgay").Value = Range("A1").Value Then
Range("ChonNgay").Value = Range("A1").Value
Else
If Range("ChonDai").Text = "Chính" Or Range("ChonDai").Text = "Phu" Then
Range("ChonNgay").Value = Range("ChonNgay").Value - 1
Else
Range("ChonNgay").Value = Range("ChonNgay").Value - 7
End If
End If

End Sub
-----------------------------------------------------------------------
Xài như dzậy thì nó hoạt động bình thường.
Sau đó em khai báo lại và thay thế :
-----------------------------------------------------------------------
Private Sub cmdGiamNgay_Click()
Dim Dai As String
Dim Ngay As Date
Dai = Range("ChonDai").Text
Ngay = Range("ChonNgay").Value
If Ngay = Range("A1").Value Then
Ngay= Range("A1").Value
Else
If Dai= "Chính" Or Dai= "Phu" Then
Ngay= Ngay - 1
Else
Ngay= Ngay - 7
End If
End If
End Sub
-----------------------------------------------------------------------
Click vào cmdGiamNgay thi gía trị trong cell không thay đổi và cũng không báo lỗi gì cả!!!
Tại sao kỳ vậy anh?
Dùng Toggle Breakpoint khi click chuột vào giá trị Ngay thì Ngay = ngay minh chon tren cell. điều đó có nghĩa là mình khai báo biến đúng phải không anh?

Tiếp tục
Dim m as integer
m = WeekDay(Ngay, vbSunDay)
Dùng Toggle Breakpoint khi click chuột vào giá trị Ngay thì Ngay = 12:00:00.AM và m = 0
Mong các bạn hướng dẫn giúp emgaingayngo với. Thanks much!
 
Mã:
[B]Private Sub cmdGiamNgay_Click()[/B]
If Range("ChonNgay").Value = Range("A1").Value Then
   Range("ChonNgay").Value = Range("A1").Value
Else
    If Range("ChonDai").Text = "Chính" Or Range("ChonDai").Text = "Phu" Then
    Range("ChonNgay").Value = Range("ChonNgay").Value - 1
    Else
    Range("ChonNgay").Value = Range("ChonNgay").Value - 7
    End If
End If
[B]End Sub[/B]
[COLOR="Purple"][B]'Sau đó em khai báo lại và thay thế :[/B][/COLOR]
[B]Private Sub cmdGiamNgay_Click()[/B]
Dim Dai As String
Dim Ngay As Date
Dai = Range("ChonDai").Text
Ngay = Range("ChonNgay").Value
If Ngay = Range("A1").Value Then
   Ngay= Range("A1").Value
Else
    If Dai= "Chính" Or Dai= "Phu" Then
    Ngay= Ngay - 1
    Else
    Ngay= Ngay - 7
    End If
End If
[B]End Sub[/B]
Click vào cmdGiamNgay thi gía trị trong cell không thay đổi và cũng không báo lỗi gì cả!!!
Dùng Toggle Breakpoint khi click chuột vào giá trị Ngay thì Ngay = ngay minh chon tren cell. điều đó có nghĩa là mình khai báo biến đúng phải không anh?
* Bạn chưa nói là ~ ô bạn gán tên đó mang ~ giá trị zì?
* Theo mình nên xài tiếng việt không dấu tại 'ChonTen'
* Có thể kiểm các biến = cách dùng Msgbox() tại nhiều vị trí # nhau một cách lần lượt!
 
Lần chỉnh sửa cuối:
Dear emgaingaytho,
---------------------
1. Trước khi gán một giá trị nào, emgai phải kiểm tra xem giá trị đó có hợp lệ không đã! Sử dụng công cụ Debug để kiểm tra các giá trị của biến và thuộc tính có đúng như mong muốn hay không từ đó đưa ra xử lý ngăn chặn lỗi
2. Điều quan trọng nhưng hình như bạn không để ý đó là mã lỗi (Err.Number) và mô tả lỗi (Err.Description) trên hộp thông điệp Run-time Error. Đây là kinh nghiệm cho người lập trình biết được lỗi cụ thể phát sinh từ hệ thống để có biện pháp xử lý. Nếu bạn cung cấp mã lỗi và mô tả này, rất có thể bạn nhận được sự trợ giúp nhanh hơn!
 
Đoạn mã trên không thông báo lỗi gì từ run-time error. Chỉ là khi click vào nút lệnh thì nó đứng im.
Còn lỗi sau là lỗi gì vậy anh Cường :

run-time error '1004'
Method 'Range' of object '_Global' failed

Xuất hiện tại dòng lệnh :

Range("ThuHai").Select

Xin chỉ em cách giải quyết. Em còn yếu lắm đó.
 
Dear emgaingaytho,
-------------------
Trong nhiều trường hợp, người sử dụng không cảm nhận được sự thay khi chương trình đang thực hiện. "Khi click vào nút lệnh thì nó đứng im" có thể rơi vào trường hợp đó? (cần phải hiểu rõ hơn "đứng im" theo nghĩa nào - treo máy hay "do nothing"). Chính vì vậy bạn cần sử dụng chức năng Debug để thi hành và kiểm tra từng dòng lệnh của chương trình. Trong trường hợp các dòng lệnh thực hiện tuần tự cho đến hết mà không phát sinh lỗi (Err.Number=0) thì chương trình không được coi là "có lỗi" mà có thể do giải thuật không đúng. Quan sát thủ tục cmdGiamNgay_Click() của bạn:
Mã:
Private Sub cmdGiamNgay_Click()
If [B][COLOR=blue]Range("ChonNgay").Value = Range("A1").Value[/COLOR][/B] Then
[B]  [COLOR=blue]Range("ChonNgay").Value = Range("A1").Value[/COLOR][/B]
Else
    If Range("ChonDai").Text = "Chính" Or Range("ChonDai").Text = "Phu" Then
        Range("ChonNgay").Value = Range("ChonNgay").Value - 1
    Else
        Range("ChonNgay").Value = Range("ChonNgay").Value - 7
    End If
End If
End Sub
Có thể thấy rằng giải thuật của bạn chưa được tối ưu ở điều kiện đầu tiên: điều kiện và xử lý giống nhau (còn có thể hiểu chúng có tính giao hoán: nếu A=B thì B=A). "Nếu A=B thì A=B" - hiển nhiên đúng và không sao cả! Nhưng hành động "Update Value" vào Range("ChonNgay") sẽ kéo theo đó là hàng loạt các sự kiện mà nếu không có kinh nghiệm sẽ không phát hiện ra: Calculate, Worksheet_Change...
Tất cả những điều này chưa giải thích được tại sao "nó đứng im" mà bạn cần nghiên cứu kỹ cách thức thực hiện (giải thuật) trước khi coding.

run-time error '1004'
Method 'Range' of object '_Global' failed

Lỗi trên chỉ rõ phương thức Range (của đối tượng Application) không đúng. Bạn kiểm tra lại xem đã định nghĩa Name này chưa, hoặc có thể không hiệu lực trên Sheet hiện hành (Sheet hiện hành vì bạn không chỉ ra tường minh Range("ThuHai") thuộc sheet nào).

Chắc chắn rằng mọi thiết kế đều đúng theo yêu cầu và code lập trình của bạn.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom