Chú ý: Các thành viên học lớp "Lập trình VBA trong Excel" có thể trao đổi bài ở đây

Liên hệ QC
Nếu như mình muốn diễn đạt :không có giá trị nào của A=B thì viết thế nào bác?
Mình suy nghĩ thế này, không biết có đúng không.
Nếu for i - > end mà vẫn không thấy thì lúc ấy MyMaxIf vẫn bằng giá trị đầu.
Bạn nghiên cứu mà thêm If.
 
Theo cách hiểu của Mình là: Bạn bấm chọn 1 ô bất kỳ -> Bấm phải chuột chọn Delete -> Nó sẽ xuất hiện hộp thoại Delete -> Xem thứ tự từ trên xuống
Delete Shist Cells Left (Tương ứng là 1)
Delete Shist Cells Up (Tương ứng là 2)
.......
Em làm sub xóa hàng thì ok nhưng cứ xóa cột là các dữ liệu bên ngoài bên phải của vùng chọn lại bị mất hết. Với xóa cột thì em dùng delete 1 theo như bác ndu. Em thử bằng shift cell left của excel thì dữ liệu bên phải ngoài vùng không bị mất. Vì sao vậy?
 

File đính kèm

  • XoaHangCot.rar
    13.3 KB · Đọc: 5
Nếu như mình muốn diễn đạt :không có giá trị nào của A=B thì viết thế nào bác?
Giờ hãy xem lại hàm của bạn nha! Trong code của bạn có đoạn:
If rngCompany(i, 1) = sComTest And rngServices(i, 1) = sSerTest Then <===> IF Điều kiện 1 And Điều kiện 2 then
Giờ ThuNghi lại yêu cầu thêm rằng:
- Nếu sComTest = "All" thì không cần xét điều kiện 1 (xem như nó luôn đúng)
- Nếu sSerTest = "All" thì không cần xét điều kiện 2 (xem như nó luôn đúng)
Vậy bùn lắm bạn thêm cái OR vào nữa là xong chứ gì ---> Đại khái thế này:
If (rngCompany(i, 1) = sComTest Or sComTest = "All") And (rngServices(i, 1) = sSerTest Or sSerTest = "All") Then
- Khi sComTest = "All" thì Điều kiện 1 luôn đúng
- Khi
sSerTest = "All" thì Điều kiện 2 luôn đúng
---------------
Thử nghĩ xem đúng không?
 
VB6 bản portable đây http://www.mediafire.com/?345oo99i734
Ai muốn tham khảo thêm thì dow về xem nhé.
Giải nén, Chạy file lên thông báo Click Reg Key và Run Visual Basic 6
Nhờ các thầy chạy thử xem bản VB6 này có bị lỗi gì không ah.
 
Đề bài (bài 1): Viết hàm tìm số nguyên trong 1 chuỗi
Bài làm:

Mã:
Function TachSo(ByVal x1 As String) As Integer

    Dim p1 As Long
    Dim p2 As Long
    
    For i = 1 To Len(x1)
       If IsNumeric(Mid(x1, i, 1)) = True Then
       p1 = i
       Exit For
       End If
    Next
    If p1 > 0 Then
       For i = p1 To Len(x1)
       If IsNumeric(Mid(x1, i, 1)) = False Then
       p2 = i
       Exit For
       End If
    Next
    End If
    TachSo = CInt(Mid(x1, p1, p2 - p1))
End Function
Còn bài 2: Viết hàm tách họ và tên (chưa làm --=0)
 
Lần chỉnh sửa cuối:
Đề bài (bài 1): Viết hàm tìm số nguyên trong 1 chuỗi
Bài làm:

Mã:
Function TachSo(ByVal x1 As String) As Integer

    Dim p1 As Long
    Dim p2 As Long
    
    For i = 1 To Len(x1)
       If IsNumeric(Mid(x1, i, 1)) = True Then
       p1 = i
       Exit For
       End If
    Next
    If p1 > 0 Then
       For i = p1 To Len(x1)
       If IsNumeric(Mid(x1, i, 1)) = False Then
       p2 = i
       Exit For
       End If
    Next
    End If
    TachSo = CInt(Mid(x1, p1, p2 - p1))
End Function
Ủa! Hàm này để làm gì vậy ta?
Với chuổi 42NDU32435 sau khi qua hàm của bạn ra kết quả = 42 ---> Nghĩa là sao?
 
Thưa thầy vì trình độ của chúng em, nên giới hạn là chỉ cần tìm được 1 số nguyên đầu tiên là được. Số 42 trong ví dụ của thầy là số nguyên đầu tiên trong chuỗi

Để tìm tiếp các số em cũng sẽ làm được bằng cách thêm vào các đoạn vòng lặp, nhưng kiểu gì nó cũng là một số giới hạn (vd 4 số, hoặc 5 số nếu thêm 5 vòng lặp). Còn để tìm một cách vô hạn thì em chưa nghĩ ra làm kiểu gì? Để tìm một số có số lẻ sau số thập phân, hay tìm 1 số có định dạng kiểu 1.000.000 trong chuỗi cũng ngoài khả năng.
 
Bài 2: Viết hàm tách họ và tên, em nghĩ bài này phải viết hai hàm, 1 hàm tách họ và 1 hàm tách tên

Tách tên
Mã:
Function Ten(ByVal y1 As String) As String
    Dim x1 As Integer
    For i = Len(y1) To 1 Step -1
            If Mid(y1, i, 1) = " " Then
                x1 = i
                Exit For
            End If
    Next i
        Ten = Right(y1, Len(y1) - x1)
End Function

Tách họ
Mã:
Function Ho(ByVal y2 As String) As String
    Dim x2 As Integer
    For i = Len(y2) To 1 Step -1
            If Mid(y2, i, 1) = " " Then
                x2 = i
                Exit For
            End If
    Next i
        Ho = IIf(x2 > 0, Left(y2, x2 - 1), "")
End Function

Tuy nhiên hàm tách họ của em chưa hoàn thiện, nếu tên chỉ gồm một âm tiết (chẳng hạn như "Thắng" hay "Ngọc" thì nó báo lỗi. Hiện tại vẫn chưa nghĩ ra cách khắc phục lỗi này (kể cả đã thêm IIf() như trên code)
Hơn nữa là dòng lệnh If Mid(y1, i, 1) = " " Then em muốn thay bằng If IsEmpty(y1,i,1) = True Then (Trông có vẻ đẹp hơn) nhưng không hiểu sao khi dùng hàm IsEmpty() kết quả chạy không đúng?
 
1. Lỗi hàm IIf:

Hàm IIf của VBA không giống hàm If của Excel dù cho cú pháp và cách dùng giống nhau hoàn toàn. Sự khác biệt là hàm If của Excel khi xét Expression được kết quả True, sẽ nhận kết quả Value If True mà không xét đến Value if False. Ngược lại nếu xét Expression được kết quả False, sẽ nhận kết quả Value If False mà không xét đến Value if True.

Trong khi đó Hàm IIf của VBa xét đến cả 2 Value If TrueValue if False. Nếu 1 trong 2 cái này lỗi thì nguyên hàm IIf bị lỗi.

Cụ thể trong câu:
PHP:
Ho = IIf(x2 > 0, Left(y2, x2 - 1), "")
Khi Expression = False nghĩa là x2 = 0, x2 - 1 = -1, Left(y2, -1) bị lỗi, hàm IIf bị lỗi dù cho lẽ ra nó nhận giá trị Value if False.

Giải quyết: Dùng If ... Then ... Else thay cho hàm IIf. Hoặc gán Ho = "" từ đầu, và

PHP:
If x2 > 0 Then Ho = Left(y2, x2 - 1)
2. Lỗi IsEmpty:

Hàm IsEmpty chỉ có 1 tham số thôi, sao lại nhét 3 tham số?

Còn nếu dùng IsEmpty(Mid(y1, i, 1)) thì sai về cơ bản: IsEmpty() = True nghĩa là chuỗi rỗng, còn " " là 1 chuỗi không rỗng.
 
Lần chỉnh sửa cuối:
Nó báo lỗi vì bạn bắt nó tìm cái không có, nó tức mình & la làng đó thôi!

Tuy nhiên hàm tách họ của em chưa hoàn thiện, nếu tên chỉ gồm một âm tiết (chẳng hạn như "Thắng" hay "Ngọc" thì nó báo lỗi.

Vậy trước khi vô vòng lặp bạn nối thêm cho y2 một khoảng trắng sau đuôi xem sao?
 
Thưa thầy vì trình độ của chúng em, nên giới hạn là chỉ cần tìm được 1 số nguyên đầu tiên là được. Số 42 trong ví dụ của thầy là số nguyên đầu tiên trong chuỗi

Để tìm tiếp các số em cũng sẽ làm được bằng cách thêm vào các đoạn vòng lặp, nhưng kiểu gì nó cũng là một số giới hạn (vd 4 số, hoặc 5 số nếu thêm 5 vòng lặp). Còn để tìm một cách vô hạn thì em chưa nghĩ ra làm kiểu gì? Để tìm một số có số lẻ sau số thập phân, hay tìm 1 số có định dạng kiểu 1.000.000 trong chuỗi cũng ngoài khả năng.

Đúng vậy, tạm thời các bạn chỉ cần tìm 1 số xuất hiện đầu tiên là được. Sau này tôi sẽ hướng dẫn các bạn lấy tất cả các số trong chuỗi, nó có thể có 1,2,3, bao nhiêu đi chăng nữa vẫn lấy hết. Tấc nhiên không phải dùng nhiều vòng lặp để lấy nhiều số mà đó sẽ là một thuật toán.
 
Thưa thầy, bài tách họ tên em nghĩ ra 1 cách rất ngắn ứng dụng hàm đã học, nhưng khi chạy nó báo lỗi #REF, em chưa tìm ra được sai ở đâu? Đây là code tách tên
Mã:
Function Ten2(ByVal y3 As String) As String
    Ten2 = Right(y3, Len(y3) - InStrRev(y3, " ", -1, vbTextCompare) + 1)
End Function
 
Thưa thầy, bài tách họ tên em nghĩ ra 1 cách rất ngắn ứng dụng hàm đã học, nhưng khi chạy nó báo lỗi #REF, em chưa tìm ra được sai ở đâu? Đây là code tách tên
Mã:
Function Ten2(ByVal y3 As String) As String
Ten2 = Right(y3, Len(y3) - InStrRev(y3, " ", -1, vbTextCompare) + 1)
End Function

Anh Thắng thử xem cài này nhé! Em sửa lại chút thôi:
PHP:
Public Function Ten2(ByVal Chuoi As String) As String
    Myr = Trim(Chuoi)
    Ten2 = Right(Myr, Len(Myr) - InStrRev(Myr, " "))
End Function
 
Còn đây là tách họ trong chuỗi:
PHP:
Public Function Tachho(ByVal Chuoi As String) As String
    Dim Myr
    Myr = InStr(1, Chuoi, " ")
    Ten = Left(Chuoi, Myr)
End Function

Còn tách họ và tên để ghép với nhau thì mọi người làm nha!
 
Lần chỉnh sửa cuối:
Các bạn nên cố gắng gom 3 hàm TÁCH HỌ, TÁCH TÊN và TÁCH TÊN ĐỆM vào chung 1 hàm sẽ hay hơn!
Khi ấy hàm sẽ có 1 tham số cuối dùng để nhận biết ta muốn tách cái gì
Ngoài cách dùng For.. Next, Left, Right.. thì còn cách dùng Split cũng rất hay (gần giống chức năng Text to Columns) ---> Split sẽ tách Họ và Tên ra thành 1 mảng (dựa vào ký tự phân cách là khoảng trắng)... Như vậy TÊN sẽ là phần tử cuối cùng của mảng và HỌ sẽ là phần tử đầu tiên
Thử xem!
 
Đây là bài của em về tách họ tên
Mã:
Option Explicit

Function TachTen(ByVal HVT As String) As String
Dim Space As String
Space = InStrRev(Trim(HVT), " ", -1, vbTextCompare)
    TachTen = Mid(HVT, Space + 1, Len(Trim(HVT)))
End Function
-----------------------------------------------------------
Function TachHo(ByVal HVT As String) As String
Dim Space As String
Space = InStrRev(HVT, " ", -1, vbTextCompare)
    TachHo = Mid(HVT, 1, Space)
End Function
 
Web KT
Back
Top Bottom