Tiếng Việt trong gán giá trị cho ô

Liên hệ QC

dnphuonganh

Thành viên mới
Tham gia
15/10/07
Bài viết
36
Được thích
6
Chào các anh, em đang học VBA theo bài giảng của thầy Hướng trên GPE, có ví dụ sau:
Sub Hocluc()
Sheets(“Sheet1”).Select
Range(“A1”).Select
If ActiveCell >= 8 Then
Range(“B2”).Value = “Học lực giỏi”
ElseIf ActiveCell >= 6.5 Then
Range(“B2”).Value = “Học lực khá”
ElseIf ActiveCell >= 5 Then
Range(“B2”).Value = “Học lực trung bình”
Else
Range(“B2”).Value = “Học lực kém”
End If
End Sub
Cho em hỏi: Tại sao không hiển thị được tiếng Việt trong ô B2 như mong muốn?
Mong các anh giúp đỡ.
 
Nói chung vẫn còn lỗi Tigertiger à... Khi bạn quét chọn từ A1:A10 và xóa sạch thì bên cột B cứ im re.. (mà lý ra nó phải rỗng theo mới hợp lý)... Và còn 1 lỗi khá nặng ký nữa, đó là người ta cắc cớ ko nhập số mà nhập Text thì sao?... Tôi nghĩ nếu ko là FOR thì khó lòng đạt dc yêu cầu này...
Thật sự qua topic này tôi mới nắm vững dc Target nghĩa là cái quái gì.. hic... Cảm ơn tác giã dnphuonganh
(Với Tigertiger: đang muốn dụ dỗ thêm người học For với tôi mà bạn... he.. he..)
ANH TUẤN
 
Lần chỉnh sửa cuối:
Upvote 0
Khi bạn quét chọn từ A1:A10 và xóa sạch thì bên cột B cứ im re.. (mà lý ra nó phải rỗng theo mới hợp lý)... Và còn 1 lỗi khá nặng ký nữa, đó là người ta cắc cớ ko nhập số mà nhập Text thì sao?... Tôi nghĩ nếu ko là FOR thì khó lòng đạt dc yêu cầu này...
oh, nếu chỉ xóa thì xử lý thế này a ah:
PHP:
Option Explicit

Private Sub WorkSheet_Change(ByVal Target As Range)
Dim Rw As Integer
     If Not Intersect(Range("A1:A10"), Target) Is Nothing Then
         On Error Resume Next
     
         Rw = Target.Row
         If Target.Cells.Count > 1 Then
            Range(Cells(Rw, 2), Cells(Rw + Target.Cells.Count - 1, 2)).ClearContents
         End If
         
         If Target.Value = "" Then
             Cells(Rw, 2) = ""
         Exit Sub
         End If
         Select Case Target.Value
                Case Is >= 8
                Cells(Rw, 2).Value = "G"
                Case Is >= 6
                Cells(Rw, 2).Value = "K"
                Case Is >= 5
                Cells(Rw, 2).Value = "TB"
                Case Is >= 0
                Cells(Rw, 2).Value = "Kem"
         End Select
     End If
End Sub
Tuy nhiên còn lỗi nếu nhập đồng thời nhiều cell - ko biết có cách nào ko-> khi này dùng FOR - ha ha ha vòng FOR rất hay, nên tìm hiểu FOR tại đây: http://www.giaiphapexcel.com/forum/showthread.php?t=6354

--=--
 
Lần chỉnh sửa cuối:
Upvote 0
113-gpe

Cảm ơn các anh nhiều. Những tưởng đến bài số #7 đã đạt mục tiêu của em, vậy mà càng "xem" các anh tranh luận càng rối tinh rối mù.
Chắc phải bookmark trang chủ với tên là 113-GPE thôi!
Cho em hỏi thêm một chút: Cái Option Explicit ở bài của anh Tiger nghĩa là gì vậy?
 
Lần chỉnh sửa cuối:
Upvote 0
Còn 1 lỗi nữa Tigertiger ơi... Đó là nhập text nó ra kết quả là giõi... ha.. ha..
Nếu dùng FOR thì.. đây:
PHP:
Private Sub WorkSheet_Change(ByVal Target As Range)
     If Not Intersect(Range("A1:A10"), Target) Is Nothing Then
         For i = 1 To 10
             If IsNumeric(Cells(i, 1)) = False Then
                    Cells(i, 2).Value = ""
             ElseIf Cells(i, 1).Value = "" Then
                    Cells(i, 2).Value = ""
             ElseIf Cells(i, 1).Value >= 8 Then
                    Cells(i, 2).Value = "G"
             ElseIf Cells(i, 1).Value >= 6 Then
                    Cells(i, 2).Value = "K"
             ElseIf Cells(i, 1).Value >= 5 Then
                    Cells(i, 2).Value = "TB"
             ElseIf Cells(i, 1).Value >= 0 Then
                    Cells(i, 2).Value = "Kem"
             End If
         Next i
     End If
End Sub
ANH TUẤN
 
Upvote 0
Chào bạn dnphuonganh!
Tôi nghĩ ra 1 cách củ chuối có thể giúp bạn dùng tiếng Việt Unicode dc trong VBA đấy:
-Bạn tạo 1 danh mục tại 1 khối cell nào đó, ví dụ tại cell H1 bạn gõ chử Giõi, H2 gõ chử Khá... vân vân...
-Trong VBA ngay mấy chổ code ghi Cells(i, 2).Value = "G" bạn sửa lại thành Cells(i, 2).Value = Range("H1").Value
-Sửa luôn những cái còn lại nữa là khỏi mất công suy nghĩ (giống như ta VLOOKUP trong công thức Excel vậy)
he... he...

 
Upvote 0
Cảm ơn anh anhtuan1066, cách của anh tuy củ chuối nhưng hay, không phải lăn tăn gì về bảng mã cả!
Em xin các anh chỉ dẫn "nâng cao" một chút:
Cũng bài ví dụ trên, bây giờ em muốn nó chọn nhẫu nhiên một dòng text trong vài dòng text mà ta nhập vào code. Ví dụ:
Nếu A1=10 thì:
B1 lấy ngẫu nhiên: Hoặc - " Học giỏi quá"
Hoặc - " Rất siêng năng"
(Mong các anh thông cảm, em đang "ăn mày mà đòi xôi gấc")
 
Upvote 0
Cho em hỏi thêm một chút: Cái Option Explicit ở bài của anh Tiger nghĩa là gì vậy?

là lựa chọn khi có nó đầu module thì VBE sẽ kiểm tra cả việc khai báo biến (lựa chọn bắt buộc biến sd phải được khai báo trước

Khi lập trình thì tốt nhất là trước khi sd biến nên khai báo -> như thế dễ kiểm soát và chuyên nghiệp hơn -> đã có chủ đề bàn vđề này nên tigertiger k bàn thêm nữa -> bạn có thể search nó trên diễn đàn GPE này
 
Upvote 0
dnphuonganh đã viết:
Cảm ơn anh anhtuan1066, cách của anh tuy củ chuối nhưng hay, không phải lăn tăn gì về bảng mã cả!
Em xin các anh chỉ dẫn "nâng cao" một chút:
Cũng bài ví dụ trên, bây giờ em muốn nó chọn nhẫu nhiên một dòng text trong vài dòng text mà ta nhập vào code. Ví dụ:
Nếu A1=10 thì:
B1 lấy ngẫu nhiên: Hoặc - " Học giỏi quá"
Hoặc - " Rất siêng năng"
(Mong các anh thông cảm, em đang "ăn mày mà đòi xôi gấc")
Tôi nghĩ ra 1 cách kết hợp giữa công thức và VBA... Mời bạn xem file thử thế nào (tôi vẫn chưa rõ là đễ làm cái gì nữa)... hi.. hi...
ANH TUẤN
 

File đính kèm

Upvote 0
anhtuan1066 đã viết:
Tôi nghĩ ra 1 cách kết hợp giữa công thức và VBA... Mời bạn xem file thử thế nào (tôi vẫn chưa rõ là đễ làm cái gì nữa)... hi.. hi...
ANH TUẤN

Sao lại phải dùng biến Cells(i,2) làm gì bác ??? Target đâu rồi ???
Sao lại phải dùng For ??? Mỗi lần thay đổi là chạy lại toàn bộ à ???

Thân!
 
Upvote 0
Mr Okebab đã viết:
Sao lại phải dùng biến Cells(i,2) làm gì bác ??? Target đâu rồi ???
Sao lại phải dùng For ??? Mỗi lần thay đổi là chạy lại toàn bộ à ???

Thân!
BÀI TẬP CHO NGƯỜI MỚI BẮT ĐẦU
Nếu Bắp ko FOR thì Bắp thử ra 1 code có thể đạt dc tất cả những điều kiện mà tôi đã nói qua các bài viết ở trên xem!
 
Upvote 0
anhtuan1066 đã viết:
BÀI TẬP CHO NGƯỜI MỚI BẮT ĐẦU
Nếu Bắp ko FOR thì Bắp thử ra 1 code có thể đạt dc tất cả những điều kiện mà tôi đã nói qua các bài viết ở trên xem!

Không phải là em nói code của bác sai hay không tốt, mà ý của em là em . . không hiểu câu hỏi đề bài ra.

VD như của bác thì mỗi lần thay đổi là nó chạy từ A1:A10 luôn, tại sao lại như thế (ý là câu hỏi như thế nào mà lại cần như thế)
File của bác, khi em nhập vào các số 14 hoặc 17 thì nó thành tuyệt lắm, hàng trên nó cũng vậy.

Quả thực là em không hiểu. Híc híc

Thân!
 
Upvote 0
Thì Bắp đọc lại từ bài 1 sẽ hiểu mà...
Nhập số vào---> xuất ra xếp loại, chỉ vậy thôi... Có điều giã sử ta xóa toàn bộ cột A thì phải bảo đãm cột B rỗng... hoặc ta kéo fill cột A hoặc copy nơi khác vào (tức nhập điễm hàng loat) thì cũng phải xếp loại dc... hoặc ta nhập test vào thì cột B rỗng...
Ý tôi là ngoài cách của tôi ra Bắp còn cách nào khác hay hơn ko? Tôi cũng biết dùng FOR là tốn kém tài nguyên.. nhưng thật sự ko nghĩ ra dc cách khác
Còn cái vụ số 14 hoặc 17 thì đâu có vấn đề gì... điễm luôn <=10.. nếu muốn chắc thì rào thêm d/k nữa
Cách thì có rất nhiều (Function chẳng hạn).. tuy nhiên nên chú ý đây là bài tập cho người mới bắt đầu, cũng ko nên phức tạp quá... Dù sao với yêu cầu trên hoàn toàn có thể làm dc bằng công thức.. cái chính là bạn ấy đang học lập trình trên sách của thầy Hướng đấy Bắp à
ANH TUẤN
 
Lần chỉnh sửa cuối:
Upvote 0
Thì Bắp đọc lại từ bài 1 sẽ hiểu mà...
.......còn cách nào khác hay hơn ko? Tôi cũng biết dùng FOR là tốn kém tài nguyên.. nhưng thật sự ko nghĩ ra dc cách khác
Còn cái vụ số 14 hoặc 17 thì đâu có vấn đề gì... điễm luôn <=10.. nếu muốn chắc thì rào thêm d/k nữa
............
......... tuy nhiên nên chú ý đây là bài tập cho người mới bắt đầu, cũng ko nên phức tạp quá... Dù sao với yêu cầu trên hoàn toàn có thể làm dc bằng công thức.. cái chính là bạn ấy đang học lập trình trên sách của thầy Hướng đấy Bắp à
ANH TUẤN

oh, atuan... lun nói là cho ng bắt đầu -> mà a cứ mở rộng bài toán nặng ra vậy, -> lại phải FOR

hi iiiiiiiiiii
chắc là tigertiger sẽ xem lại cách đơn giản hơn
.
 
Lần chỉnh sửa cuối:
Upvote 0
Trong ví dụ này For rất đơn giãn mà bạn... đâu thấy chổ nào nặng ký đâu nhỉ?
He...he... Bạn ấy THANSK chắc là đã hiểu rồi còn gì...
Tôi cũng mong có cách nào đó ko dùng FOR, ko phải vì sự đơn giãn hay phức tạp, mà vì FOR ở đây hơi phí của
ANH TUẤN
 
Upvote 0
anhtuan1066 đã viết:
Chào bạn dnphuonganh!
Tôi nghĩ ra 1 cách củ chuối có thể giúp bạn dùng tiếng Việt Unicode dc trong VBA đấy:
-Bạn tạo 1 danh mục tại 1 khối cell nào đó, ví dụ tại cell H1 bạn gõ chử Giõi, H2 gõ chử Khá... vân vân...
-Trong VBA ngay mấy chổ code ghi Cells(i, 2).Value = "G" bạn sửa lại thành Cells(i, 2).Value = Range("H1").Value
-Sửa luôn những cái còn lại nữa là khỏi mất công suy nghĩ (giống như ta VLOOKUP trong công thức Excel vậy)
he... he...
Qua học hỏi từ diễn đàn và vận dụng vào lập trình VBA Excel, tôi viết Unicode tiếng Việt bằng 3 cách. Xin nêu lên và các bạn bổ sung thêm:
1. Nhập chuỗi vào 1 ô trên vào bảng tính, viết lệnh truy xuất nó. Ví dụ nhập vào ô A1 của sheet2 câu trên. Câu lệnh viết:
Cells(1, 2) = Sheets("Sheet2").Cells(1,1)
Cách này đơn giản, nhưng bảng tính phải có 1 sheet chứa các chuỗi này. Nếu có ai đó chỉnh, xóa dữ liệu thì hỏng.
2. Dùng phép nối chuỗi và hàm ChrW để viết:
Câu trên viết thành:
Cells(1,2)= L" & ChrW(7853) & "p trình v" & ChrW(7899) & "i Excel"
Cách này rắc rối vì phải biết mã ậ=7953, ớ=7899, nhưng nó được viết ngay trong module, người sử dụng khó thay đổi được (bạn tham khảo bảng mã trong tập tin CodeUnicode.xls).
3. Dùng 1 hàm tự viết để hỗ trợ cách 2 (hàm UniVba). Cách sử dụng như sau:
- Nhập chuỗi cần viết vào 1 ô trong bàng tính. Ví dụ nhập vào ô A1 chuỗi “Xử lý tiếng Việt”.
- Ô B1 nhập công thức =univba(A1), hàm sẽ cho kết quả:
"X" & ChrW(7917) & " lý ti" & ChrW(7871) & "ng Vi" & ChrW(7879) & "t"
Hàm UniVba dò tìm từng ký tự trong chuỗi, nếu ký tự nào có mã > 255 sẽ chuyển thành ChrW(mã) và ghép chúng bằng phép &.
Bạn copy ô B1 và dán vào module, rất nhanh và chính xác.
‘===========
Mã:
[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]Function UniVba(TxtUni As String) As String[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]If TxtUni = "" Then[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]  UniVba = """"""[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]Else[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]  TxtUni = TxtUni & " "[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]  If AscW(Left(TxtUni, 1)) < 256 Then UniVba = """"[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]  For n = 1 To Len(TxtUni) - 1[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]    uni1 = Mid(TxtUni, n, 1)[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]    uni2 = AscW(Mid(TxtUni, n + 1, 1))[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]    If AscW(uni1) > 255 And uni2 > 255 Then[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]      UniVba = UniVba & "ChrW(" & AscW(uni1) & ") & "[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]    ElseIf AscW(uni1) > 255 And uni2 < 256 Then[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]      UniVba = UniVba & "ChrW(" & AscW(uni1) & ") & """[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]    ElseIf AscW(uni1) < 256 And uni2 > 255 Then[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]      UniVba = UniVba & uni1 & """ & "[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]    Else[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]      UniVba = UniVba & uni1[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]    End If[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]  Next[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]  If Right(UniVba, 4) = " & """ Then[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]    UniVba = Mid(UniVba, 1, Len(UniVba) - 4)[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]  Else[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]    UniVba = UniVba & """"[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]  End If[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]End If[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]End Function[/FONT][/COLOR]
Các bạn tham khảo thêm bài: http://www.giaiphapexcel.com/forum/showthread.php?t=2370
 
Upvote 0
anhtuan1066 đã viết:
Trong ví dụ này For rất đơn giãn mà bạn... đâu thấy chổ nào nặng ký đâu nhỉ?
He...he... Bạn ấy THANSK chắc là đã hiểu rồi còn gì...
Tôi cũng mong có cách nào đó ko dùng FOR, ko phải vì sự đơn giãn hay phức tạp, mà vì FOR ở đây hơi phí của
ANH TUẤN

Em cũng chưa hiểu nhiều lắm.
Bác xem làm như thế này đã được chưa ??

PHP:
Option Explicit
Private Sub WorkSheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Target.Rows.Count > 1 Or Target.Columns.Count > 1 Then GoTo thoat
    If Not Intersect(Range("A1:A10"), Target) Is Nothing Then
        Dim Diem As Integer
        Target.Offset(0, 1).ClearContents
        If IsNumeric(Target.Value) = False Then: GoTo thoat
        Diem = CCur(Target.Value) * 10
        If Diem > 100 Or IsNumeric(Diem) = False Then: GoTo thoat
        If Diem >= 80 Then Target.Offset(0, 1).Value = VNItoUNICODE("Hoïc löïc Gioûi"): GoTo thoat
        If Diem >= 65 Then Target.Offset(0, 1).Value = VNItoUNICODE("Hoïc löïc Khaù"): GoTo thoat
        If Diem >= 50 Then Target.Offset(0, 1).Value = VNItoUNICODE("Hoïc löïc Trung bình"): GoTo thoat
        If Diem >= 0 Then Target.Offset(0, 1).Value = VNItoUNICODE("Hoïc löïc Yeáu"): GoTo thoat
    End If
thoat:
End Sub

Thân!
 

File đính kèm

Upvote 0
Mr Okebab đã viết:
Em cũng chưa hiểu nhiều lắm.
Bác xem làm như thế này đã được chưa ??
Uh.. cũng giống cách làm lúc đầu của mọi người.. và vẫn bị 1 lỗi, đó là khi chọn từ A1:A10, bấm delete thì lý ra cột B phải rỗng theo... đàng này nó cứ trơ trơ...
Cũng chính vì lẽ đó mà tôi đành chấp nhận giãi pháp dùng FOR
ANH TUẤN
 
Upvote 0
anhtuan1066 đã viết:
Uh.. cũng giống cách làm lúc đầu của mọi người.. và vẫn bị 1 lỗi, đó là khi chọn từ A1:A10, bấm delete thì lý ra cột B phải rỗng theo... đàng này nó cứ trơ trơ...
Cũng chính vì lẽ đó mà tôi đành chấp nhận giãi pháp dùng FOR
ANH TUẤN

Vậy thì dễ rồi, bác xem nhé :
PHP:
Option Explicit
Private Sub WorkSheet_Change(ByVal Target As Range)
    On Error Resume Next
    Application.EnableEvents = False
    If Target.Columns.Count > 1 Then GoTo thoat
    Dim OB As Range
    If Intersect(Range("A1:A10"), Target) Is Nothing Then GoTo thoat
    For Each OB In Intersect(Range("A1:A10"), Target)
        Dim Diem As Integer
        OB.Offset(0, 1).ClearContents
        If IsNumeric(OB.Value) = False Or OB.Value = "" Then GoTo Tiep
        Diem = CCur(OB.Value) * 10
        If Diem > 100 Or IsNumeric(Diem) = False Then: GoTo thoat
        If Diem >= 80 Then OB.Offset(0, 1).Value = VNItoUNICODE("Hoïc löïc Gioûi"): GoTo Tiep
        If Diem >= 65 Then OB.Offset(0, 1).Value = VNItoUNICODE("Hoïc löïc Khaù"): GoTo Tiep
        If Diem >= 50 Then OB.Offset(0, 1).Value = VNItoUNICODE("Hoïc löïc Trung bình"): GoTo Tiep
        If Diem >= 0 Then OB.Offset(0, 1).Value = VNItoUNICODE("Hoïc löïc Yeáu"): GoTo Tiep
Tiep:
    Next
thoat:
    Set OB = Nothing
    Application.EnableEvents = True
End Sub

Thân!
 

File đính kèm

Upvote 0
Vâng! Thì cuối cùng vẫn là FOR... Chắc ko còn cách gì khac ngoài cách này Bắp nhỉ
ANH TUẤN
 
Upvote 0
anhtuan1066 đã viết:
Vâng! Thì cuối cùng vẫn là FOR... Chắc ko còn cách gì khac ngoài cách này Bắp nhỉ
ANH TUẤN

Vâng, vẫn là For nhưng 2 cái For khác hẳn nhau.
Của bác luôn xét từ A1:A10, còn của em thì chỉ xét trong khoảng GIAO của vùng thay đổi và (A1:A10), vì thế sẽ nhanh và hợp lý hơn

Còn một điều nữa : Khi các bác sử dụng Worksheet_Change và Worksheet_SelectionChange thì rất nên dùng Application.EnableEvents
Còn tại sao thì các bác cứ nhấn F8 thì sẽ rõ.

Thân!
 
Upvote 0
Web KT

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

Back
Top Bottom