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

DarKLov3

Thành viên mới
Tham gia ngày
20 Tháng mười hai 2010
Bài viết
40
Được thích
6
Điểm
365
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.
 

DarKLov3

Thành viên mới
Tham gia ngày
20 Tháng mười hai 2010
Bài viết
40
Được thích
6
Điểm
365
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:

vanmanhvcu

Thành viên chính thức
Tham gia ngày
27 Tháng ba 2011
Bài viết
75
Được thích
9
Điểm
370
Tuổi
29
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?
 

giaiphap

Thành viên gạo cội
Tham gia ngày
12 Tháng ba 2007
Bài viết
4,676
Được thích
3,860
Điểm
860
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
 

leonguyenz

Thành viên mới
Tham gia ngày
2 Tháng tám 2010
Bài viết
4,136
Được thích
7,315
Điểm
560
Nơi ở
#REF
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.
 

vanmanhvcu

Thành viên chính thức
Tham gia ngày
27 Tháng ba 2011
Bài viết
75
Được thích
9
Điểm
370
Tuổi
29
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

giaiphap

Thành viên gạo cội
Tham gia ngày
12 Tháng ba 2007
Bài viết
4,676
Được thích
3,860
Điểm
860
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.
 

ongke0711

Thành viên thường trực
Tham gia ngày
7 Tháng chín 2006
Bài viết
276
Được thích
258
Điểm
710
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
 

ThangCuAnh

Thành viên tích cực
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
490
Được thích
373
Điểm
210
Nơi ở
Phờ lây cu
Ừ, mình cũng bị, Excel 2007, đúng là do RefEdit. Chỉ có cách UserForm1.Show vbModal thôi.
 

vanmanhvcu

Thành viên chính thức
Tham gia ngày
27 Tháng ba 2011
Bài viết
75
Được thích
9
Điểm
370
Tuổi
29
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)
 

vanmanhvcu

Thành viên chính thức
Tham gia ngày
27 Tháng ba 2011
Bài viết
75
Được thích
9
Điểm
370
Tuổi
29
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

ThangCuAnh

Thành viên tích cực
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
490
Được thích
373
Điểm
210
Nơi ở
Phờ lây cu
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.
 

vanmanhvcu

Thành viên chính thức
Tham gia ngày
27 Tháng ba 2011
Bài viết
75
Được thích
9
Điểm
370
Tuổi
29
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.
 

ThangCuAnh

Thành viên tích cực
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
490
Được thích
373
Điểm
210
Nơi ở
Phờ lây cu
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

vanmanhvcu

Thành viên chính thức
Tham gia ngày
27 Tháng ba 2011
Bài viết
75
Được thích
9
Điểm
370
Tuổi
29
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ử.
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,818
Được thích
2,819
Điểm
360
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:

giaiphap

Thành viên gạo cội
Tham gia ngày
12 Tháng ba 2007
Bài viết
4,676
Được thích
3,860
Điểm
860
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.
 

vanmanhvcu

Thành viên chính thức
Tham gia ngày
27 Tháng ba 2011
Bài viết
75
Được thích
9
Điểm
370
Tuổi
29
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
 
Top