Tiếng Việt trong gán giá trị cho ô (1 người xem)

Liên hệ QC

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

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 đỡ.
 
Hình như nó chỉ hiển thị tiếng Việt với font ABC thì phải... Font Unicode ko hổ trợ
 
Upvote 0
Thế thì phải làm sao để trong code có được font ABC hở anh?
Như vậy ô B2 bắt buộc phải là font TCVN3 phải không anh?
Em có môt thắc mắc hơi kỳ: VBA cho excel là của Windows mà sao không hỗ trợ unicode??
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi cũng ko biết nữa... Nhưng đễ ý từ trước giờ các cao thủ viết code toàn dùng Font ABC, chắc cũng do nguyên nhân này...
Bạn cứ thử với Font ABC thì biết liền chứ gì
 
Upvote 0
Cảm ơn anh anhtuan1066, em làm được rồi. Tức là em chọn font của B2 là TCVN3, gõ dòng chữ trong code bằng bảng mã TCVN3.
Cho em hỏi thêm một chút: Em muốn macro trên tự động chạy (tức là nó tự động điền dòng chữ vào ô B2 khi A1 thay đổi giá trị. Hiện giờ em phải gán macro trên cho một nút bấm. Hình như là phải đưa code vào:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
...
End Sub
Nhưng hễ ta làm thao tác gì với ô bất kỳ nó cũng chạy làm chậm bảng tính.
 
Upvote 0
Đó là tại vì bạn ko giới hạn vùng cho bảng tính... Lý ra nó chỉ tự động chạy trong 1 vùng nào đó thôi, đúng ko?
Ví dụ bạn muốn code tự động chạy khi có sự thay đỗi dữ liệu trong vùng A1 đến A10 thì làm như sau:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Range("A1:A10"),Target) Is Nothing then

.... Code....
End Sub

Thử xem
ANH TUẤN
 
Upvote 0
Bạn có thể sử dụng code đơn giản sau đây (nhớ copy và paste nó vào Sheet nhé, ko phải Module)
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Range("A1:A10"), Target) Is Nothing Then
    Rw = ActiveCell.Row - 1
    If Cells(Rw, 1).Value >= 8 Then
       Cells(Rw, 2).Value = "Häc lùc giâi"
       ElseIf Cells(Rw, 1).Value >= 6.5 Then
       Cells(Rw, 2).Value = "Häc lùc kh¸"
       ElseIf Cells(Rw, 1).Value >= 5 Then
       Cells(Rw, 2).Value = "Häc lùc trung b×nh"
       Else
       Cells(Rw, 2).Value = "Häc lùc kÐm"
    End If
  End If
End Sub
Đây là code đơn giản, vẫn còn rất nhiều nhược điểm... bạn từ từ nghiêm cứu... Còn nữa... ko dc dùng WorkSheet_SelectionChange mà phải dùng WorkSheet_Change
ANH TUẤN
 
Lần chỉnh sửa cuối:
Upvote 0
Các cao thủ giúp thêm lỗi ngay chổ:
1> Xóa cột A: bị lỗi
2> Dòng lệnh: Rw = ActiveCell.Row - 1 chỉ đễ giãi quyết tạm thời... Có ai có hướng nào khác hay hơn ko?
ANH TUẤN

 
Upvote 0
Các cao thủ giúp thêm lỗi ngay chổ:
1> Xóa cột A: bị lỗi
2> Dòng lệnh: Rw = ActiveCell.Row - 1 chỉ đễ giãi quyết tạm thời... Có ai có hướng nào khác hay hơn ko?
ANH TUẤN

Thế thì dùng hàm là hay nhất , biết sub trên thành hàm ko cần bắt sự kiện WorkSheet_Change làm gì,

Vì hàm sẽ tự động thay đổi khi dữ liệu thay đổi, atuan... ah

 
Upvote 0
Hàm thì dễ rồi... nhưng ở đây là các bạn đang thực tập VBA theo bài giãng của thầy Phan Tự Hướng mà bạn... Có lẽ là đang tập tành nên biến thành Function e rằng vượt quá tầm tay của các bạn ấy... Vã lại nếu là Function thôi thì dùng hàm Excel cho xong (ít nhất là với bài toán này)
Đễ ý code này chỉ chạy khi Enter xuống dòng (dùng phím mũi tên di chuyển sang phải cũng ko chạy)... Xóa cột A gây lỗi tôi nghĩ sửa dễ hơn vụ xác định Row cũng cell vừa nhập liệu... Vậy phải làm sao đây? Tigertiger giúp xem
 
Upvote 0
Cảm ơn anh.
Đoạn code của anh còn một lỗi nữa (mong anh thông cảm)
Nếu ta nháy đúp vào một ô trong vùng A1:A10 thì ở B... tương ứng cũng điền Học lực kém. (Tức là không hập gì vào ô A.., chỉ kích hoạt. Em mạn phép thêm dòng code này vào:
Private Sub Worksheet_Change(ByVal Target As Range)
If
Not Intersect(Range("A1:A10"), Target) Is Nothing Then
Rw
= ActiveCell.Row - 1
If ActiveCell.Value = "" Then Exit Sub
If Cells(Rw, 1).Value >= 8 Then
Cells
(Rw, 2).Value = "Häc lùc giâi"
ElseIf Cells(Rw, 1).Value >= 6.5 Then
Cells
(Rw, 2).Value = "Häc lùc kh¸"
ElseIf Cells(Rw, 1).Value >= 5 Then
Cells
(Rw, 2).Value = "Häc lùc trung b×nh"
Else
Cells(Rw, 2).Value = "Häc lùc kÐm"
End If
End If
End Sub

 
Upvote 0
anhtuan1066 đã viết:
Hàm thì dễ rồi... nhưng ở đây là các bạn đang thực tập VBA theo bài giãng của thầy Phan Tự Hướng mà bạn... Có lẽ là đang tập tành nên biến thành Function e rằng vượt quá tầm tay của các bạn ấy... Vã lại nếu là Function thôi thì dùng hàm Excel cho xong (ít nhất là với bài toán này)
Đễ ý code này chỉ chạy khi Enter xuống dòng (dùng phím mũi tên di chuyển sang phải cũng ko chạy)... Xóa cột A gây lỗi tôi nghĩ sửa dễ hơn vụ xác định Row cũng cell vừa nhập liệu... Vậy phải làm sao đây? Tigertiger giúp xem
Anh anhtuan1066 hiểu ý người mới quá chừng!
 
Upvote 0
He... he... Vậy là bạn đã nắm dc vấn đề rồi còn gì... Lỗi này tôi có thấy nhưng cứ đễ đấy cho bạn tự tìm hiểu...
Nhưng còn vụ Rw =ActiveCell.Row - 1 mới khó... Vụ này tôi chưa nghĩ ra dc... Đành trông chờ các cao thủ khác nhiều kinh nghiệm hơn vậy (tôi cũng mới tập tành thôi bạn à)
ANH TUẤN

 
Upvote 0
oK, nhưng nếu MỚI thế thì ko nên vội dùng WorkSheet_change vội -> vì như thế thay đổi liên tục -> rối khi lập --> tốt nhất là chạy sub thì hay hơn


Đã chót làm cứ up lên tham khảo (không ích cho ng mới - thì ích cho người biết sơ sơ vậy)

Có thể dùng Font Abc hay VNI đều được chỉ cần lưu ý font nào thì tương ứng ở ô tính chọn font đó

PHP:
Public Function XepLoaiAbc(Diem As Double)
    Dim kQ As String
    If Diem >= 8 Then
       kQ = "Häc lùc giâi"
       ElseIf Diem >= 6.5 Then
       kQ = "Häc lùc kh¸"
       ElseIf Diem >= 5 Then
       kQ = "Häc lùc trung b×nh"
       Else
       kQ = "Häc lùc kÐm"
    End If
    XepLoaiAbc = kQ
End Function

Và có thể dụng Font Unicode (xem chi tiết về sử dụng unicode tại đây http://www.giaiphapexcel.com/forum/showthread.php?t=2370


PHP:
Public Function XepLoaiUni(Diem As Double)
    Dim kQ As String
    If Diem >= 8 Then
       kQ = "H" & ChrW(7885) & "c l" & ChrW(7921) & "c gi" & ChrW(7887) & "i"
       ElseIf Diem >= 6.5 Then
       kQ = "H" & ChrW(7885) & "c l" & ChrW(7921) & "c khá"
       ElseIf Diem >= 5 Then
       kQ = "H" & ChrW(7885) & "c l" & ChrW(7921) & "c trung bình"
       Else
       kQ = "H" & ChrW(7885) & "c l" & ChrW(7921) & "c kém"
    End If
    XepLoaiUni = kQ
End Function

để thực hiện hàm trên bấm Alt+F11 ->chọn Insert module -> copy và dán các code trên vào
_> khi đó có các hàm trên ->sd như hàm của Excel (bấm vào fx rồi chọn trong User define -> liệt kê hàm do NSD định nghĩa
 
Lần chỉnh sửa cuối:
Upvote 0
Sao không phải là

PHP:
 Rw=ActiveCell.Row

ActiveCell.Row-1 sẽ thành hàng trên mà ; ko rõ ý atuan... thế nào?

 
Lần chỉnh sửa cuối:
Upvote 0
Thì bạn cứ thử đi sẽ thấy điều kỳ lạ... Vì khi mình Enter xuống hàng thì ActiveCell đã trở thành dòng dưới rồi... Tôi ko khắc phục dc lỗi này nên đành làm tạm vậy! Bạn có ý kiến gì ko? Chứ ghi Rw=ActiveCell.Row thì phải thêm code gì đó nữa mới dc
 
Upvote 0
Oh đúng rùi,

Vậy thì sửa thế này atuan ah

Để ý rằng:

+ Khi bấm phím ENTER thì chứng tỏ hàng (row) xuống 1 dòng-> Rw =ActiveCell.Row()-1 , lúc này cột (column) thay đổi sang cột B (=1)

+ Khi bấm nút MŨI TÊN PHẢI thì chứng tỏ hàng (row) không đổi-> sao cho Rw =ActiveCell.Row()+0 , lúc này cột (column) thay đổi sangg cột B (=2)


-> có thể có 2 cách xử lý sau:
- cách 1 (theo suy nghĩ thông thường)
PHP:
If ActiveCell.Column =1 then 
    Rw =ActiveCell.Row()-1
Else
    Rw =ActiveCell.Row()
EndIf

-Nhưng cách hay hơn là cách 2 sau (dùng phương pháp cộng trừ)

PHP:
 Rw = ActiveCell.Row + ActiveCell.Column - 2

Và kQ toàn bộ như sau

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Rw As Integer
  If Not Intersect(Range("A1:A10"), Target) Is Nothing Then
    Rw = ActiveCell.Row + ActiveCell.Column - 2
    If Cells(Rw, 1).Value = "" Then Exit Sub  
    
    If Cells(Rw, 1).Value >= 8 Then
        Cells(Rw, 2).Value = "Häc lùc giâi"
    ElseIf Cells(Rw, 1).Value >= 6.5 Then
        Cells(Rw, 2).Value = "Häc lùc kh¸"
    ElseIf Cells(Rw, 1).Value >= 5 Then
        Cells(Rw, 2).Value = "Häc lùc trung b×nh"
    Else
        Cells(Rw, 2).Value = "Häc lùc kÐm"
    End If
  End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Ai chà chà... Sao mình ngu thế nhỉ?
Ko thể ghi là ActiveCell.Row dc...
Sửa lại thành Rw = Target.Row là xong... (ko cần cộng, ko cần trừ gì ráo)
Tigertiger xem lại 1 chút ngay chổ này:
1> Cell ="" thì ko làm gì cả là đúng rồi.. nhưng giã sử như cell đang có dử liệu, ví dụ A5= 8, vậy B5 sẽ là Giõi... Khi ấy mình xóa A5 đi thì điều gì xảy ra? Lý ra B5 cũng sẽ rổng luôn mới hợp lý... Còn nữa.. giã sử người ta xóa toàn bộ từ A1:A10 thì sao? Theo lý B1:B10 cũng phải rỗng
2> Code của Tigertiger vẫn còn 2 lỗi: Thứ nhất xóa toàn bộ cột A bị lỗi... Thứ 2 nếu nhập liệu xong người ta ko Enter mà dùng chuột dời con trở đi nơi khác cũng toi (ví dụ dùng chuột chọn cell E5)
Tôi có code này... Tigertiger xem thử và sửa lại với:
PHP:
Private Sub WorkSheet_Change(ByVal Target As Range)
     If Not Intersect(Range("A1:A10"), Target) Is Nothing Then
         On Error Resume Next
         Rw = Target.Row
         If Target.Value = "" Then
            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
Code này sửa dc 1 vài lỗi... nhưng vẫn còn tồn tại là xóa cell tại A, bên cột B ko bị rỗng.. Bạn xem giúp với
ANH TUẤN
 
Upvote 0
Chào bạn dnphuonganh!
Yêu cầu của bạn tưởng dễ, vậy mà làm mãi vẫn thấy có chổ ko ổn... Tôi nghĩ chắc chỉ có dùng FOR là ăn chắc mặc bền... Bạn thử code nà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 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
Code này gần như đúng đến 99%... Tức là bạn xóa cell bên cột A, dù là 1 cell hay toàn bộ thì cell tương ứng bên cột B sẽ rỗng theo... Nó chỉ còn 1 tí xíu trục trặc.. Bạn tự tìm hiểu xem trục trặc ấy là gì nhé
ANH TUẤN
 
Upvote 0
Đơn giản đi

Yêu cầu của bạn tưởng dễ, vậy mà làm mãi vẫn thấy có chổ ko ổn... Tôi nghĩ chắc chỉ có dùng FOR là ăn chắc mặc bền... Bạn thử code này:
Oh atuan - nhiệt tình wa,

Các bạn đó đang học VBA mà chỉ thử sub thui mà

còn cách khác Đơn giản thôi đó là khi đó chỉ cần đơn giản thôi đó là thêm Cells(Rw, 2).Value="" vào đoạn:

PHP:
         If Target.Value = "" Then
             Cells(Rw, 2).Value=""
             Exit Sub
         End If


nên có khai báo Dim Rw As Integer - vì mới học thì nên có khai báo đầy đủ cho nó bài bản.

Trở thành:

PHP:
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.Value = "" Then
             Cells(Rw, 2).Value=""
             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
 
Lần chỉnh sửa cuối:
Upvote 0
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
Lại dc học thêm 1 chiêu nữa... Cảm ơn nhiều nhé!
ANH TUẤN
 
Upvote 0

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

Back
Top Bottom