• Cập nhật control user form excel
  • RE: Cập nhật control user form excel

    ongke0711 > 05-05-21, 08:45 AM

    Anh thêm dòng code này vô đầu code mỗi Sub/Function.

       Application.Calculation = xlCalculationManual

    Cuối Sub/Function trả lại hiện trạng Auto cho nó.
    Khi Cell thay đổi giá trị Excel tự tính toán Sheet đó, giống như Refresh vậy nên khi anh thay đổi B2, nó Refresh liền, trả lại giá trị như cũ trên các textbox chưa thay đổi. Thường thì tắt nó đi sau khi chạy code xong mở lại để tránh sai và chậm code.
    Anh nên dùng cặp code này:

    Mã PHP:
    Private Sub Sua_Click()
        Application.ScreenUpdating False
        Application
    .Calculation xlCalculationManual
        
        
    ...... code here

        Application
    .ScreenUpdating True   
        Application
    .Calculation xlCalculationAutomatic 
  • RE: Cập nhật control user form excel

    tranthanhan1962 > 05-05-21, 09:37 AM

    OK tuyệt vời! Giống như bỏ bùa vậy. 1 phát ăn ngay. Thank bạn
  • RE: Cập nhật control user form excel

    ongke0711 > 05-05-21, 01:43 PM

    Mấy cái Sheet dữ liệu anh định dạng nó thành Table luôn có nhiều cái tiện lợi trong xử lý code hợn thay vì chỉ dùng Range.
  • RE: Cập nhật control user form excel

    tranthanhan1962 > 05-05-21, 06:01 PM

    OK! Giờ mới thấy kiến thức không xử dụng bị bào mòn theo thời gian, đúng là tuổi già không nhân nhượng với ai cả. Cũng nhờ có các bạn chứ nếu không thì đơ như cây cơ
  • RE: Cập nhật control user form excel

    thuyyeu99 > 05-05-21, 11:36 PM

    Tại không phải sở trường của anh. Anh Bảo có cái demo tìm kiếm trên listbox hay lắm đó anh
  • RE: Cập nhật control user form excel

    tranthanhan1962 > 06-05-21, 01:05 AM

    Hồi xưa cũng vật vã nhiều với VBA excel (Khoảng trước năm 2000). Hồi đó mình dạy bằng A ở trung tâm, Sau này nhảy qua dạy bằng B (foxpro rồi access) rồi bỏ ngành làm kế toán báo thuế, bán phần mềm ứng dụng, ... Đâu có nghĩ sẽ viết lại một cái ứng dụng kế toán kho bằng excel đâu. Mới xem lại cái function OFFSET kết hợp với COUNTA để xử lý Name Manager cho dữ liệu động cũng có cảm giác phê phê. Nhìn lại mình không đụng chạm đến cái VBA excel hơn 20 năm rồi, thời gian đó biết bao nhiêu là kiến thức mới. Thôi tạm gom gom mấy cái cũ để giải quyết cho xong cái vướng mắc này. Có gì cầu cứu anh em  021
  • RE: Cập nhật control user form excel

    ongke0711 > 06-05-21, 07:44 AM

    Có cái hàm tạo Name Range động để mỗi khi anh cập nhật (Thêm, xoá) dòng dữ liệu thì gọi hàm này để thiết lập Range lại.
    Nếu dùng Table thì không cần.

    Mã PHP:
    Function createDynamicNamedRange(sSheetName As StringsNameRange As String) As Boolean
    '--------------------------------------------------------------------------------------
    '
    # Áp dung cho mot Named Range da thiet lap truoc, hàm chi cap nhat dong cho so dòng cua range.
    '# Dùng cho Named Range có dong tieu de va khong có dòng tieu de.
    '
    # Khi gap NR 'không có' dòng tiêu de, khi thuc hien xóa toàn bo range (.ClearCntents): phai xet xem no có Empty không
    '# de xác dinh dòng dau, dòng cuoi tao range dè len dòng tiêu de.
    '
    --------------------------------------------------------------------------------------

        Dim sht As Worksheet
        Dim lngFirstRowRng 
    As Long
        Dim lngLastRowRng 
    As Long
        Dim lngFirstColRng 
    As Long
        Dim lngLastColRng 
    As Long
        Dim strColumnLetter 
    As String
        Dim myDynamicNamedRange 
    As Range

        Set sht 
    ThisWorkbook.Sheets(sSheetName)

        'Khai bao dòng/côt dau tiên cua Range
        lngFirstRowRng = sht.Range(sNameRange).Row
        lngFirstColRng = GetFirstColumn(sSheetName, sNameRange)
        strColumnLetter = ConvertToLetter(lngFirstColRng)
        With sht.Cells
            If WorksheetFunction.Count(Range(sNameRange)) = 0 Then      '
    neu range dang empty (khong có dong tieu de)
                lngLastRowRng sht.Cells(Rows.CountstrColumnLetter).End(xlUp).Row 1
                lngLastColRng 
    GetLastColumn(sSheetNamesNameRange)
            Else
                lngLastRowRng sht.Cells(Rows.CountstrColumnLetter).End(xlUp).Row
                lngLastColRng 
    GetLastColumn(sSheetNamesNameRange)
            End If
            Set myDynamicNamedRange = .Range(.Cells(lngFirstRowRnglngFirstColRng), .Cells(lngLastRowRnglngLastColRng))
        End With

        ThisWorkbook
    .Names.Add Name:=sNameRangeRefersTo:=myDynamicNamedRange

    End 
    Function




    '----------------------------------------------------------------
    '
    # Hàm lay dong cuoi dua tren [Name Range]
    '# Dung duoc trong truong hop dong dau cua Range khong phai tu 1
    '
    ----------------------------------------------------------------
    Function 
    GetLastRow(sSheetName As StringsNameRange As String) As Long
        Dim sht 
    As Worksheet
        Dim FirstRow 
    As Long
        Dim LastRow 
    As Long
        
        Set sht 
    ThisWorkbook.Sheets(sSheetName)
        FirstRow sht.Range(sNameRange).Row
        LastRow 
    sht.Range(sNameRange).Rows.Count FirstRow 1
        GetLastRow 
    LastRow
    End 
    Function

    Function 
    GetFirstColumn(sSheetName As StringsNameRange As String) As Long
        Dim sht 
    As Worksheet
        Dim FirstCol 
    As Long
        
        Set sht 
    ThisWorkbook.Sheets(sSheetName)
        FirstCol sht.Range(sNameRange).Column
        GetFirstColumn 
    FirstCol
    End 
    Function

    Function 
    GetLastColumn(sSheetName As StringsNameRange As String) As Long
        Dim sht 
    As Worksheet
        Dim LastCol 
    As Long
        
        Set sht 
    ThisWorkbook.Sheets(sSheetName)
        LastCol sht.Range(sNameRange).Columns(sht.Range(sNameRange).Columns.Count).Column
        GetLastColumn 
    LastCol
    End 
    Function 
  • RE: Cập nhật control user form excel

    tranthanhan1962 > 06-05-21, 06:12 PM

    Nếu sử dụng table thì rất sướng. Chỉ với [Table].Rows.Count là xong. Kể cả dữ liệu bị rỗng ở giữa table cũng không phải sợ. Cảm ơn ongke0711 đã nhắc về vụ table. Chứ hồi đó lúc office 95, 97 excel làm gì có table. Cứ range, offset rồi đếm 1,2,3,4,5 riết mụ cả người. 
    Kết hợp với lệnh tìm vị trí dòng đầu tiên của table: Sheets("tên sheet").ListObjects("Table").HeaderRowRange.Row là xong không cần phải quan tâm dữ liệu bên ngoài table. NHư vậy cũng tốt rồi. Nhưng cũng hơi bị chán với mấy cái lệnh excel. Không có gì là logic cả.
    Tổng số dòng là [Table].Rows.Count, 
    Thì vị trí dòng đầu cứ là [Table].HeaderRow.Value hay [Table].HeaderRow.Num gì cũng được
    Đàng này chơi một phát dài thòong Sheets("tên sheet").ListObjects("Table").HeaderRowRange.Row, cũng kèm theo chữ range không chịu bỏ
  • RE: Cập nhật control user form excel

    ongke0711 > 06-05-21, 06:38 PM

    Đối với Table hình như khi insert dữ liệu, nó tự động chèn ở dòng cuối luôn thì phải. Không cần xác định lastrow rồi mới chèn.
  • RE: Cập nhật control user form excel

    Xuân Thanh > 08-05-21, 11:37 AM

    1/ Dữ liệu trong Excel phụ thuộc vào Range
    2/ Dùng Form trong Excel rất bị động. Tốt nhất dùng FormSheet tiện lợi hơn và xử lý cũng dễ hơn(Lấy sheet tạo form)
    3/ Khi sử dụng ListBox trong Excel nên tạo Name động cho nó chứ đừng gán Name tĩnh vì khi đó không thể thêm mới hoặc sửa chữa
    4/ Dùng hàm tạo Name động như ongke0711 nêu trên là hợp lý. Nên chăng chỉ cần gộp vô một hàm duy nhất, bỏ hai cái hàm xác định LastRow và LastColumn đi cho gọn
    Thân mến