Các câu hỏi về Form trong Excel VBA

Liên hệ QC

Tường_Vi

Thành viên tiêu biểu
Tham gia
19/4/10
Bài viết
482
Được thích
121
Nghề nghiệp
Luôn tìm kiếm một vị trí tốt hơn
Private Sub UserForm_Initialize()
.......................
.......................
.......................
End Sub


Em xin hỏi, sự kiện khí nào mình dùng sự kiện này Initialize

Cám ơn
 
Cám ơn các góp ý của bác @SA_DQ , e sẽ rút kinh nghiệm chuyện này.

Và cũng rất mong bác giúp em thêm về code để nó có thể hoàn thiện hơn. Em xin cám ơn.
 
Upvote 0
Khi lưu (insert) thì gán trị cho các cột D, E.. tương ứng lấy từ các cột của cboQHNS.
vd: Range("D" & dong_cuoi) = Me.cboQHNS.Column(1)

Vậy xong.
Theo gợi ý của bạn mình đã code cho nó điền luôn khi ấn insert tuy nhiên nó hiện lỗi N/A mà chưa hiểu vì sao. minh kiểm tra thấy giá trị tìm kiếm và giá trị ở bảng tra cứu là cùng kiểu số rồi. hic. Bạn giúp mình xem lại code với

Mã:
With Sheet1

        .Range("K" & dong_cuoi) = txtQHNS.text

        .Range("C" & dong_cuoi) = txtQD.text

        .Range("D" & dong_cuoi) = Application.VLookup(txtQHNS.text, Sheet7.Range("B3:G400"), 2, 0)

        .Range("E" & dong_cuoi) = Application.VLookup(txtQHNS.text, Sheet7.Range("B3:G400"), 3, 0)

        .Range("F" & dong_cuoi) = Application.VLookup(txtQHNS.text, Sheet7.Range("B3:G400"), 4, 0)

        .Range("G" & dong_cuoi) = Replace(txtSotien.text, Mid(Format(1234, "#,##0"), 2, 1), "")

        .Range("H" & dong_cuoi) = txtKy.text

        .Range("I" & dong_cuoi) = txtLoai.text

        .Range("J" & dong_cuoi) = Application.VLookup(txtNguon.text, Sheet7.Range("H3:I400"), 2, 0)

        .Range("L" & dong_cuoi) = Application.VLookup(txtQHNS.text, Sheet7.Range("B3:G400"), 6, 0)

        .Range("P" & dong_cuoi) = txtNguon.text

        .Range("M" & dong_cuoi) = txtKhoan.text

        .Range("N" & dong_cuoi) = txtCTMT.text

        .Range("O" & dong_cuoi) = Application.VLookup(txtQHNS.text, Sheet7.Range("B3:G400"), 5, 0)

        .Range("Q" & dong_cuoi) = txtDuphong.text

        .Range("R" & dong_cuoi) = txtMaGD.text

    End With
P/S:Mình đã làm được rồi nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào mọi người !
tôi có câu hỏi cần được mọi người giúp đỡ
Khi tôi thực hiện lệnh gọi form từ macro

sub Goi_form()
userform1.show
end sub

form đã hiện lên để tôi nhập thông tin vào form nhưng không cho thực hiện thao tác khác với bảng tính như nhập liệu vào Cell như bình thường.

nhưng câu hỏi đặt ra là, làm thế nào để tôi vẫn có thể sử dụng bảng tính Excel (như nhập liệu, chỉnh sửa v..vv.) trong khi Userform đang được Show trên màn hình?
 
Upvote 0
Xin chào mọi người !
tôi có câu hỏi cần được mọi người giúp đỡ
Khi tôi thực hiện lệnh gọi form từ macro

sub Goi_form()
userform1.show
end sub

form đã hiện lên để tôi nhập thông tin vào form nhưng không cho thực hiện thao tác khác với bảng tính như nhập liệu vào Cell như bình thường.

nhưng câu hỏi đặt ra là, làm thế nào để tôi vẫn có thể sử dụng bảng tính Excel (như nhập liệu, chỉnh sửa v..vv.) trong khi Userform đang được Show trên màn hình?
Thử thế này xem sao.
Mã:
UserForm1.Show False
 
Upvote 0
thử thì Excel bị đơ luôn, Alt + F4 thì out ra vào báo lỗi VBA Can't quit at this time rồi tắt hẳn excel
Xin chào mọi người !
tôi có câu hỏi cần được mọi người giúp đỡ
Khi tôi thực hiện lệnh gọi form từ macro

sub Goi_form()
userform1.show
end sub

form đã hiện lên để tôi nhập thông tin vào form nhưng không cho thực hiện thao tác khác với bảng tính như nhập liệu vào Cell như bình thường.

nhưng câu hỏi đặt ra là, làm thế nào để tôi vẫn có thể sử dụng bảng tính Excel (như nhập liệu, chỉnh sửa v..vv.) trong khi Userform đang được Show trên màn hình?
Tìm thuộc tính (Properties) của UserForm là ShowModal, chọn False.
 
Upvote 0
Tìm thuộc tính (Properties) của UserForm là ShowModal, chọn False.
tôi đã làm như vậy
sau khi form hiện lên, tôi nhập dữ liệu vào bảng tính rồi quay lại form nhập tiếp dữ liệu vào form thì bị đơ máy rất lâu.
tôi gửi kèm file đính kèm. nhờ mọi người xem giúp !
 

File đính kèm

  • show form - nhap lieu.xlsm
    17.6 KB · Đọc: 14
Upvote 0
tôi đã làm như vậy
sau khi form hiện lên, tôi nhập dữ liệu vào bảng tính rồi quay lại form nhập tiếp dữ liệu vào form thì bị đơ máy rất lâu.
tôi gửi kèm file đính kèm. nhờ mọi người xem giúp !
Bạn nên update hoặc cài lại office đi vì máy tôi chạy bình thường, thậm chí làm theo cách #284 vẫn chạy tốt.
 
Upvote 0
tôi đã làm như vậy
sau khi form hiện lên, tôi nhập dữ liệu vào bảng tính rồi quay lại form nhập tiếp dữ liệu vào form thì bị đơ máy rất lâu.
tôi gửi kèm file đính kèm. nhờ mọi người xem giúp !

Bạn nên update hoặc cài lại office đi vì máy tôi chạy bình thường, thậm chí làm theo cách #284 vẫn chạy tốt.

Tôi đã test file này và bị lỗi như bạn vanmanhvcu đề cập (máy cài Officw 2013).
Tìm trên mạng thì thấy khuyên là hạn chế dùng cái RefEdit control này, dễ gây crash Excel.
Một trong các cách để tránh "đơ" là Userform chứa control này phải ở chế độ Modal: True. Nếu không sẽ gặp các lỗi lung tung trong Excel.
Tóm lại nên dùng giải pháp thay thế cho control này là tốt nhất.
Thanm khảo:

220040
 
Upvote 0
Ừ, mình cũng bị, Excel 2007, đúng là do RefEdit. Chỉ có cách UserForm1.Show vbModal thôi.
 
Upvote 0
Tôi đã test file này và bị lỗi như bạn vanmanhvcu đề cập (máy cài Officw 2013).
Tìm trên mạng thì thấy khuyên là hạn chế dùng cái RefEdit control này, dễ gây crash Excel.
Một trong các cách để tránh "đơ" là Userform chứa control này phải ở chế độ Modal: True. Nếu không sẽ gặp các lỗi lung tung trong Excel.
Tóm lại nên dùng giải pháp thay thế cho control này là tốt nhất.
Thanm khảo:

View attachment 220040
Cám ơn @ongke0711
vậy có thể dùng control nào hay cách nào để cho người dùng userform nhập địa chỉ vào được không? (thay thế cái Refedit trên form kia của tôi)
 
Upvote 0
Chào tất cả mọi người !
mình có làm Add-in để show Icon trên Userform
nhưng không hiểu vì sao chỉ hoạt động trên Excel 2007 như dưới: (hình 1)
220547

nhưng khi chạy trên Office 2010 64 bít thì không ra : (hình 2)
220548
và cả khi chạy trên Office 2016 32 bít cũng không ra: (hình 3)
220549
File Addin mình có đính kèm
mọi người xem và xử lý giúp !
 

File đính kèm

  • Show_Icon_Add-in.xlam
    50.4 KB · Đọc: 11
Upvote 0
Thì ExtractIcon nó failed, tìm không Icon đó trong Excel chứ sao bác. Bác dùng Resource Hacker (google) xem thử cái Icon bác cần trong Excel mới có ID là bao nhiêu ?
Góp ý chút, bác declare API tá lã chổ hết, trùng nhau lung tung. Bác chịu khó gôm hết về 1 module đi cho dễ code, dễ kiểm soát. Vd modAPI chẵng hạn.
Trên khai báo API, cái gì có H ở trước thì khi khai báo trong VBA7, bác chịu khó đổi thành LongPtr. Khai báo còn sai nhiều.
H là handle đó bác, ví dụ HWND, HINSTANCE, HDC... Nó là các số Long trên Win/Office 32 bit, LongLong trên Win/Office 64 bit. Với VBA7, VBA sẽ tự động thông dịch LongPtr thành ra Long hay LongLong theo Office32 hay 64.
 
Upvote 0
Thì ExtractIcon nó failed, tìm không Icon đó trong Excel chứ sao bác. Bác dùng Resource Hacker (google) xem thử cái Icon bác cần trong Excel mới có ID là bao nhiêu ?
Góp ý chút, bác declare API tá lã chổ hết, trùng nhau lung tung. Bác chịu khó gôm hết về 1 module đi cho dễ code, dễ kiểm soát. Vd modAPI chẵng hạn.
Trên khai báo API, cái gì có H ở trước thì khi khai báo trong VBA7, bác chịu khó đổi thành LongPtr. Khai báo còn sai nhiều.
H là handle đó bác, ví dụ HWND, HINSTANCE, HDC... Nó là các số Long trên Win/Office 32 bit, LongLong trên Win/Office 64 bit. Với VBA7, VBA sẽ tự động thông dịch LongPtr thành ra Long hay LongLong theo Office32 hay 64.
ôi ôi, tôi chỉ là dân nghiệp dư
bác nhìn thì bác biết mà,
giờ không biết sửa chỗ nào.
 
Upvote 0
Bác lên đây download tool này về, rồi mở file Excel.exe mà bác cần xem ra, duyệt tới mục Icon, xem ID nào cần lấy thì chỉnh cái ID đó lại trong code của bác, chổ call hàm ExtractIcon đấy.
PS: Tool này rất nổi tiếng, viết = Delphi đấy. Tác giả là 1 guru về Delphi.
 

File đính kèm

  • 1.png
    1.png
    97 KB · Đọc: 12
Upvote 0
Bác lên đây download tool này về, rồi mở file Excel.exe mà bác cần xem ra, duyệt tới mục Icon, xem ID nào cần lấy thì chỉnh cái ID đó lại trong code của bác, chổ call hàm ExtractIcon đấy.
PS: Tool này rất nổi tiếng, viết = Delphi đấy. Tác giả là 1 guru về Delphi.
Cám ơn bác, để tôi ngâm thử.
 
Upvote 0
À, code bác declare sai đó. Gom và declare lại đi
 
Upvote 0
1. Khai báo lộn xộn.

2. Khai báo không chính xác. Vd.
Không thể là
#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Mà phải là As LongPtr.

3. Không nhất quán. Đã bầy trò #If ... #Else ... #End If thì phải nhất quán, chơi trò đó đến cùng.
Không thể khai báo như ở trên (vd. FindWindow) rồi sau đó
Mã:
Dim lnghWnd As Long
Đã chơi #If ... #Else ... #End If thì chơi đến cùng.

4. Về code thì sai không phải do ExtractIcon. Parameter cuối cùng không phải là ID (identifier) mà là index - chỉ số thôi. 0 có nghĩa là icon đầu tiên có trong EXE, DLL. Excel.exe rõ ràng có ít nhất 1 icon.

Sai do cách dùng hàm SendMessage. Nếu ở trên là
#If VBA7 Then
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
thì khi chạy trên Office 2016 sẽ có lỗi ở
Mã:
SendMessage lnghWnd, WM_SETICON, False, lngIcon

Lúc đó phải là
SendMessage lnghWnd, WM_SETICON, False, ByVal lngIcon

Lúc đó sẽ nhìn thấy ICON.

Ngoài ra nên khai báo nhất quán. Hoặc cùng ANY hoặc cùng không ANY. Tức hoặc (lParam truyền bởi reference)
#If VBA7 Then
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
#Else
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Integer, lParam As Any) As Long
#End If
hoặc (lParam truyền bởi giá trị)
#If VBA7 Then
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, Byval lParam As LongPtr) As LongPtr
#Else
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Integer, Byval lParam As Long) As Long
#End If

Với phiên bản 1 bắt buộc phải có ByVal lngIcon. Với phiên bản 2 thì ByVal lngIcon hay lngIcon đều được.

Nói tóm lại là code hổ lốn.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào tất cả mọi người !
mình có làm Add-in để show Icon trên Userform
nhưng không hiểu vì sao chỉ hoạt động trên Excel 2007 như dưới: (hình 1)
View attachment 220547

nhưng khi chạy trên Office 2010 64 bít thì không ra : (hình 2)
View attachment 220548
và cả khi chạy trên Office 2016 32 bít cũng không ra: (hình 3)
View attachment 220549
File Addin mình có đính kèm
mọi người xem và xử lý giúp !
Có thể chổ này là cái bạn cần.
 
Upvote 0
1. Khai báo lộn xộn.

2. Khai báo không chính xác. Vd.
Không thể là


Mà phải là As LongPtr.

3. Không nhất quán. Đã bầy trò #If ... #Else ... #End If thì phải nhất quán, chơi trò đó đến cùng.
Không thể khai báo như ở trên (vd. FindWindow) rồi sau đó
Mã:
Dim lnghWnd As Long
Đã chơi #If ... #Else ... #End If thì chơi đến cùng.

4. Về code thì sai không phải do ExtractIcon. Parameter cuối cùng không phải là ID (identifier) mà là index - chỉ số thôi. 0 có nghĩa là icon đầu tiên có trong EXE, DLL. Excel.exe rõ ràng có ít nhất 1 icon.

Sai do cách dùng hàm SendMessage. Nếu ở trên là

thì khi chạy trên Office 2016 sẽ có lỗi ở
Mã:
SendMessage lnghWnd, WM_SETICON, False, lngIcon

Lúc đó phải là


Lúc đó sẽ nhìn thấy ICON.

Ngoài ra nên khai báo nhất quán. Hoặc cùng ANY hoặc cùng không ANY. Tức hoặc (lParam truyền bởi reference)

hoặc (lParam truyền bởi giá trị)


Với phiên bản 1 bắt buộc phải có ByVal lngIcon. Với phiên bản 2 thì ByVal lngIcon hay lngIcon đều được.

Nói tóm lại là code hổ lốn.
gạch đá càng nhiều càng tốt !
miễn là có thể khắc phục lỗi là được rồi,
cám ơn các bác chỉ dẫn nhiệt tình
 
Upvote 0
Web KT
Back
Top Bottom