Hỏi đáp về VBA (các vấn đề căn bản nhất)

Liên hệ QC

havietchuong

Thành viên tiêu biểu
Tham gia
16/6/09
Bài viết
490
Được thích
570
Giới tính
Nam
Nghề nghiệp
Giáo viên tiểu học.
Tôi không biết đặt đặt câu hỏi này nơi nào cho đúng, xin gởi vào đây. Nếu có sai xin thông cảm cho người mới học VBA.
Trong 1 cửa sổ Module có thể ghi nhiều nhiều Macro và mỗi macro có thể ứng với 1 tổ hợp phím nào đó được không?
Tôi thử nhiều lần thì khi được khi không. Không biết nó thế nào? Trong tập tin sau có lỗi gì không trong cách ghi Macro? Cám ơn.
 

File đính kèm

  • baitap1.xls
    28 KB · Đọc: 244
Lần chỉnh sửa cuối:
Nói túm lại, đã bảo người ta chính xác thì phải phải dùng từ chính xác chứ không dùng chung chung.

Khi đã dùng CHỈ SỐ thì phải nói CHỈ SỐ LỚN NHẤT chứ không nói CHỈ SỐ TRÊN hay CHỈ SỐ NHỎ NHẤT chứ không nói CHỈ SỐ DƯỚI. Đó là sự xác định duy nhất, còn trên - dưới thì chỉ số B có thể trên chỉ số A và có thể dưới chỉ số C v.v... là không xác định.

Còn không thì cứ để "muôn sự tự nhiên hương" rồi cùng ngầm hiểu là nó, chứ đừng chỉnh sửa rồi lại chỉnh sửa theo cách chung chung, vậy thôi.

Cuối cùng là tôi không bàn cải về vấn đề này nữa! Thay vì để thời gian giải thích cho mấy bài kia về code mà bạn đó thắc mắc còn hơn!
 
Upvote 0
Thay vì bạn dùng trong Excel với hàm IF thì hàm trong VBA nó thêm một chữ I nữa đó là IIF vậy thôi. Về tính chất nó giống y chang hàm IF của Excel.

Nhưng với câu lệnh đó mà dùng IIF đó thì hơi thừa, bởi:

Thay vì:

GetMon = IIf(Arr(I, Col) = "", "", Arr(I, Col))

Thì nên như vầy:

GetMon = Arr(I, Col)

Xong!

Đằng nào nó rỗng thì GetMon nó cũng bằng rỗng, nếu nó là rỗng mà cần kết quả khác thay thế rỗng thì ta mới sử dụng hàm IIF này thôi, vì thế, tính toán thêm chi cho phức tạp vụ!
Hu hu!
Tại viết vội, thấy kết quả mấy chỗ trống hiện ra con số 0 "dzô dziêng" nên thêm hàm IIF cũng "dzô dziêng" luôn.
Khai báo như vầy thì êm "gồi":
Public Function GetMon(Ngay As Date, Thu As Long, Tiet As Long, Rng As Range) As String
Biến Cll và J khai báo sẵn, không xài cũng không xoá, càng "dzô dziêng".
Híc.
 
Lần chỉnh sửa cuối:
Upvote 0
Khi đã dùng CHỈ SỐ thì phải nói CHỈ SỐ LỚN NHẤT chứ không nói CHỈ SỐ TRÊN hay CHỈ SỐ NHỎ NHẤT chứ không nói CHỈ SỐ DƯỚI. Đó là sự xác định duy nhất, còn trên - dưới thì chỉ số B có thể trên chỉ số A và có thể dưới chỉ số C v.v... là không xác định.
Vặn chữ "chỉ số" không được, bèn vặn qua chữ "trên dưới", ha ha ha
Cuối cùng là tôi không bàn cải về vấn đề này nữa! Thay vì để thời gian giải thích cho mấy bài kia về code mà bạn đó thắc mắc còn hơn!

Nhớ giải thích cho đúng, đừng nhầm lẫn kiểu "sự kiện" và "thủ tục cho sự kiện", Do và For; và muốn dùng biên thì dùng, đừng dùng 'cận". Ha ha ha
 
Upvote 0
mấy hôm trước mình đã tự mày mò và đã làm được một file excel nhập dữ liệu từ form nhưng mình có một vài lỗi
- lúc tạo file từ một pc của mình thì các maco chạy bình thường nhưng không hiểu sao đưa file đó sang một pc khác thì không chạy được nữa mà nó giống một file bình thường

- với maco mình tạo như vậy giờ mình muốn nâng nó lên một tí là chạy nhập dữ liệu từ form mà mình đang tạo dỡ thì nó có được không
đó là những vấn đê mình thắc mắc , rất mong nhân được sự giúp đỡ của cac ban
 
Upvote 0
Mình có đoạn code bên dưới. mình muốn thay đổi lại một chút. Mình sẽ làm thêm 1 hộp combo box để thiết lập cách lựa chọn như sau. Khi combo box này chọn GIÁ SỈ thì cột E (cột số 4) và cột F (cột số 5) trong sheet HD BANHANG này sẽ lấy dữ liệu từ cột G (cột 7- Đơn giá) và cột K(cột 11- lãi) ở sheet MAHANG. Khi combo box này chọn GIÁ SỈ thì cột E (cột số 4) và cột F (cột số 5) trong sheet HD BANHANG này sẽ lấy dữ liệu từ cột Q (cột 18-KH(SL,BB) ) và cột P (cột 17- lai BL) ở sheet MAHANG

http://www.mediafire.com/view/j0cfd55xgv8hhaw/gpec_USE.xlsm


Nhờ các bạn xem qua file gởi kèm và hướng dẫn cho mình cách làm và in đậm phần code nào thay đổi. Xin cảm ơn !


Mã:
Public Check As BooleanOption Explicit
Private Sub Worksheet_Activate()
            additemcombo
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  With Target
    If .Row > 11 And .Column = 3 And .Count = 1 Then
     ComboBox1.Activate
                With ComboBox1
                        .Value = ""
                        .Top = Target.Top
                        .Visible = True
                End With
       Else
       ComboBox1.Visible = False
       End If
  End With
End Sub
Private Sub ComboBox1_Change()
 Dim ws As Worksheet, Found As Range
  If ActiveCell.Row > 11 And Sheet3.ComboBox1 <> "" Then
        For Each ws In ThisWorkbook.Worksheets
            With ws
                If ws.Name = "HD BAN HANG" Then Exit Sub
                        Set Found = .Range("D12:D50000").Find(ComboBox1.Value)
                        If Not Found Is Nothing Then
                                'Sheet HD BAN HANG Cot C12 tro xuong "Chu y offset (,2)"
                                ActiveCell.Offset(, 0).Value = Found.Offset(, 0).Value
                                'Sheet HD BAN HANG Cot H12 tro xuong
                                ActiveCell.Offset(, 5).Value = Found.Offset(, 15).Value
                                'Sheet HD BAN HANG Cot F12 tro xuong
                                ActiveCell.Offset(, 3).Value = Found.Offset(, 7).Value
                                'Sheet HD BAN HANG Cot E12 tro xuong
                                ActiveCell.Offset(, 2).Value = Found.Offset(, 3).Value
                                'Sheet HD BAN HANG Cot D12 tro xuong
                                ActiveCell.Offset(, 1).Value = Found.Offset(, 2).Value
                                'Sheet HD BAN HANG Cot B12 tro xuong
                                ActiveCell.Offset(, -1).Value = Found.Offset(, -1).Value
                                'Sheet HD BAN HANG Cot A12 tro xuong
                                ActiveCell.Offset(, -2).Value = Application.WorksheetFunction.CountA(Range("C12:C" & ActiveCell.Row))
                                Exit For
                        End If
                End With
            Next ws
  End If
 
End Sub
Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 Sheet3.ComboBox1.DropDown
End Sub
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    'Hide combo box and move to next cell on Enter and Tab
    Select Case KeyCode
        Case 9 'tab key
            ActiveCell.Offset(0, 1).Activate
        Case 13 'enter key
            ActiveCell.Offset(1, 0).Activate
        Case 37 'left
            ActiveCell.Offset(0, -1).Activate
        Case 39 'right
            ActiveCell.Offset(0, 1).Activate
        Case 46 ' delete key
          '  Me.ComboBox1.DropDown
       ' Case 38
      '     ActiveCell.Offset(-1).Activate
     '   Case 40
     '      ActiveCell.Offset(1).Activate
    End Select
 
Upvote 0
Web KT
Back
Top Bottom