-
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 -
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 String, sNameRange 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.Count, strColumnLetter).End(xlUp).Row + 1
lngLastColRng = GetLastColumn(sSheetName, sNameRange)
Else
lngLastRowRng = sht.Cells(Rows.Count, strColumnLetter).End(xlUp).Row
lngLastColRng = GetLastColumn(sSheetName, sNameRange)
End If
Set myDynamicNamedRange = .Range(.Cells(lngFirstRowRng, lngFirstColRng), .Cells(lngLastRowRng, lngLastColRng))
End With
ThisWorkbook.Names.Add Name:=sNameRange, RefersTo:=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 String, sNameRange 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 String, sNameRange 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 String, sNameRange 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