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 (2 người xem)

  • Thread starter Thread starter NH_DK
  • Ngày gửi Ngày gửi
Liên hệ QC

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

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

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
 
Hôm qua, khi học về, ngồi nhớ lại những gì đã học và đã làm bài tập nhỏ này. Mọi người tham khảo nha.....
 

File đính kèm

Hôm qua, khi học về, ngồi nhớ lại những gì đã học và đã làm bài tập nhỏ này. Mọi người tham khảo nha.....
Code của bạn có đoạn:
PHP:
If OptionVietNam Then
  Cells(jJ, 1).Offset(, 1).Value = "Nguoi Viet Nam"
ElseIf OptionAnh Then
  Cells(jJ, 1).Offset(, 1).Value = "Nguoi Anh"
ElseIf OptionPhap Then
  Cells(jJ, 1).Offset(, 1).Value = "Nguoi Phap"
End If
Sao bạn không dùng vòng lập nhỉ? Đã học rồi cơ mà ---> Sửa thành vầy sẽ gọn hơn và đồng thời có tiếng Việt luôn
PHP:
For Each op In Me.Frame1.Controls
  If op.Value Then Cells(jJ, 1).Offset(, 1).Value = op.Caption
Next
Và nếu là tôi thì tôi sẽ sửa toàn bộ code này thành:
PHP:
Private Sub cmdOK_Click()
  Dim op As Control
  With Sheets("DATA").Range("A65535").End(xlUp)
    If TextBox1.Value = "" Then
      MsgBoxUni UNC("B¹n h·y ®iÒn tªn vµo nhÐ. C¸m ¬n b¹n nhiÒu!")
    Else
      .Offset(1, 0).Value = TextBox1.Value
      For Each op In Me.Frame1.Controls
        If op.Value Then .Offset(1, 1).Value = op.Caption
      Next
      TextBox1 = ""
      TextBox1.SetFocus
    End If
  End With
End Sub
 
Lần chỉnh sửa cuối:
Cám ơn thầy ndu nhiều! Tại hôm qua học về muộn quá, trong khi ngồi chờ cơm tối thì em làm tạm. Thấy cũng chạy Ok nên em cũng không làm lại nữa (Hi...... mệt quá thầy ah!). Chiều em muốn đưa lên cho các bạn cùng lớp tham khảo nữa!
Cám ơn những đóng góp thật ý nghĩa của Thầy!
 
Em không hiểu ý thầy Tuân lắm! Có phải ý thầy là đưa code lên đây?
Ý thầy Tuân là anh phải trích dẫn nguồn code sử dụng (Trong bài là nguồn code để viết tiếng Việt Unicode)
Em thấy chỉ có những chữ trong msgbox mới viết được tiếng Việt, còn trong cell thì chưa có. Các thầy có thể hướng dẫn cho lớp viết tiếng Việt trên bảng tính (chung cho mọi trường hợp chứ không chỉ riêng bài này) được không ạ?
 
Lần chỉnh sửa cuối:
Các thầy cho em hỏi sao em làm UserForm lọc dữ liệu (theo ví dụ 7 của thầy Hướng) lúc đầu chạy thì ổn nhưng khi em làm tiếp UserForm khác thì lại không chạy được cái UserForm trước (UserForm2), nó cứ báo runtime error 9 gì đó.
 

File đính kèm

khanhhoan đã viết:
Các thầy cho em hỏi sao em làm UserForm lọc dữ liệu (theo ví dụ 7 của thầy Hướng) lúc đầu chạy thì ổn nhưng khi em làm tiếp UserForm khác thì lại không chạy được cái UserForm trước (UserForm2), nó cứ báo runtime error 9 gì đó.
Mã:
      UserForm2.lstDanhsach.AddItem Sheets("[COLOR=red]Sheet2[/COLOR]").Cells(Row, 2)

Không phải tại UserForm sau làm hư UserForm trước gì cả. Do tên sheet đã sửa thành "BT 7" rồi, có còn là "Sheet2" nữa đâu.

Ngoài ra trong code có dùng biến j, và cho j = j +1. Rút cục j chẳng dùng vào việc gì hết?
 
Lần chỉnh sửa cuối:
Thầy ơi có mấy cái bài tập ấy không gửi mail giúp em, em không có sách thành ra không hiểu làm cái gì cả. Thank you thầy nhiều ạ.
Email: thangacc@gmail.com
 
Hai buổi tuần trước vì bận công việc em không đi học được, các thầy hay bác nào đi học đầy đủ có thể tóm tắt những gì mình học 2 buổi đó giúp em được không ạ? Em cảm ơn trước ạ!!!
 
Ui, hôm trước có học không mà sao không thấy mọi người làm bài tập vậy?
 
Đây là bài tập tối ngày 18.11.2010:
PHP:
Option Explicit
Sub Loc_Ctiet()
Application.ScreenUpdating = False
    Dim ShSoCtiet As Worksheet
    Dim ShSoData As Worksheet
    Set ShSoCtiet = Sheets("SOCTIET")
    Set ShSoData = Sheets("CSDL")
    Dim eRw As Long, eRw1 As Long, i As Long, Kyhieu As String, Ma As String
    'Xoa du lieu
    ShSoCtiet.Range("A10:G56536").Clear 'Contents
    eRw1 = 10
    With ShSoCtiet
        Kyhieu = Trim(.[c6])
        Ma = Trim(.[c7])
        For eRw = 4 To ShSoData.[a65536].End(xlUp).Row
            'Dieu kien
            If Trim(ShSoData.Cells(eRw, 1)) = Kyhieu And Trim(ShSoData.Cells(eRw, 4)) = Ma Then
                'Lay du lieu sang neu dieu kien la dung
                .Cells(eRw1, 1).Resize(, 2) = ShSoData.Cells(eRw, 2).Resize(, 2).Value
                .Cells(eRw1, 3).Resize(, 6) = ShSoData.Cells(eRw, 5).Resize(, 6).Value
                eRw1 = eRw1 + 1
            End If
        Next
    End With
    'Bay loi
    If eRw1 = 10 Then MsgBox "Khong tim thay. Vui long tim lai nha!"
    i = Range("A65535").End(xlUp).Row + 1
    With [A10].Resize(i - 10, 7) 'Ke bang
        .BorderAround LineStyle:=1
        .Borders(11).LineStyle = 1: .Borders(11).ColorIndex = 7
        .Borders(12).LineStyle = 1: .Borders(12).ColorIndex = 7
    End With
    With Cells(i, 3) 'Dien chu Cong vao bang
            .Value = "Cong"
            .Font.Bold = True
    End With
    With Cells(i, 7)  'Cong tong cot G
            .Value = "=SUM(R10C7:R" & i - 1 & "C)"
            .Font.Bold = True
    End With
    Range("E10:G" & i).NumberFormat = "_(* #,##0_);_(* (#,##0);_(* ""-""??_);_(@_)" ' Dinh dang so
    Application.ScreenUpdating = True
    Set ShSoCtiet = Nothing
    Set ShSoData = Nothing
End Sub
Em nhờ thầy và các AC xem và hoàn thiện code cho em sao cho tối ưu hơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Đây là bài tập tối ngày 18.11.2010:
PHP:
Option Explicit
Sub Loc_Ctiet()
Application.ScreenUpdating = False
    Dim ShSoCtiet As Worksheet
    Dim ShSoData As Worksheet
    Set ShSoCtiet = Sheets("SOCTIET")
    Set ShSoData = Sheets("CSDL")
    Dim eRw As Long, eRw1 As Long, i As Long, Kyhieu As String, Ma As String
    'Xoa du lieu
    ShSoCtiet.Range("A10:G56536").Clear 'Contents
    eRw1 = 10
    With ShSoCtiet
        Kyhieu = Trim(.[c6])
        Ma = Trim(.[c7])
        For eRw = 4 To ShSoData.[a65536].End(xlUp).Row
            'Dieu kien
            If Trim(ShSoData.Cells(eRw, 1)) = Kyhieu And Trim(ShSoData.Cells(eRw, 4)) = Ma Then
                'Lay du lieu sang neu dieu kien la dung
                .Cells(eRw1, 1).Resize(, 2) = ShSoData.Cells(eRw, 2).Resize(, 2).Value
                .Cells(eRw1, 3).Resize(, 6) = ShSoData.Cells(eRw, 5).Resize(, 6).Value
                eRw1 = eRw1 + 1
            End If
        Next
    End With
    'Bay loi
    If eRw1 = 10 Then MsgBox "Khong tim thay. Vui long tim lai nha!"
    i = Range("A65535").End(xlUp).Row + 1
    With [A10].Resize(i - 10, 7) 'Ke bang
        .BorderAround LineStyle:=1
        .Borders(11).LineStyle = 1: .Borders(11).ColorIndex = 7
        .Borders(12).LineStyle = 1: .Borders(12).ColorIndex = 7
    End With
    With Cells(i, 3) 'Dien chu Cong vao bang
            .Value = "Cong"
            .Font.Bold = True
    End With
    With Cells(i, 7)  'Cong tong cot G
            .Value = "=SUM(R10C7:R" & i - 1 & "C)"
            .Font.Bold = True
    End With
    Range("E10:G" & i).NumberFormat = "_(* #,##0_);_(* (#,##0);_(* ""-""??_);_(@_)" ' Dinh dang so
    Application.ScreenUpdating = True
    Set ShSoCtiet = Nothing
    Set ShSoData = Nothing
End Sub
Em nhờ thầy và các AC xem và hoàn thiện code cho em sao cho tối ưu hơn.

Ngọc sửa thêm thế này nhé.
+ Khai báo biến ở đầu thủ tục. Hiện nay có những lệnh gán trước phần khai báo biến như là Application.ScreenUpdating = False.
+ Khi không tìm thấy mã thì thông báo sau đó bị lỗi?

Ngọc kiểm tra và chỉnh thêm nhé. Code cũng khá tốt đây.
 
Ngọc sửa thêm thế này nhé.
+ Khai báo biến ở đầu thủ tục. Hiện nay có những lệnh gán trước phần khai báo biến như là Application.ScreenUpdating = False.
+ Khi không tìm thấy mã thì thông báo sau đó bị lỗi?

Ngọc kiểm tra và chỉnh thêm nhé. Code cũng khá tốt đây.

Thầy ơi em bẫy như thế này chưa được uh?
PHP:
If eRw1 = 10 Then MsgBox "Khong tim thay. Vui long tim lai nha!"
 
Thầy ơi em bẫy như thế này chưa được uh?
PHP:
If eRw1 = 10 Then MsgBox "Khong tim thay. Vui long tim lai nha!"
Không thấy mã thông báo thì được rồi, nhưng thông báo xong phải thoát ra, chứ hè hụi đi định dạng border và number cho cái không có ấy mà.
Còn cái ScreeenUpdating nữa, trước khi thoát ra phải trả lại = True.
 
Dạ có phải như thế này không ah?
PHP:
Option Explicit

Sub Loc_Ctiet()
Application.ScreenUpdating = False
    Dim ShSoCtiet As Worksheet
    Dim ShSoData As Worksheet
    Set ShSoCtiet = Sheets("SOCTIET")
    Set ShSoData = Sheets("CSDL")
    Dim eRw As Long, eRw1 As Long, i As Long, Kyhieu As String, Ma As String
    'Xoa du lieu
    ShSoCtiet.Range("A10:G56536").Clear 'Contents
    eRw1 = 10
    With ShSoCtiet
        Kyhieu = Trim(.[c6])
        Ma = Trim(.[c7])
        For eRw = 4 To ShSoData.[a65536].End(xlUp).Row
            'Dieu kien
            If Trim(ShSoData.Cells(eRw, 1)) = Kyhieu And Trim(ShSoData.Cells(eRw, 4)) = Ma Then
                'Lay du lieu sang neu dieu kien la dung
                .Cells(eRw1, 1).Resize(, 2) = ShSoData.Cells(eRw, 2).Resize(, 2).Value
                .Cells(eRw1, 3).Resize(, 6) = ShSoData.Cells(eRw, 5).Resize(, 6).Value
                eRw1 = eRw1 + 1
            End If
        Next
    End With
    'Bay loi
    If eRw1 = 10 Then MsgBox "Khong tim thay. Vui long tim lai nha!"    
    i = Range("A65535").End(xlUp).Row + 1
    With [A10].Resize(i - 10, 7) 'Ke bang
        .BorderAround LineStyle:=1
        .Borders(11).LineStyle = 1: .Borders(11).ColorIndex = 7
        .Borders(12).LineStyle = 1: .Borders(12).ColorIndex = 7
    End With
    With Cells(i, 3) 'Dien chu Cong vao bang
            .Value = "Cong"
            .Font.Bold = True
    End With
    With Cells(i, 7)  'Cong tong cot G
            .Value = "=SUM(R10C7:R" & i - 1 & "C)"
            .Font.Bold = True
    End With
    Range("E10:G" & i).NumberFormat = "_(* #,##0_);_(* (#,##0);_(* ""-""??_);_(@_)" ' Dinh dang so
    Application.ScreenUpdating = True
    Exit Sub:
    Set ShSoCtiet = Nothing
    Set ShSoData = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Lớp mình tham khảo bài tập của mình ở mục này nhé!
Code:
PHP:
Option Explicit
Sub Loc_Ctiet()
Application.ScreenUpdating = False
    Dim ShSoCtiet As Worksheet
    Dim ShSoData As Worksheet
    Set ShSoCtiet = Sheets("SOCTIET")
    Set ShSoData = Sheets("CSDL")
    Dim eRw As Long, eRw1 As Long, i As Long, Kyhieu As String, Ma As String
    'Xoa du lieu
    ShSoCtiet.Range("A10:G56536").Clear 'Contents
    eRw1 = 10
    With ShSoCtiet
        Kyhieu = Trim(.[c6])
        Ma = Trim(.[c7])
        For eRw = 4 To ShSoData.[a65536].End(xlUp).Row
            'Dieu kien
            If Trim(ShSoData.Cells(eRw, 1)) = Kyhieu And Trim(ShSoData.Cells(eRw, 4)) = Ma Then
                'Lay du lieu sang neu dieu kien la dung
                .Cells(eRw1, 1).Resize(, 2) = ShSoData.Cells(eRw, 2).Resize(, 2).Value
                .Cells(eRw1, 3).Resize(, 6) = ShSoData.Cells(eRw, 5).Resize(, 6).Value
                eRw1 = eRw1 + 1
            End If
        Next
    End With
    'Thong bao neu khong tim thay va thoat luon
    If eRw1 = 10 Then MsgBox "Khong tim thay. Vui long tim lai nha!": Exit Sub
    i = Range("A65535").End(xlUp).Row + 1
    With [A10].Resize(i - 9, 7) 'Ke bang
        .BorderAround LineStyle:=1
        .Borders(11).LineStyle = 1: .Borders(11).ColorIndex = 7
        .Borders(12).LineStyle = 1: .Borders(12).ColorIndex = 7
    End With
    With Cells(i, 3) 'Dien chu Cong vao bang
            .Value = "Cong"
            .Font.Bold = True
    End With
    With Cells(i, 7)  'Cong tong cot G
            .Value = "=SUM(R10C7:R" & i - 1 & "C)"
            .Font.Bold = True
    End With
    Range("E10:G" & i).NumberFormat = "_(* #,##0_);_(* (#,##0);_(* ""-""??_);_(@_)" ' Dinh dang so
    Application.ScreenUpdating = True
    Set ShSoCtiet = Nothing
    Set ShSoData = Nothing
End Sub
Find đính kèm ne....
 

File đính kèm

Tối ưu nhất và gọn nhất theo tôi là viết code dựa trên cơ sở AutoFilter hoặc Advanced Filter chứ không phải dùng For.. Next

Vì đây là mang tính học thuật nên không khuyến kích sử dụng các chức năng sẵn có của Excel bác ạ, vì nhiều người có thể phát triển thêm VBA for Cad, VB6, VB.NET,... nữa.
 
Dạ có phải như thế này không ah?
PHP:
Option Explicit

Sub Loc_Ctiet()
......
            ''Dieu kien
            If Trim(ShSoData.Cells(eRw, 1)) = Kyhieu And Trim(ShSoData.Cells(eRw, 4)) = Ma Then
                ''Lay du lieu sang neu dieu kien la dung
                .Cells(eRw1, 1).Resize(, 2) = ShSoData.Cells(eRw, 2).Resize(, 2).Value
                .Cells(eRw1, 3).Resize(, 6) = ShSoData.Cells(eRw, 5).Resize(, 6).Value
                eRw1 = eRw1 + 1
            End If
        Next
    End With
    ''Bay loi
    If eRw1 = 10 Then MsgBox "Khong tim thay. Vui long tim lai nha!"    
    i = Range("A65535").End(xlUp).Row + 1
    With [A10].Resize(i - 10, 7) 'Ke bang
        ......
    Exit Sub:
    Set ShSoCtiet = Nothing
    Set ShSoData = Nothing
End Sub

Phải thoát ra ngay khi thông báo xong. Viết như trên thì có thoát đâu, vẫn chạy từ đầu đến đuôi!
Nếu thoát ngay mà không làm gì cả thì:
PHP:
If eRw1 = 10 Then MsgBox "Khong tim thay. Vui long tim lai nha!"    : Exit Sub
Nhưng phải trả Application.Screen... về True, và giải phóng bộ nhớ nữa, nên phải tạo 1 Label. Khi đã tạo label mà muốn thoát thì phải có GoTo.

Thí dụ:
PHP:
If eRw1 = 10 Then MsgBox "Khong tim thay. Vui long tim lai nha!"    : GoTo Exit1
    'Code đóng khung & định dạng'
    ......

Exit1:
    Application.ScreenUpdating = True
    Set ShSoCtiet = Nothing
    Set ShSoData = Nothing
    Exit Sub
End Sub

Một cái lỗi nữa:
Khi lọc được dữ liệu thoả điều kiện:

- Chỉ đóng khung và định dạng cho dữ liệu tìm thấy, không đóng khung định dạng cho dòng cộng.
- Nếu chỉ có 1 dòng dữ liệu tìm thấy, do đóng khung chỉ 1 dòng nên dòng lệnh đóng khung inside vertical border và inside horizontal border bị lỗi.

Khắc phục:
Thay i - 10 trong câu With [A10].Resize(i - 10, 7) bằng i - 9. Cái này là toán số học lẽ ra không được phép sai.

Một điểm khác:
Sao không dùng biến có sẵn eRw1 mà phải tính lại biến khác là i nhỉ?
 
Sao không dùng biến có sẵn eRw1 mà phải tính lại biến khác là i nhỉ?

Theo gợi ý của ptm0412, code của bài được hoàn thiện như sau:
PHP:
Option Explicit
Sub Loc_Ctiet()
Application.ScreenUpdating = False
    Dim ShSoCtiet As Worksheet
    Dim ShSoData As Worksheet
    Set ShSoCtiet = Sheets("SOCTIET")
    Set ShSoData = Sheets("CSDL")
    Dim eRw As Long, eRw1 As Long, Kyhieu As String, Ma As String
    'Xoa du lieu
    ShSoCtiet.Range("A10:G56536").Clear 'Contents
    eRw1 = 10
    With ShSoCtiet
        Kyhieu = Trim(.[c6])
        Ma = Trim(.[c7])
        For eRw = 4 To ShSoData.[a65536].End(xlUp).Row
            'Dieu kien
            If Trim(ShSoData.Cells(eRw, 1)) = Kyhieu And Trim(ShSoData.Cells(eRw, 4)) = Ma Then
                'Lay du lieu sang neu dieu kien la dung
                .Cells(eRw1, 1).Resize(, 2) = ShSoData.Cells(eRw, 2).Resize(, 2).Value
                .Cells(eRw1, 3).Resize(, 6) = ShSoData.Cells(eRw, 5).Resize(, 6).Value
                eRw1 = eRw1 + 1
            End If
        Next
    End With
    'Thong bao neu khong tim thay va thoat luon
    If eRw1 = 10 Then MsgBox "Khong tim thay. Vui long tim lai nha!": GoTo lblExit
    'i = Range("A65535").End(xlUp).Row + 1
    With [A10].Resize(eRw1 - 9, 7) 'Ke bang
        .BorderAround LineStyle:=1
        .Borders(11).LineStyle = 1: .Borders(11).ColorIndex = 7
        .Borders(12).LineStyle = 1: .Borders(12).ColorIndex = 7
    End With
    With Cells(eRw1, 3)  'Dien chu Cong vao bang
            .Value = "Cong"
            .Font.Bold = True
    End With
    With Cells(eRw1, 7)  'Cong tong cot G
            .Value = "=SUM(R10C7:R" & eRw1 - 1 & "C)"
            .Font.Bold = True
    End With
    Range("E10:G" & eRw1).NumberFormat = "_(* #,##0_);_(* (#,##0);_(* ""-""??_);_(@_)" ' Dinh dang so
lblExit:
   Application.ScreenUpdating = True
    Set ShSoCtiet = Nothing
    Set ShSoData = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Trời ơi! Câu lệnh set ScreenUpdating = True phải để dưới dòng lblExit chứ! Để trên thì khi lỗi nó đâu có chạy?
Với lại, cho xin, đừng gọi chú xưng cháu trên GPE.
 
Trời ơi! Câu lệnh set ScreenUpdating = True phải để dưới dòng lblExit chứ! Để trên thì khi lỗi nó đâu có chạy?

Code ở #245 copy nhầm (đã hiệu chỉnh). Thật cẩu thả quá!! Cám ơn ptm0412 đã phát hiện ra. Thiệt là...hu hu...+-+-+-+
 
Lap so chi tiet

Bài của Ngọc viết đã chạy đúng khá tốt nhưng chưa áp dụng được hết các kiến thức đã học.

Dưới đây là đáp án bài tập về nhà của lớp học VBA. Bài giải của tôi dưới đây chỉ viết lên các kiến thức mà lớp đã được học trong thời gian vừa qua.

Các kiến thức ứng dụng trong bài tập này:
+ Khai báo biến
+ Khai báo hằng số
+ Khai báo và sử dụng Label
+ Khai thác đối tượng Range
+ Sử dụng vòng lặp For
+ Sử dụng khối lệnh IF
+ Lập trình an toàn với bẫy lỗi On Error
+ Lập trình trong thủ tục sự kiện của Worksheet
+ Lập trình tường minh (đọc dễ hiểu)

'Dưới đây là đáp án
Mã:
Sub LocSoChitiet()
    [COLOR="seagreen"]'Bay loi[/COLOR]
    On Error GoTo lbEndSub
    [COLOR="seagreen"]'Khai bao bien, hang so[/COLOR]
    Dim ShSoCtiet As Worksheet
    Dim ShSoData As Worksheet
    Dim SoData_EndRow As Long, SoChiTiet_iRow As Long, SoData_iRow As Long[COLOR="seagreen"] 'Index of row[/COLOR]
    Dim Kyhieu As String, MaHang As String
    
    [COLOR="seagreen"]'Khai bao hang so[/COLOR]
    Const SoChiTiet_StartRow = 10
    Const SoSoData_StartRow = 4
    
    [COLOR="seagreen"]'Nhan doi tuong sheet cho cac so[/COLOR]
    Set ShSoCtiet = Sheets("SOCTIET")
    Set ShSoData = Sheets("CSDL")
    
    Application.ScreenUpdating = False
   [COLOR="seagreen"] 'Xoa du lieu[/COLOR]
    ShSoCtiet.Range("A" & SoChiTiet_StartRow & ":G65536").Clear[COLOR="seagreen"] 'Xoa toa bo noi dung va dinh dang[/COLOR]
    SoChiTiet_iRow = SoChiTiet_StartRow
    With ShSoCtiet
        Kyhieu = Trim(.Range("C6").Value)
        MaHang = Trim(.Range("C7").Value)
       [COLOR="green"] 'Chay tu dong dau tien toi dong cuoi cua SoData[/COLOR]
        SoData_EndRow = ShSoData.Range("A65536").End(xlUp).Row
        For SoData_iRow = SoSoData_StartRow To SoData_EndRow
           [COLOR="green"] 'Dieu kien[/COLOR]
            If Trim(ShSoData.Cells(SoData_iRow, 1)) = Kyhieu And Trim(ShSoData.Cells(SoData_iRow, 4)) = MaHang Then
                [COLOR="green"]'Lay du lieu tu So Kho sang neu dieu kien la dung[/COLOR]
                .Cells(SoChiTiet_iRow, 1).Value = ShSoData.Cells(SoData_iRow, 2).Value [COLOR="green"]'So CT[/COLOR]
                .Cells(SoChiTiet_iRow, 2).Value = ShSoData.Cells(SoData_iRow, 3).Value[COLOR="green"] 'Ngay CT[/COLOR]
                .Cells(SoChiTiet_iRow, 3).Value = ShSoData.Cells(SoData_iRow, 5).Value [COLOR="green"]'Dien giai[/COLOR]
                .Cells(SoChiTiet_iRow, 4).Value = ShSoData.Cells(SoData_iRow, 6).Value[COLOR="green"] 'DVT[/COLOR]
                .Cells(SoChiTiet_iRow, 5).Value = ShSoData.Cells(SoData_iRow, 7).Value[COLOR="green"] 'Slg[/COLOR]
                .Cells(SoChiTiet_iRow, 6).Value = ShSoData.Cells(SoData_iRow, 8).Value [COLOR="green"]'Don Gia[/COLOR]
                .Cells(SoChiTiet_iRow, 7).Value = ShSoData.Cells(SoData_iRow, 9).Value [COLOR="green"]'T.Tien[/COLOR]
                SoChiTiet_iRow = SoChiTiet_iRow + 1[COLOR="green"] 'Tang so dong len 1 don vi[/COLOR]
            End If
        Next
    End With
    [COLOR="green"]'Thong bao neu khong tim thay va thoat luon[/COLOR]
    If SoChiTiet_iRow = SoChiTiet_StartRow Then
        MsgBox "Khong tim thay. Vui long tim lai nha!", vbCritical
        GoTo lbEndSub
    End If
    [COLOR="green"]'Ke vien cho bang[/COLOR]
    With ShSoCtiet.Range("A" & SoChiTiet_StartRow & ":G" & SoChiTiet_iRow)
        .BorderAround LineStyle:=xlContinuous
        With .Borders(xlInsideVertical)[COLOR="green"] ' Vien doc[/COLOR]
            .LineStyle = xlContinuous
            .ColorIndex = vbBlack
        End With
        With .Borders(xlInsideHorizontal) [COLOR="green"]'Vien ngang[/COLOR]
            .LineStyle = xlContinuous
            .ColorIndex = vbBlack
        End With
    End With
   [COLOR="green"] 'Ghi dong Cong vao bang[/COLOR]
    With ShSoCtiet.Cells(SoChiTiet_iRow, 3)
        .Value = "Cong: "
        .Font.Bold = True
    End With
    With ShSoCtiet.Cells(SoChiTiet_iRow, 7)  'Cong tong cot G
        .Formula = "=SUM(G" & SoChiTiet_StartRow & ":G" & SoChiTiet_iRow - 1 & ")"
        .Font.Bold = True
    End With
  [COLOR="green"]  'Dinh dang cot tien te[/COLOR]
    ShSoCtiet.Range("F" & SoChiTiet_StartRow & ":G" & SoChiTiet_iRow).NumberFormat = "_(* #,##0_);_(* (#,##0);_(* ""-""??_);_(@_)"
    
[COLOR="green"]'Label[/COLOR]
lbEndSub:
    Application.ScreenUpdating = True
    Set ShSoCtiet = Nothing
    Set ShSoData = Nothing
    
[COLOR="green"]    'Neu co loi (Err<>0) thi thong bao loi[/COLOR]
    If Err <> 0 Then
        MsgBox Err.Description, vbCritical
    End If
End Sub

Các thành viên download file về chạy thử.
 

File đính kèm

Lần chỉnh sửa cuối:
Bài học ngày 23/11/2010 Thiết kế Form trong Excel và lập trình sự kiện
Nguyên văn file gốc của thầy Phan tự hướng

Upfile mãi toàn báo lỗi. File dung lượng vượt quá cho phép.
Mình đã gửi vào mail của lớp các bạn vào dow nhé
 
Bài học ngày 23/11/2010 Thiết kế Form trong Excel và lập trình sự kiện
Nguyên văn file gốc của thầy Phan tự hướng

Upfile mãi toàn báo lỗi. File dung lượng vượt quá cho phép.
Mình đã gửi vào mail của lớp các bạn vào dow nhé

Anh Minh ơi, em check mail rùi nhưng đâu có!? Anh kiểm tra lại nha!
 
Khi chúng ta đang hị hụi duyệt qua từng ô của UsedRange để xác định xem sheet có rỗng không thì quên mất 1 vấn đề là:
Nếu Sheet rỗng thì IsEmpty(ActiveSheet.usedrange)=True. **~**

Vì vậy đoạn code hôm qua có thể sửa lại cho đơn giản và ngắn hơn nữa --=0.
 
Anh Minh ơi, anh gửi bài học hôm qua vào mail cho em nhé!
Cám ơn anh Minh nhiều!
 
Anh Minh ơi, anh gửi bài học hôm qua vào mail cho em nhé!
Cám ơn anh Minh nhiều!
Sorry chú nhé. Anh hôm nay loay cái vụ mất dữ liệu mãi. chuă gửi được.
Tìm mãi bài không thấy nhờ hương gửi lại và gửi cho chú
 

File đính kèm

Sang tuần thầy Tuân sẽ có 1 buổi về menu (trong Excel 2003) và Ribbon trong 2007 vào ngày thứ 3 hoặc 5.
 
Còn hai buổi cuối cùng. Tôi sẽ cùng mọi người khai thác phần menu Ribbon và menu kiểu Office 2003 (nếu còn thời gian). Quá trình hướng dẫn tôi cũng nói luôn vè tổ chức menu trong một phần mềm.

IC14226.gif


Học tạo menu Ribbon là khó, ngay cả với người đã từng lập trình VBA nhìn cái này cũng đã hoa mắt, tuy nhiên tôi hy vọng chúng ta thật chú ý và cùng tôi khai thác là được.
Trước khi vào buổi tối nay, tôi muốn mọi người đọc trước lần lượt nỗi dung về menu Ribbon qua các đường link dưới đây:

Customizing the 2007 Office Fluent Ribbon for Developers (Part 1 of 3)

Customizing the 2007 Office Fluent Ribbon for Developers (Part 2 of 3)
Customizing the 2007 Office Fluent Ribbon for Developers (Part 3 of 3)

OfficeCustomUIEditorSetup
2007 Office System Document: Lists of Control IDs
2007 Office System Document: UI Style Guide for Solutions and Add Ins
2007 Office System Add-In: Icons Gallery
2007 Office System Document: Developer Overview of the User Interface

Mọi cần thiết download tất cả tài liệu trên nhé. Nó là cẩm nang lập trinhg Ribbon sau này ta còn dùng nhiều.
 
Lần chỉnh sửa cuối:
thầy ơi,
em gửi thầy btvn em làm, em ko biết là đã được chưa. thầy xem giúp em với. em đã thêm nút enabled = false vào rồi nhưng em muốn là khi nút "thư có file đính kèm" được chọn thì nút " chọn file" sẽ sáng nhưng chưa biết làm thế nào. thầy góp ý giúp em để em làm tiếp ah
 

File đính kèm

thầy ơi,
em gửi thầy btvn em làm, em ko biết là đã được chưa. thầy xem giúp em với. em đã thêm nút enabled = false vào rồi nhưng em muốn là khi nút "thư có file đính kèm" được chọn thì nút " chọn file" sẽ sáng nhưng chưa biết làm thế nào. thầy góp ý giúp em để em làm tiếp ah

Hương ơi, em gửi cho anh bài học hôm nay vào mail này cho anh nữa nhé!
Cám ơn Hương nhiều!
 
thầy ơi,
em gửi thầy btvn em làm, em ko biết là đã được chưa. thầy xem giúp em với. em đã thêm nút enabled = false vào rồi nhưng em muốn là khi nút "thư có file đính kèm" được chọn thì nút " chọn file" sẽ sáng nhưng chưa biết làm thế nào. thầy góp ý giúp em để em làm tiếp ah

File em gửi chưa cắt bỏ phấn ".zip" nên mọi người không đọc được. Tôi cắt bỏ phần ".zip" và upload lại cho em.
Nhìn qua thấy tốt đố, có gì sẽ góp ý với em sau.
 

File đính kèm

em gửi thầy BTVN-Ribbon, thuộc tính getEnabled e chưa làm được, thầy xem bài rồi góp ý cho e với. E cám ơn thầy !
 

File đính kèm

Lần chỉnh sửa cuối:
Để thay đổi trạng thái nút bấm Enabled = true/false thì phải khai báo làm thêm các thộc tính sau:

1. Khai báo thêm thuộc tính Callback là onLoad ở khoá XML customUI
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnLoadUI">

2. Tại nút bấm nhận trạng thái Enable = true/false phải khai báo thêm thuộc tính Callback là getEnabled
Ví dụ:
<button id="customButton2" label="File Đính Kèm" size="normal" onAction="fileDinhKem" imageMso="AttachMenu" supertip="Bạn chọn File ở đây" getEnabled="OnGetEnabled" />


Sau khi sửa như trên, mở file Excel có menu Ribbon, vào VBA/VBE khai báo thêm hai thủ tục callback OnLoadUI, OnGetEnabled trong Module.

Mã:
Public MyRibbonUI As IRibbonUI [COLOR="darkgreen"]'Biến nhận điều khiển Ribbon[/COLOR]
Dim bHasFile As Boolean [COLOR="darkgreen"]'Biến nhận trạng thái Enabled[/COLOR]
[COLOR="green"]'Callback for customUI.onLoad
'Get instance to RibbonUI[/COLOR]
Sub [COLOR="blue"]OnLoadUI[/COLOR](ribbon As IRibbonUI)
    Set MyRibbonUI = ribbon
End Sub

[COLOR="green"]'Callback for customButton getEnabled[/COLOR]
Sub [COLOR="blue"]OnGetEnabled[/COLOR](control As IRibbonControl, ByRef returnedVal)
    returnedVal = bHasFile
End Sub

[COLOR="green"]
'Callback for customButton1 onAction[/COLOR]
Sub guiThuKemFile(control As IRibbonControl)
    bHasFile = Not bHasFile
[COLOR="green"]    'Refresh "File Dinh Kem" button[/COLOR]
    MyRibbonUI.InvalidateControl "customButton2" [COLOR="darkgreen"]'"[B]customButton2[/B]" là id của nút "File Đính Kèm"[/COLOR]
[COLOR="green"]    'Answer[/COLOR]
    MsgBox "Thu nay " & IIf(bHasFile, "phai", "khong") & " chua file di kem"
End Sub


Mình gửi hai bài đã sửa lại cho 2 bạn Huongchuoi và ZeroX. Các bạn hãy mở mã nguồn XML để xem và tìm hiểu thêm hai thuộc tính mới nhé.

Chạy kiểm tra:
Bài của Huongchuoi. Bấm vào nút "Gửi Thư Kèm File" thì nút "File Đính Kèm" sáng.
Bài của ZeroX. Bấm vào nút "Tính Toán" thì nút "Kiểm Tra" sáng.


Mới học một buổi về tạo menu Ribbon mà làm được thế này là quá tốt rồi, buổi ngày Thứ 5 mình sẽ hướng dẫn các bạn nâng cao hơn về kỹ thuật tạo menu Ribbon.

Với các bạn đã nghỉ buổi học hôm trước, cần liên hệ các bạn đã đi học hôm Thứ 3 để học nếu không buổi ngày Thứ 5 sẽ rất khó nắm bắt cùng.
 

File đính kèm

Lần chỉnh sửa cuối:
Bài học về menu này quá hay, xin lỗi vì em đang công tác nên không làm bài gửi lên mạng được.
Ai hôm thứ 3 không đi học thì rất phí, nên xem và thứ 5 đi học lại. Thứ 5 cũng là buổi cuối rồi

Em đang có nhu cầu học nâng cao hơn nữa. Lớp mình có ai cũng có nhu cầu như em liên lạc để tổ chức học thêm nha.
 
Bài học về menu này quá hay, xin lỗi vì em đang công tác nên không làm bài gửi lên mạng được.
Ai hôm thứ 3 không đi học thì rất phí, nên xem và thứ 5 đi học lại. Thứ 5 cũng là buổi cuối rồi

Em đang có nhu cầu học nâng cao hơn nữa. Lớp mình có ai cũng có nhu cầu như em liên lạc để tổ chức học thêm nha.

Học lớp mới thì từ từ cái đã chớ. Chờ một thời gian để còn tiêu hoá cái cũ đã chứ. Tối nay 02/12/2010 bài học mình thấy rất hay nhưng hơi tiếc mọi người đi học không đủ.
Lấy ý kiến mọi người xem hôm nào tổ chức tổng kết lớp nhỉ?
 
Đây là bài viết về Những nguyên tắc cơ bản xây dựng phần mềm trên Excel để lớp học tham khảo.
 

File đính kèm

Bài học về menu này quá hay, xin lỗi vì em đang công tác nên không làm bài gửi lên mạng được.
Ai hôm thứ 3 không đi học thì rất phí, nên xem và thứ 5 đi học lại. Thứ 5 cũng là buổi cuối rồi

Em đang có nhu cầu học nâng cao hơn nữa. Lớp mình có ai cũng có nhu cầu như em liên lạc để tổ chức học thêm nha.

hôm nay học rất hay anh Thắng ah. tiếc là anh ko đi đc. còn vụ học nâng cao thì chắc phải để ra tết đi anh. để mọi người ngấm đã. hơn nữa em nghĩ là cũng nên bổ sung thêm kiến thức về lập trình C hoặc C++. như hôm trước thầy Tuân nói là lớp nâng cao ko cần nhìu người. chỉ khoảng 5 người là ok nhưng trình độ phải đồng đều. có em vs anh là 2 người rùi. hehehehehe
 
Đây là bài viết về Những nguyên tắc cơ bản xây dựng phần mềm trên Excel để lớp học tham khảo.
Cám ơn thầy Hướng về tài liệu rất hay này. Thầy Hướng cho em hỏi: Em đã tải phần mềm Inno Setup về cài rùi nhưng phiên bản này nó bắt mua hay sao đó ah?
Thầy gửi cho em xin phần mềm Inno Setup (bản free) và gửi vào mail: ngoc.dak@gmail.com dùm em nhé!
Cám ơn thầy Hướng nhiều!
 
Cám ơn thầy Hướng về tài liệu rất hay này. Thầy Hướng cho em hỏi: Em đã tải phần mềm Inno Setup về cài rùi nhưng phiên bản này nó bắt mua hay sao đó ah?
Thầy gửi cho em xin phần mềm Inno Setup (bản free) và gửi vào mail: ngoc.dak@gmail.com dùm em nhé!
Cám ơn thầy Hướng nhiều!

Tiếc là cậu không đi mấy buổi vừa rồi, thầy Tuân có mấy bài rất hay về Ribbon (tuy nhiên học kiểu xml này cũng hơi mệt %#^#$).

Inno Setup 5 là bản miễn phí mà, em tải ở đây
 

File đính kèm

Tiếc là cậu không đi mấy buổi vừa rồi, thầy Tuân có mấy bài rất hay về Ribbon (tuy nhiên học kiểu xml này cũng hơi mệt %#^#$).

Inno Setup 5 là bản miễn phí mà, em tải ở đây

Vâng, cám ơn thấy Hướng. Thời gian vừa rùi em bận quá! Em biết học cái đó khó nhưng rất hay. Em rất tiếc!
 
Anh Minh ơi, Ra tết học nâng cao được không anh? Anh tổ chức lớp nữa nha.
 
Em gửi bài tập của em hôm thứ 3, mặc dù hơi muộn. Bài tập cũng là một chút thư giãn với lớp, mong các thầy góp ý. (nếu có gì không phải mong các anh chị bỏ qua nhé, Vui là chính ạ)

Đề bài: Làm một menu Ribbon trong đó vừa có menu cũ của office, vừa có menu mới riêng. Trong Tab mới vừa có nút bấm của office, vừa có các nút bấm riêng. Các nút bấm phải đảm bảo có các thuộc tính hiện: Label, Screentip, Supertip. Tạo một nút bấm mà trạng thái enable = false. (menu tiếng việt).

Hôm qua (thứ 5) có bài tập gì không vậy ạ?
 

File đính kèm

Em gửi bài tập của em hôm thứ 3, mặc dù hơi muộn. Bài tập cũng là một chút thư giãn với lớp, mong các thầy góp ý. (nếu có gì không phải mong các anh chị bỏ qua nhé, Vui là chính ạ)

Đề bài: Làm một menu Ribbon trong đó vừa có menu cũ của office, vừa có menu mới riêng. Trong Tab mới vừa có nút bấm của office, vừa có các nút bấm riêng. Các nút bấm phải đảm bảo có các thuộc tính hiện: Label, Screentip, Supertip. Tạo một nút bấm mà trạng thái enable = false. (menu tiếng việt).

Hôm qua (thứ 5) có bài tập gì không vậy ạ?
A lố...Alô.... Huongchuoi đâu rùi. Dow file về test đi. Chắc đêm nay chỉ ngồi bấm cái Icon "trái tim" thôi ah. Nếu hỏng chuột ngoài thì dùng chuột Laptop nhé. Nghe giang hồ đồn thổi thangacc cài 1 đoạn code bí mật, nếu click vào "trái tim" 9999^1000 lần thì nó sẽ hiện lên Msgbox với lời nhắn:........ Click đủ mới biêt. Không chơi ViewCode đâu nhé. Code này ẩn rùi. :))
 
A lố...Alô.... Huongchuoi đâu rùi. Dow file về test đi. Chắc đêm nay chỉ ngồi bấm cái Icon "trái tim" thôi ah. Nếu hỏng chuột ngoài thì dùng chuột Laptop nhé. Nghe giang hồ đồn thổi thangacc cài 1 đoạn code bí mật, nếu click vào "trái tim" 9999^1000 lần thì nó sẽ hiện lên Msgbox với lời nhắn:........ Click đủ mới biêt. Không chơi ViewCode đâu nhé. Code này ẩn rùi. :))


thế anh cũng mất cả đêm ah???
 
em đã phát hiện ra. anh Minh dám lừa em nha. a cứ chờ xem em sẽ xử lý anh như thế nào
 
Em gửi bài tập của em hôm thứ 3, mặc dù hơi muộn. Bài tập cũng là một chút thư giãn với lớp, mong các thầy góp ý. (nếu có gì không phải mong các anh chị bỏ qua nhé, Vui là chính ạ)

Đề bài: Làm một menu Ribbon trong đó vừa có menu cũ của office, vừa có menu mới riêng. Trong Tab mới vừa có nút bấm của office, vừa có các nút bấm riêng. Các nút bấm phải đảm bảo có các thuộc tính hiện: Label, Screentip, Supertip. Tạo một nút bấm mà trạng thái enable = false. (menu tiếng việt).

Hôm qua (thứ 5) có bài tập gì không vậy ạ?

So với buổi học hôm Thứ 3 vừa rồi thi bài làm rất tốt. Thắng liên hệ HuongChuoi để lấy bài hôm Thứ 5, bài nài nâng cao kỹ thuật tạo Ribbon và công cụ hỗ trợ việc tạo XML Ribbon rất dễ dùng.
 
em đã phát hiện ra. anh Minh dám lừa em nha. a cứ chờ xem em sẽ xử lý anh như thế nào

Hương bấm 1000 lần à? khổ thân em. Do yêu cầu của đề bài nên mới cần phải có trái tim kia, cũng là chút thư giãn.
Em có file bài hôm thứ 5 của thầy có thể zip nó lại rồi gửi mail giúp anh không?
 
Hương bấm 1000 lần à? khổ thân em. Do yêu cầu của đề bài nên mới cần phải có trái tim kia, cũng là chút thư giãn.
Em có file bài hôm thứ 5 của thầy có thể zip nó lại rồi gửi mail giúp anh không?

e chưa bấm 1000 lần đâu, nhưng cũng phải đến chục lần có dư và em phát hiện ra mình bị lừa.:=\+:=\+:=\+:=\+:=\+:=\+
lần này em sẽ cho anh Minh biết tay..........
ANH MINH HÃY XEM ĐÂY.......)(&&@@)(&&@@)(&&@@)(&&@@)(&&@@)(&&@@)(&&@@)(&&@@)(&&@@
mà sao phải ấn vào trái tim thì em mới được xuất hiện.???????
anh đưa địa chỉ mail để em gửi cho
 
mail của anh thangacc@gmail.com
Lý do tại sao phải ấn vào trái tim thì em cứ để chuột lên trên cái logo của em nó sẽ hiện lên nhé. Đây là bài anh làm theo đúng yêu cầu của thầy mà (có cả supertip)
 
mail của anh thangacc@gmail.com
Lý do tại sao phải ấn vào trái tim thì em cứ để chuột lên trên cái logo của em nó sẽ hiện lên nhé. Đây là bài anh làm theo đúng yêu cầu của thầy mà (có cả supertip)

ý em là em với cái trái tim đấy có liên quan j đến nhau. a nên chọn logo có 1 nửa trái tim thôi
 
có vẻ như anh Minh sợ quá bỏ cả diễn đàn rùi ah?????????
 
có vẻ như anh Minh sợ quá bỏ cả diễn đàn rùi ah?????????
Bỏ làm sao được cơ chớ. Chót "thương", chót "nhớ", chót vấn vương rùi....Một ngày dù bận đến mấy cũng phải "dạo" qua một vòng xem dân tình GPE thế nào. Lớp mình có ai chăm học không. Có sáng kiến ý tưởng gì mới không. Mỗi tội bản thân chưa làm nên được việc gì cả.
Thôi, chém gió ít thôi làm bài tập đi nhé.
 
Thân gửi thangacc chiểu theo đề nghị của bạn huongchuoi tôi đã gửi toàn bộ thông tin liên quan đến bổi học thứ 12 vào mail của lớp mình. Bao gồm cả bộ cài đặt các chương trình liên quan.
Các thành viên khác không tham gia được hai buổi cuối dow về tham khảo.
Nếu ai đọc mà chưa hiểu, Cần phụ đạo thêm thì mời thangacchuongchuoi đi uống cafe là ổn ngay thôi. Nhớ gọi cả tui nữa nhé --=0--=0--=0.
 
Thân gửi thangacc chiểu theo đề nghị của bạn huongchuoi tôi đã gửi toàn bộ thông tin liên quan đến bổi học thứ 12 vào mail của lớp mình. Bao gồm cả bộ cài đặt các chương trình liên quan.
Các thành viên khác không tham gia được hai buổi cuối dow về tham khảo.
Nếu ai đọc mà chưa hiểu, Cần phụ đạo thêm thì mời thangacchuongchuoi đi uống cafe là ổn ngay thôi. Nhớ gọi cả tui nữa nhé --=0--=0--=0.

hèm hèm. cái này em ko nhận đâu nha tại anh Minh PR có gì thắc mắc pà con cứ hỏi anh Minh.-=09=-=09=-=09=-=09=
 
Khi nào các bạn xây dựng được chương trình trên Excel nhớ thông báo nhé!
 
Cái trái tim ấy làm gì mà click 1000 cái. Hai cái còn chả được.
Click cái thứ nhất thì enable được nút "huongchuoi", nhấn cái thứ 2 đã báo lỗi câu này rồi:

MyRibbonUI.InvalidateControl "huongchuoi" '
 
Anh Minh ơi em không biết cách vào gmail của lớp, hic
Nhưng em cũng nhận được bài rồi, cảm ơn anh và em Hương nhiều
 
Cái trái tim ấy làm gì mà click 1000 cái. Hai cái còn chả được.
Click cái thứ nhất thì enable được nút "huongchuoi", nhấn cái thứ 2 đã báo lỗi câu này rồi:

MyRibbonUI.InvalidateControl "huongchuoi" '

Em bấm gần 1000 lần không thấy báo lỗi, ấn lần 1 nick em Hương sáng, bấm lần 2 tối, lần 3 sáng, lần 4 tối, 5 sáng, 6 tối, sáng, tối, sáng, tối..... Như kiểu "yêu/không yêu/yêu/không yêu/yêu/không yêu..." ý vui lắm
Đến 1000 lần sẽ thấy cái vui hơn anh Minh nhỉ
 
Em bấm gần 1000 lần không thấy báo lỗi, ấn lần 1 nick em Hương sáng, bấm lần 2 tối, lần 3 sáng, lần 4 tối, 5 sáng, 6 tối, sáng, tối, sáng, tối..... Như kiểu "yêu/không yêu/yêu/không yêu/yêu/không yêu..." ý vui lắm
Đến 1000 lần sẽ thấy cái vui hơn anh Minh nhỉ

Đúng là mình bấm cũng nhiều nhiều. không thấy báo lỗi mà. Chắc office của bác ptm0412 là 2003 rùi.
Còn cái vụ
Như kiểu "yêu/không yêu/yêu/không yêu/yêu/không yêu..."
Làm em Huong hỏng mất chuột rùi. Chủ nhật này gặp lại nhớ mua chuột đền nhé.
 
Em bấm gần 1000 lần không thấy báo lỗi, ấn lần 1 nick em Hương sáng, bấm lần 2 tối, lần 3 sáng, lần 4 tối, 5 sáng, 6 tối, sáng, tối, sáng, tối..... Như kiểu "yêu/không yêu/yêu/không yêu/yêu/không yêu..." ý vui lắm
Đến 1000 lần sẽ thấy cái vui hơn anh Minh nhỉ

em chưa thử đến 1000 lần. các anh đừng có dụ dỗ để lừa em nhé
 
Đúng là mình bấm cũng nhiều nhiều. không thấy báo lỗi mà. Chắc office của bác ptm0412 là 2003 rùi.
Còn cái vụ
Làm em Huong hỏng mất chuột rùi. Chủ nhật này gặp lại nhớ mua chuột đền nhé.

anh phải mua con chuột xịn đấy nhé. tại anh mà hỏng hết rùi
 
Đúng là mình bấm cũng nhiều nhiều. không thấy báo lỗi mà. Chắc office của bác ptm0412 là 2003 rùi.
Còn cái vụ
Làm em Huong hỏng mất chuột rùi. Chủ nhật này gặp lại nhớ mua chuột đền nhé.

2003 làm gì có ribbon mà test trời?
Hôm đó tôi test bằng 2010 thì bị lỗi, hôm nay test bằng 2007 thì không lỗi. Tức quá, test lại bằng 2010, lần này không lỗi nữa. Chắc sức mạnh tình iu của cái trái tim làm cho test code lần đầu bị run rẩy rồi. Sorry nhé.
 
2003 làm gì có ribbon mà test trời?
Hôm đó tôi test bằng 2010 thì bị lỗi, hôm nay test bằng 2007 thì không lỗi. Tức quá, test lại bằng 2010, lần này không lỗi nữa. Chắc sức mạnh tình iu của cái trái tim làm cho test code lần đầu bị run rẩy rồi. Sorry nhé.

May quá em để 1 trái tim, em để 3 trái tim vào đấy chắc mấy cái máy phải sửa quá.
Để có 1 trái tim nên may mới bị hỏng mỗi con chuột --=0--=0}}}}}}}}}}}}}}}
 
anh phải mua con chuột xịn đấy nhé. tại anh mà hỏng hết rùi

Trời! chuột "xịn" hả để xin phép mod giao vặt tại đây 1 tin:

Có ai biết chuột không dây mà có "thu" bi bán ở đâu không vậy? Chỉ giúp em mua mai còn đền cho người ta.
giá nào E cũng chịu ah
.
 
Trời! chuột "xịn" hả để xin phép mod giao vặt tại đây 1 tin:

Có ai biết chuột không dây mà có "thu" bi bán ở đâu không vậy? Chỉ giúp em mua mai còn đền cho người ta.
giá nào E cũng chịu ah
.

có đấy có đấy. nhưng anh phải trả cả đời đấy. anh có chịu ko?????
 
Tiếc là cậu không đi mấy buổi vừa rồi, thầy Tuân có mấy bài rất hay về Ribbon (tuy nhiên học kiểu xml này cũng hơi mệt %#^#$).

Inno Setup 5 là bản miễn phí mà, em tải ở đây

Thầy Hướng ơi, em xem phần mềm Inno Setup đóng gói rất tiện. Nhưng em mò mãi không làm thành công. Thầy vui lòng chỉ dẫn cho em nhé!!
 
Thầy Hướng ơi, em xem phần mềm Inno Setup đóng gói rất tiện. Nhưng em mò mãi không làm thành công. Thầy vui lòng chỉ dẫn cho em nhé!!

Trước khi đóng gói để chạy, em biến xls thành exe nhờ Lockxls đã. Sau đó mới dùng Inno Setup để tạo bộ cài.
 
Các bạn lớp VBA Hà nội đâu hết cả rồi nhỉ. Bài tập vẫn chưa thấy Post lên vậy?
 

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

Back
Top Bottom