Chuyên đề giải đáp những thắc mắc về code VBA (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn thử với file này & mai cho biết í kiến; Xài TextBox để tìm 1 fần của "Lệnh"
Hoang2013 ơi về mặt hiển thị thì và tìm kiếm thì đúng rùi, nhưng file này mình muốn trực tiếp thay đổi được trên sheet CSDL , dù điền thêm hay xóa đi 4 mục ở dưới thì CSDL cũng sẽ cập nhật theo, tức là khi ấn cập nhật thì dữ liệu sẽ trực tiếp tác động lên hàng được lựa chon và thay đổi. Bạn thử sửa lại giúp mình nhé.
 
Upvote 0
Hiện tại khi ân vô nút lệnh 'Cập nhật' thì những gì bạn thay đổi trên 4 textBox bên dười sẽ được lưu trên trang tính mà!

Chỉ có điều trên ListBox thì chưa; Muốn có fải thêm vài thao tác nữa, bạn thử xem.
 
Upvote 0
Hiện tại khi ân vô nút lệnh 'Cập nhật' thì những gì bạn thay đổi trên 4 textBox bên dười sẽ được lưu trên trang tính mà!

Chỉ có điều trên ListBox thì chưa; Muốn có fải thêm vài thao tác nữa, bạn thử xem.
Đúng là có cập nhật được nhưng nếu giá trị cột A có 2 lệnh giống nhau khi nhập text sẽ hiển thị lên 2 dòng, lúc mình click dòng thứ 1 sửa thử thì dữ liệu cho phép sửa hàng thứ 1, nhưng mình chọn dòng thứ 2 sửa thì khi cập nhật dữ liệu vẫn tự sửa dòng thứ 1 bạn ơi.
 
Upvote 0
tiện đây cho mình hỏi luôn tác dụng của Sheet GPE với, mình thấy code viết liên quan rất nhiều đến sheet GPE. Có phải mục đích để tham chiếu không vậy bạn?
 
Upvote 0
(**)Đúng là có cập nhật được nhưng nếu giá trị cột A có 2 lệnh giống nhau khi nhập text sẽ hiển thị lên 2 dòng, lúc mình click dòng thứ 1 sửa thử thì dữ liệu cho phép sửa hàng thứ 1, nhưng mình chọn dòng thứ 2 sửa thì khi cập nhật dữ liệu vẫn tự sửa dòng thứ 1 bạn ơi
(*)tiện đây cho mình hỏi luôn tác dụng của Sheet GPE với, mình thấy code viết liên quan rất nhiều đến sheet GPE. Có phải mục đích để tham chiếu không vậy bạn?
(*) Trong trang tính đó có 1 bảng dữ liệu được tạo ra từ 1 macro của 1 Control nào đó trong Form (bạn có thể tự tìm hiểu); Nó làm nguồn cho ListBox để bạn ngó thây 1 cách trực diện dữ liệu bạn iêu cầu cung cấp (Kết quả của công cuộc tìm kiếm theo lệnh của bạn)

(**) Một khi có 2 dòng dữ liệu cùng giống nhau về 'lệnh' thì fải có 1 trường/cột nào đó ghi nhận sự khác biệt của 2 dòng dữ liệu này.
Nếu không thì CSDL của bạn đang là đồ dỡm, trước sau gì cũng quay lại hại bạn mà thôi.
 
Upvote 0
(*) Trong trang tính đó có 1 bảng dữ liệu được tạo ra từ 1 macro của 1 Control nào đó trong Form (bạn có thể tự tìm hiểu); Nó làm nguồn cho ListBox để bạn ngó thây 1 cách trực diện dữ liệu bạn iêu cầu cung cấp (Kết quả của công cuộc tìm kiếm theo lệnh của bạn)

(**) Một khi có 2 dòng dữ liệu cùng giống nhau về 'lệnh' thì fải có 1 trường/cột nào đó ghi nhận sự khác biệt của 2 dòng dữ liệu này.
Nếu không thì CSDL của bạn đang là đồ dỡm, trước sau gì cũng quay lại hại bạn mà thôi.
Uhm vấn đề này khó quá, tại cty mình 1 mã lệnh có số lượng 100 có thể bị chia ra nhập làm nhiều lần, lần 1 là 50 ,lần 2 là 30, lần 30 là 20 và xuất theo thời gian khác nhau nên mới xảy ra trường hợp trùng như vậy. Mình sử dụng combobox thì có thể sửa trực tiếp , nhưng lại phải lắn chuột đi tìm chứ không hiển thị được như listbox. Để mình tìm lại dữ liệu mình từng làm gửi cho bạn tham khảo và xây dựng giúp mình nhé.
 
Upvote 0
Vậy hai dòng giống nhau về mã lệnh đó có 'mã hàng' hay 'mã chỉ thị' khác nhau hay không?
Nếu vẫn không có thì chỉ còn cách tạo thêm 1 trường nữa để ghi nhận sự khác biệt giữa chúng.
Chẳng hạn như số thứ tự hay ngày giờ nhập dữ liệu, . . . .
Nhưng đến lúc đó thì không thể trông mong vô trường 'Lệnh' này làm gì nữa; nên vứt đi thì hơn bạn à!
 
Upvote 0
Vậy hai dòng giống nhau về mã lệnh đó có 'mã hàng' hay 'mã chỉ thị' khác nhau hay không?
Nếu vẫn không có thì chỉ còn cách tạo thêm 1 trường nữa để ghi nhận sự khác biệt giữa chúng.
Chẳng hạn như số thứ tự hay ngày giờ nhập dữ liệu, . . . .
Nhưng đến lúc đó thì không thể trông mong vô trường 'Lệnh' này làm gì nữa; nên vứt đi thì hơn bạn à!
Xin lỗi vì mình cứ lòng vòng làm tốn thời gian và công sức của bạn, mình gửi bạn file ban đầu mình làm, mình vừa lên cty lấy về. Bạn có thể thử sửa 3 dòng đầu bằng Form sẽ hiểu ý minhg (2,3,4 trên Form) vấn đề lớn nhất là Combobox không thể hiển thị hết nếu mình chỉ quét mã số vào thì các textbox chỉ hiển thị mã đầu tiên, mã trùng thứ 2 và thứ 3 thì lại phải click để chọn trong combobox chứ không tự hiện ra nhiều lựa chọn cho mình đc . Nếu như có sự giúp đỡ của bạn làm hiển thị hết từ combobox lên list box tương tự thì tốt quá.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
:{{Thử file mới thay này xem: :{{:{{
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
đúng ý mình rùi

--=0--=0--=0 nhưng chỗ hiện ra lựa chọn sau khi nhập thử chỉnh sửa dòng 3 thì nó lại sửa dòng 1, :{{:{{ với lại sao mình gõ lệnh nào cũng còn 2 cái dòng 3, 4 k đúng mã vẫn hiện lên ấy, kiểu như mặc định mà mình k tìm được chỗ sửa, mình xóa thử 2 dòng dưới bên Sheet GPE mà bạn tạo 1 talbe DLieu và tham chiếu thành Listbox cũng k sửa được cho mất đi . Bạn xem qua lại giúp mình chit có 2 vấn đề này nữa thui.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình mới thay file mới; Trong đó có thêm nút lệnh để hiện dữ liệu lên ListBox sau khi chọn 'Lệnh' mở ComboBox.

Bạn thử xem sao.
 
Upvote 0
Chuẩn rùi Hoang2013 ơi, vấn đề lisbox hiển thị đã được giải quyết, chỉ còn vấn đề là như 3 dòng đầu mình đã nói, khi mình nhập mã 10026579 xong cập nhật list hiển thị 3 dòng , mình click chọn dòng 2 hoặc 3 khi nhập dữ liệu vào vẫn bị update vào dòng 1 của 3 mã giống nhau ấy( tức là dù hiển thị lên đủ tất cả các dòng có cùng mã nhưng khi sửa thì tất cả chỉ update vào dòng đầu tiên, còn các dòng khác không thay đổi)
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn xem lúc đó biến r của bạn tạo ra là bao nhiêu & biến Dg (do mình đề ra) là bao nhiêu
& quan trọng là có liên quan gì đến dòng cần thay đổi hay cập nhật hay không;

Nhưng dù sao cách này cũng tồn tại nhiều rủi ro cực kỳ.

Chắc chắn hơn, ta cần tạo thêm 1 trường/cột trong listBox (8->9) lưu lại chỉ mục dòng của dòng dữ liệu.
(& tất nhiên sẽ hiển thị trên TextBox để ta tìm đến & thay thế hay cập nhật)

Nên vầy không?
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn xem lúc đó biến r của bạn tạo ra là bao nhiêu & biến Dg (do mình đề ra) là bao nhiêu
& quan trọng là có liên quan gì đến dòng cần thay đổi hay cập nhật hay không;

Nhưng dù sao cách này cũng tồn tại nhiều rủi ro cực kỳ.

Chắc chắn hơn, ta cần tạo thêm 1 trường/cột trong listBox (8->9) lưu lại chỉ mục dòng của dòng dữ liệu.
(& tất nhiên sẽ hiển thị trên TextBox để ta tìm đến & thay thế hay cập nhật)

Nên vầy không?
như vậy để phân biệt cũng hợp lí, ta cũng có thể nắm được số đơn hàng trùng nhau là bao nhiêu khi hiển thị số thứ tự luôn. Nhưng mình vừa thử hình như vẫn vậy, chon dòng 2,3 thì dữ liệu vẫn đổ vào dòng 1 :p:p:p
 
Upvote 0
như vậy để phân biệt cũng hợp lí, ta cũng có thể nắm được số đơn hàng trùng nhau là bao nhiêu khi hiển thị số thứ tự luôn. Nhưng mình vừa thử hình như vẫn vậy, chon dòng 2,3 thì dữ liệu vẫn đổ vào dòng 1

Vẫn như cũ do macro mà bạn đang xài để cập nhật hay thay đổi gì đó đã viết lại đâu. Nó chưa xử với tham số dòng cần sửa mà!

Bạn thử viết bổ sung xem sao.
 
Upvote 0
Vẫn như cũ do macro mà bạn đang xài để cập nhật hay thay đổi gì đó đã viết lại đâu. Nó chưa xử với tham số dòng cần sửa mà!

Bạn thử viết bổ sung xem sao.
hi, mình không biết bổ sung như thế nào cho đúng. Bạn xem và sửa giúp mình với, vì mình chưa hiểu cách dùng table để áp dụng lên VBA, bạn viết và chú thích bên cạnh giúp để mình học hỏi với nhé.
 
Upvote 0
Em có 1 file như đính kèm. File đơn giản chỉ là trích xuất dữ liệu thắng thua của VĐV từ form vào trong sheets.
Ở file sử dụng hàm ghi dữ liệu vào dòng trống tiếp theo của cột đã chỉ định, nói chung có vẻ đã tạm ổn nếu như ta cho các cặp thi đấu theo số trận lần lượt từ 1 đến hết, như vậy Kết quả và Tỷ số sẽ kèm theo không lệch với số trận. Nhưng vấn đề xảy ra là nếu như chọn 1 trận đấu số thứ tự bất kỳ để hiện form và thi đấu thì khi nhấn nút VĐV1 hoặc VĐV 2 để trích xuất dữ liệu kết quả thì Kết quả và Tỷ số của trận đó không còn theo dòng của số trận đó nữa.
---> giải pháp nào để trích xuất dữ liệu kết quả và tỷ số theo số trận đã chọn ạ?
Cảm ơn mọi người!
 

File đính kèm

Upvote 0
Em có 1 file như đính kèm. File đơn giản chỉ là trích xuất dữ liệu thắng thua của VĐV từ form vào trong sheets.
Ở file sử dụng hàm ghi dữ liệu vào dòng trống tiếp theo của cột đã chỉ định, nói chung có vẻ đã tạm ổn nếu như ta cho các cặp thi đấu theo số trận lần lượt từ 1 đến hết, như vậy Kết quả và Tỷ số sẽ kèm theo không lệch với số trận. Nhưng vấn đề xảy ra là nếu như chọn 1 trận đấu số thứ tự bất kỳ để hiện form và thi đấu thì khi nhấn nút VĐV1 hoặc VĐV 2 để trích xuất dữ liệu kết quả thì Kết quả và Tỷ số của trận đó không còn theo dòng của số trận đó nữa.
---> giải pháp nào để trích xuất dữ liệu kết quả và tỷ số theo số trận đã chọn ạ?
Cảm ơn mọi người!
1> Đây là mục giải đáp về code, vướng chỗ code nào thì nêu chỗ đó thôi. Bê cả chương trình lên hỏi.
Như thành viên @HoangHieuxx ở trên, mang cả Form/ dự án lên hỏi, chiếm hơn 1 trang... Tại sao không lập một chủ đề riêng để hỏi?

2> Với trường hợp trong file chỉ là lựa chọn trận đấu, ghi kết quả tỉ số rồi nhập lại bảng lưu trữ thì tốn công vẽ cái Form đó làm gì. Làm luôn ngay trên bảng tính - sheet "Main" đó.
Chỉ cần một ô ghi tỉ số của trận đấu, ô kết quả vận động viên nào thắng thì phải căn cứ vào tỉ số chứ (ai to điểm hơn thì thắng chẳng hạn). Làm 2 cái nút VĐV thắng, click nhầm thì tính sao?
Căn cứ vào số "Trận" mà nhập kết qủa tương ứng với dòng đó bên sheet "DSThiDau".
 
Upvote 0
1> Đây là mục giải đáp về code, vướng chỗ code nào thì nêu chỗ đó thôi. Bê cả chương trình lên hỏi.
Như thành viên @HoangHieuxx ở trên, mang cả Form/ dự án lên hỏi, chiếm hơn 1 trang... Tại sao không lập một chủ đề riêng để hỏi?

2> Với trường hợp trong file chỉ là lựa chọn trận đấu, ghi kết quả tỉ số rồi nhập lại bảng lưu trữ thì tốn công vẽ cái Form đó làm gì. Làm luôn ngay trên bảng tính - sheet "Main" đó.
Chỉ cần một ô ghi tỉ số của trận đấu, ô kết quả vận động viên nào thắng thì phải căn cứ vào tỉ số chứ (ai to điểm hơn thì thắng chẳng hạn). Làm 2 cái nút VĐV thắng, click nhầm thì tính sao?
Căn cứ vào số "Trận" mà nhập kết qủa tương ứng với dòng đó bên sheet "DSThiDau".
Cảm ơn ạ. Mục đích là tìm giải pháp về code nên e hỏi ở đây đâu có gì sai, còn rõ ràng làm trực tiếp trên sheets thì không phải mục đích của em ạ. Ngoài ra file đơn giản, không mang tầm dự án, chỉ nói đến duy nhất mục trích xuất dữ liệu từ nút VĐV1 và VĐV2 nên chỉ cần ALT+F11 là có thể thấy ngay. Đem 1 đoạn code lên hỏi thì lại có ý kiến rằng không kèm file sao mà rõ được...
Mục đích công việc của e cần làm vậy, không cần thiết phải nói rõ vì sao mà mất công tạo form.
Mong a thông cảm nếu làm phiền và khó chịu cho a.
 
Upvote 0
1> Đây là mục giải đáp về code, vướng chỗ code nào thì nêu chỗ đó thôi. Bê cả chương trình lên hỏi.
Như thành viên @HoangHieuxx ở trên, mang cả Form/ dự án lên hỏi, chiếm hơn 1 trang... Tại sao không lập một chủ đề riêng để hỏi?
Thôi thì cho mình trả lời lần cuối:
PHP:
Private Sub cmdxuat_Click()
 Dim Sh As Worksheet, Arr()
 Dim J As Long, Rws As Long

 Set Sh = ThisWorkbook.Worksheets("CSDL")
 Arr() = Sh.[B2].CurrentRegion.Offset(1).Value
 For J = 1 To UBound(Arr())
    If Arr(J, 1) = Me!cblenh.Value And J = Me!tbDg.Value - 1 Then
        Sh.Cells(J + 1, 5).Value = Me!slnhap.Value
        Sh.Cells(J + 1, 6).Value = Me!slxuat.Value
        Sh.Cells(J + 1, 7).Value = Me!nguoixuat.Text
        Sh.Cells(J + 1, 8).Value = Me!nguoinhap.Text
        Exit For
    End If
 Next J
End Sub
Mình sẽ không tiếp tục trả lời loạt bài này nữa ở đây; Sẽ trả lời ở nơi khác thích hợp hơn!.
 
Upvote 0
Thôi thì cho mình trả lời lần cuối:
PHP:
Private Sub cmdxuat_Click()
 Dim Sh As Worksheet, Arr()
 Dim J As Long, Rws As Long

 Set Sh = ThisWorkbook.Worksheets("CSDL")
 Arr() = Sh.[B2].CurrentRegion.Offset(1).Value
 For J = 1 To UBound(Arr())
    If Arr(J, 1) = Me!cblenh.Value And J = Me!tbDg.Value - 1 Then
        Sh.Cells(J + 1, 5).Value = Me!slnhap.Value
        Sh.Cells(J + 1, 6).Value = Me!slxuat.Value
        Sh.Cells(J + 1, 7).Value = Me!nguoixuat.Text
        Sh.Cells(J + 1, 8).Value = Me!nguoinhap.Text
        Exit For
    End If
 Next J
End Sub
Mình sẽ không tiếp tục trả lời loạt bài này nữa ở đây; Sẽ trả lời ở nơi khác thích hợp hơn!.
Vẫn đúng nơi mà anh. Sao phải đi nơi khác!
 
Upvote 0
Thôi thì cho mình trả lời lần cuối:
PHP:
Private Sub cmdxuat_Click()
 Dim Sh As Worksheet, Arr()
 Dim J As Long, Rws As Long

 Set Sh = ThisWorkbook.Worksheets("CSDL")
 Arr() = Sh.[B2].CurrentRegion.Offset(1).Value
 For J = 1 To UBound(Arr())
    If Arr(J, 1) = Me!cblenh.Value And J = Me!tbDg.Value - 1 Then
        Sh.Cells(J + 1, 5).Value = Me!slnhap.Value
        Sh.Cells(J + 1, 6).Value = Me!slxuat.Value
        Sh.Cells(J + 1, 7).Value = Me!nguoixuat.Text
        Sh.Cells(J + 1, 8).Value = Me!nguoinhap.Text
        Exit For
    End If
 Next J
End Sub
Mình sẽ không tiếp tục trả lời loạt bài này nữa ở đây; Sẽ trả lời ở nơi khác thích hợp hơn!.
Lần nữa cảm ơn bạn Hoang2013, mình cũng mới biết đến GPE, cũng đăng bài nhiều lần nhưng luôn bị cho là không hợp lệ và bị nhắc nhở, dù đăng riêng hay đăng lẫn vào đây thì cũng kết quả như vậy. Mình nhận ra có những người luôn giúp đỡ mình ở bất cứ đâu, nhưng có những người hình như "quá tài giỏi" nên họ quên mục đích tạo ra trang này để làm gì, để hỗ trợ, cùng nhau học hỏi hay để chờ bắt bẻ. Đây là lần cuối mình tham gia GPE, cảm ơn bạn Hoang2013 vì chí ít mình còn biết sẽ có những người tốt như bạn giúp những người khác không biết như mình. Thân !
 
Upvote 0
Lần nữa cảm ơn bạn Hoang2013, mình cũng mới biết đến GPE
Chưa biết tuổi của người người đang giao thiệp mà xưng hô "mình với bạn" có phần hơi khiếm nhã.
Nếu ai đó có số tuổi là 37, thì "bạn" Hoang2013 có tuổi ~ gấp đôi số tuổi đó.
đăng bài nhiều lần nhưng luôn bị cho là không hợp lệ và bị nhắc nhở,
Nội quy thì không đọc. Viết tắt tùm lum, viết kiểu teencode, gửi nhiều bài cùng nội dung. Người nhắc nhở nêu rõ là vi phạm nội quy vậy mà không thay đổi?
http://www.giaiphapexcel.com/diendan/threads/nhờ-viết-code-tìm-kiếm-và-chỉnh-sửa.129094/
http://www.giaiphapexcel.com/diendan/threads/nhờ-chỉnh-sửa-code.129183/
Đây là lần cuối mình tham gia GPE, cảm ơn bạn Hoang2013 vì chí ít mình còn biết sẽ có những người tốt như bạn giúp những người khác không biết như mình.
Sau khi đăng bài #1176, chưa chắc người giúp sẽ hứng thú giúp tiếp.
Và chào tạm biệt thôi!
 
Upvote 0
. . . . Đây là lần cuối mình tham gia GPE, cảm ơn bạn Hoang2013 vì . . . bạn giúp những người khác không biết như mình.
Nếu biết trước bạn sẽ viết vầy thì bạn không thể đã, đang & sẽ trông mong vào mình được đâu.
Nhưng nếu bạn cho rằng bạn đã đủ sức làm chủ VBA & không cần đến GPE.COM thì bạn lầm to rồi đó.

Nhìn vô Code của bạn đã viết trong các file thì mình cho rằng bạn sẽ còn nhờ đến GPE.COM chán!

Dù sao cũng chúc bạn may mắn nhiều trong công việc với VBA & Form!
 
Upvote 0
Thế mới thấy, làm một điều tốt thực sự còn khó hơn gấp ngàn lần việc ăn cơm hàng ngày.
Người khi cần giúp đỡ phần nhiều khi ấy họ chỉ trông mong vấn đề được giúp đỡ cho mình ra sao mà khó để ý đến vấn đề điều kiện mình phải làm sao để được giúp đỡ đúng quy trình (cái này có thể gọi là thủ tục hành chính). Thử hỏi khi dân bị lũ lụt, liệu dân còn có thể đi đọc hàng loạt mục được hỗ trợ xem mình được hỗ trợ ở mục nào, xem mình được viện trợ 1 hay 2 gòi mì tôm để được nhận đúng quyền lợi của mình. Thật ra so sánh vậy là khập khiễng, nhưng để thấy rằng cuộc sống này chẳng bao giờ là dễ chịu, điều trông mong của người cần được giúp đỡ là nhận được sự giúp đỡ của những người với tấm lòng rộng mở mà chả cần phải lý do gì mà thôi(nhiều khi họ nói đúng nguyên tắc, đúng quy định là phải làm như thế nhưng cũng đâu đến phần của họ phải nói, vì người cầm quyền còn chưa lên tiếng cơ mà...).
Cuộc sống là cho đi mà, rộng lượng hơn, cởi mở hơn, chấp nhặt nhỏ làm gì để thấy khó thở. Tin tôi đi, khi bạn giúp đỡ được 1 điều tốt mà không cần lý do gì bạn sẽ thấy cuộc sống này tốt đẹp gấp 10 lần và quan trọng hơn người được nhận sự giúp đỡ còn thấy ý nghĩa gấp trăm ngàn lần.
Thân!
 
Upvote 0
Đúng là cuộc sống thì nên cho đi!

Nhưng cho ai cơ chứ đó là 1 việc;

Dứt khoát không nên cho kẻ ăn cháo xong hất mâm!
 
Upvote 0
Quay lại bài #1171, nhờ mọi người xem qua và cho giải pháp giải quyết vấn đề với ạ.
 
Upvote 0
Thế mới thấy, làm một điều tốt thực sự còn khó hơn gấp ngàn lần việc ăn cơm hàng ngày.

Đối với người chật vật kiếm miếng cơm manh áo như tôi, ăn cơm hàng ngày là việc khó khăn nhất. Làm điều tốt là chuyện chưa dám nghĩ tới.

Người khi cần giúp đỡ phần nhiều khi ấy họ chỉ trông mong vấn đề được giúp đỡ cho mình ra sao mà khó để ý đến vấn đề điều kiện mình phải làm sao để được giúp đỡ đúng quy trình (cái này có thể gọi là thủ tục hành chính). Thử hỏi khi dân bị lũ lụt, liệu dân còn có thể đi đọc hàng loạt mục được hỗ trợ xem mình được hỗ trợ ở mục nào, xem mình được viện trợ 1 hay 2 gòi mì tôm để được nhận đúng quyền lợi của mình. Thật ra so sánh vậy là khập khiễng, nhưng để thấy rằng cuộc sống này chẳng bao giờ là dễ chịu, điều trông mong của người cần được giúp đỡ là nhận được sự giúp đỡ của những người với tấm lòng rộng mở mà chả cần phải lý do gì mà thôi(nhiều khi họ nói đúng nguyên tắc, đúng quy định là phải làm như thế nhưng cũng đâu đến phần của họ phải nói, vì người cầm quyền còn chưa lên tiếng cơ mà...).

Có lẽ bạn chọn nhầm nghề rồi. Lý luận giỏi đến trình độ này thì đi làm nghề báo, học Luật hoặc Chính Trị thì chả cần ai giúp đỡ đâu.

Cuộc sống là cho đi mà, rộng lượng hơn, cởi mở hơn, chấp nhặt nhỏ làm gì để thấy khó thở. Tin tôi đi, khi bạn giúp đỡ được 1 điều tốt mà không cần lý do gì bạn sẽ thấy cuộc sống này tốt đẹp gấp 10 lần và quan trọng hơn người được nhận sự giúp đỡ còn thấy ý nghĩa gấp trăm ngàn lần.

Tin hổng nổi rồi. Nếu tôi đã đạt cảnh giới "giúp đỡ được 1 điều tốt mà không cần lý do gì" thì một đống hứa hẹn "bạn sẽ thấy ..." của bạn có phải là kéo tôi trở về cái vị trí ham muốn không?
 
Upvote 0
Quay lại bài #1171, nhờ mọi người xem qua và cho giải pháp giải quyết vấn đề với ạ.
PHP:
Private Sub CM_VDV1_Click()
 Dim Sh As Worksheet, Rng As Range, sRng As Range
 Set Sh = ThisWorkbook.Worksheets("DSThiDau")
 Set Rng = Sh.Range(Sh.[A1], Sh.[A1].End(xlDown))
 Set sRng = Rng.Find(Me!TB_TranSo.Value, , xlFormulas, xlWhole)
 If Not sRng Is Nothing Then
    MsgBox sRng.Row
    Sh.Cells(sRng.Row, "H").Value = Me!TB_TS1.Value
    Sh.Cells(sRng.Row, "I").Value = Me!TB_TS2.Value
 End If
End Sub
 
Upvote 0
Các bác ơi cho em hỏi chút, em muốn làm như trong file, bác nào giúp em được không ạ? Cám ơn các bác.
 

File đính kèm

Upvote 0
Đối với người chật vật kiếm miếng cơm manh áo như tôi, ăn cơm hàng ngày là việc khó khăn nhất. Làm điều tốt là chuyện chưa dám nghĩ tới.



Có lẽ bạn chọn nhầm nghề rồi. Lý luận giỏi đến trình độ này thì đi làm nghề báo, học Luật hoặc Chính Trị thì chả cần ai giúp đỡ đâu.



Tin hổng nổi rồi. Nếu tôi đã đạt cảnh giới "giúp đỡ được 1 điều tốt mà không cần lý do gì" thì một đống hứa hẹn "bạn sẽ thấy ..." của bạn có phải là kéo tôi trở về cái vị trí ham muốn không?
Hihi. Tuỳ anh hiểu thôi ạ.
 
Upvote 0
PHP:
Private Sub CM_VDV1_Click()
 Dim Sh As Worksheet, Rng As Range, sRng As Range
 Set Sh = ThisWorkbook.Worksheets("DSThiDau")
 Set Rng = Sh.Range(Sh.[A1], Sh.[A1].End(xlDown))
 Set sRng = Rng.Find(Me!TB_TranSo.Value, , xlFormulas, xlWhole)
 If Not sRng Is Nothing Then
    MsgBox sRng.Row
    Sh.Cells(sRng.Row, "H").Value = Me!TB_TS1.Value
    Sh.Cells(sRng.Row, "I").Value = Me!TB_TS2.Value
 End If
End Sub
Cảm ơn anh, code chạy khá ổn rồi ạ. Em xin hỏi chút ạ: Ở đây sao lại là Me! mà không phải là Me. ạ?
 
Upvote 0
Mình không đủ khả năng giải thích cho bạn rồi;

Hay bạn thử thế này đi:
Thay vì
MsgBox sRng.Row
Bạn biến thành
MsgBox Me!TB_TS1.Parent.Name, , Me.TB_TS1.Parent.Name

Xem VBE trả lời sao?
 
Upvote 0
Mình không đủ khả năng giải thích cho bạn rồi;

Hay bạn thử thế này đi:
Thay vì
MsgBox sRng.Row
Bạn biến thành
MsgBox Me!TB_TS1.Parent.Name, , Me.TB_TS1.Parent.Name

Xem VBE trả lời sao?
Đoạn MsgBox sRng.Row e edit lại cho phù hợp với công việc là:
MsgBox chrW(..)..... & sRng.Row, đại khái là có thêm tý nội dung thông báo đã trích xuất kết quả trận đấu thành công cho nó có vẻ chuyên nghiệp.
Nhưng MsgBox lại hạn chế unicode quá, nên không hiển thị chuẩn được tiếng việt có dấu.
 
Upvote 0
ActiveCell.Offset(0, 0).Range("A1").Select: ActiveCell.Value = XDate
ActiveCell.Offset(0, 1).Range("A1").Select: ActiveCell.Value = XSo
ActiveCell.Offset(0, 1).Range("A1").Select: ActiveCell.Value = XLoai


-Các bạn cho mình hỏi. Đoạn code này trong một cuốn sách, có nghĩa là nhảy ngang 1 ô sau đó gán cho ô đó một biến, sau đó nhảy ngang lại gán 1 biến nữa. Chỉ là mình không hiểu lệnh Range("A1") để làm gì, mình bỏ đi thì nó vẫn chạy như bình thường không có gì sai cả. Vậy ý nghĩa của nó là gì ?
 
Upvote 0
Mình không đủ khả năng giải thích cho bạn rồi;

Hay bạn thử thế này đi:
Thay vì
MsgBox sRng.Row
Bạn biến thành
MsgBox Me!TB_TS1.Parent.Name, , Me.TB_TS1.Parent.Name

Xem VBE trả lời sao?
1. Cách viết Me.{Method | Property}: Gọi phương thức | thuộc tính của đối tượng.

2. Cách gọi tới một Item của đối tượng (ở đây là UserForm):
PHP:
object.Item({Index | Key})

Index: là chỉ số thứ tự của Item trên object.

Key: Khóa tương ứng với Item trên object.

Nếu đã xác định được Key của Item, thì cũng có thể sử dụng toán tử truy cập từ điển (!) ("the dictionary access operator") để truy cập vào một phần tử của object mà không kèm theo dấu ngoặc đơn.
PHP:
MsgBox Me("TextBox1").Value

'Tương đương với:'

MsgBox Me!TextBox1.Value
 
Upvote 0
1. Cách viết Me.{Method | Property}: Gọi phương thức | thuộc tính của đối tượng.

2. Cách gọi tới một Item của đối tượng (ở đây là UserForm):
PHP:
object.Item({Index | Key})

Index: là chỉ số thứ tự của Item trên object.

Key: Khóa tương ứng với Item trên object.

Nếu đã xác định được Key của Item, thì cũng có thể sử dụng toán tử truy cập từ điển (!) ("the dictionary access operator") để truy cập vào một phần tử của object mà không kèm theo dấu ngoặc đơn.
PHP:
MsgBox Me("TextBox1").Value

'Tương đương với:'

MsgBox Me!TextBox1.Value
Vâng, cũng tàm tạm hiểu rồi ạ. Cảm ơn anh ạ.
 
Upvote 0
Vâng, cũng tàm tạm hiểu rồi ạ. Cảm ơn anh ạ.

Mọi người càng nói càng làm cho bạn ý khó hiểu.

Cái thứ nhất không nhất thiết phải dùng "me.", vì ta đang đứng trong nó, mặc định mọi thành viên của nó đều được ưu tiên. gõ là TB_TS2.Value là đủ.

Các form có một thuộc tính controls trả lại một tập các control đang có trên form. Thuộc tính này lại là mặc định. Nên gõ là me.controls("TB_TS2"), controls("TB_TS2") , me!TB_TS2 là cùng gọi một thuộc tính, lấy tham chiếu đến control có tên là TB_TS2, nhưng chú ý nó trả lại kiểu Object.

Nói chung là đối với những control đã có sẵn trong lúc thiết kế thì cứ gọi trực tiếp tên nó ra, không cần phải thông qua controls làm gì cho mệt
 
Upvote 0
Mọi người càng nói càng làm cho bạn ý khó hiểu.

Cái thứ nhất không nhất thiết phải dùng "me.", vì ta đang đứng trong nó, mặc định mọi thành viên của nó đều được ưu tiên. gõ là TB_TS2.Value là đủ.

Các form có một thuộc tính controls trả lại một tập các control đang có trên form. Thuộc tính này lại là mặc định. Nên gõ là me.controls("TB_TS2"), controls("TB_TS2") , me!TB_TS2 là cùng gọi một thuộc tính, lấy tham chiếu đến control có tên là TB_TS2, nhưng chú ý nó trả lại kiểu Object.

Nói chung là đối với những control đã có sẵn trong lúc thiết kế thì cứ gọi trực tiếp tên nó ra, không cần phải thông qua controls làm gì cho mệt
Vậy là nếu đứng trong form ta không cần phải nêu Name của form hoặc Me. hay Me! đúng không ạ, chỉ cần gọi tên chính xác của object nào đó là ok phải không ạ.
 
Upvote 0
Dùng toán tử chấm than (!) là một hình thức của kết nối trễ. Vì là kết nối trễ cho nên nó sẽ chậm hơn cách kết nối sớm 1 chút.

Lý do dùng kết nói trễ là vì có những phần tử mà Form chưa có lúc trình dịch rà qua code. Ví dụ những controls lúc chạy code mới thêm vào.

Chú thich: tôi chỉ giải thích lý thuyết của toán tử này mà thôi. Việc nó hoạt động trong Form như thế nào thì tôi lười viết code Form để thử lắm.
 
Upvote 0
Dùng toán tử chấm than (!) là một hình thức của kết nối trễ. Vì là kết nối trễ cho nên nó sẽ chậm hơn cách kết nối sớm 1 chút.

Lý do dùng kết nói trễ là vì có những phần tử mà Form chưa có lúc trình dịch rà qua code. Ví dụ những controls lúc chạy code mới thêm vào.

Chú thich: tôi chỉ giải thích lý thuyết của toán tử này mà thôi. Việc nó hoạt động trong Form như thế nào thì tôi lười viết code Form để thử lắm.
Chà chà, liên quan đến code chạy nhanh hay chậm là cũng quan trọng đấy ạ. Ai cũng mong muốn code được tối ưu và chạy mượt hơn ạ. Hihi.
 
Upvote 0
Thử xem qua cái này xem có áp dụng theo được không anh nhé!
Cám ơn bạn, không hẳn như thế ạ.
1. Dữ liệu ảnh của mình ở trong file Excel, ví dụ mã hàng A sẽ có tên, giá , ảnh .....
2. Khu vực lấy ảnh không liền nhau, ví dụ ở trên D3 (mã hàng sẽ ở B3), nhưng ngay dưới có thể D7 (mã hàng ở B7).
đây là một dạng đơn báo giá bạn ạ.
Rất cám ơn bạn đã dành thời gian trả lời bài viết của mình.
 
Upvote 0
Cám ơn bạn, không hẳn như thế ạ.
1. Dữ liệu ảnh của mình ở trong file Excel, ví dụ mã hàng A sẽ có tên, giá , ảnh .....
2. Khu vực lấy ảnh không liền nhau, ví dụ ở trên D3 (mã hàng sẽ ở B3), nhưng ngay dưới có thể D7 (mã hàng ở B7).
đây là một dạng đơn báo giá bạn ạ.
Rất cám ơn bạn đã dành thời gian trả lời bài viết của mình.
Dạ vâng, không có gì ạ.
Hay anh thử xem file đính kèm này của thầy Ndu đã làm ạ.
Ngoài ra anh vào đây: http://www.giaiphapexcel.com/diendan/threads/chèn-hình-ảnh-theo-điều-kiện-của-một-ô-có-trước.62266/ là mục nói về vấn đề gần giống như anh muốn theo yêu cầu của mình ạ.
 

File đính kèm

Upvote 0
Chà chà, liên quan đến code chạy nhanh hay chậm là cũng quan trọng đấy ạ. Ai cũng mong muốn code được tối ưu và chạy mượt hơn ạ. Hihi.

Với khả năng máy tính hiện nay, nhanh chậm cách nhau dưới 1 phần triệu giây. Có mượt hay không chỉ là cảm giác chủ quan thôi.
 
Upvote 0
Dạ vâng, không có gì ạ.
Hay anh thử xem file đính kèm này của thầy Ndu đã làm ạ.
Ngoài ra anh vào đây: http://www.giaiphapexcel.com/diendan/threads/chèn-hình-ảnh-theo-điều-kiện-của-một-ô-có-trước.62266/ là mục nói về vấn đề gần giống như anh muốn theo yêu cầu của mình ạ.
Mình có ngó qua thấy khá giống nhu cầu của mình, để mình thử áp dụng xem. Cám ơn bạn nhé !
 
Upvote 0
Mình mới học lập trình excel cần mọi người giúp đỡ vấn đề này:
Mình có 2 file excel cùng thư mục, một file chứa lịch sử hoạt động, file còn lại để báo cáo.
Mình muốn lập 1 hàm vba để lấy dữ liệu ngày mới nhất từ file lịch sử để đưa vào một ô trong file báo cáo.
Mã:
Public Function Solieu() As Variant
Dim s As Variant
s = GetValue(ActiveWorkbook.path, "Lichsu.xls", "8.2017", "a7")
MsgBox s
Solieu = s
End Function
Khi gọi số liệu bằng msgbox thì hiển thị được, nhưng ghi gọi bằng hàm thì lỗi #value. Mình không hiểu như thế nào. Mọi người giúp đỡ ạ
 
Upvote 0
@Quỷ Lệ Cô Thần , GetValue không phải là hàm có sẵn, bạn nói gọi bằng msgbox thì được (nếu được thì bạn đã có hàm GetValue rồi) nhưng gọi bằng hàm thì lỗi mình lại nghĩ vấn đề ở cái hàm GetValue, nên up lên thử xem có giúp ích gì cho bạn không
Mã:
Private Function GetValue(path, file, sheet, ref)
    Dim arg As String
    If Right(path, 1) <> "\" Then path = path & "\"
    If Dir(path & file) = "" Then
        GetValue = "File Not Found"
        Exit Function
    End If
    arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
      Range(ref).Range("A1").Address(, , xlR1C1)
    GetValue = ExecuteExcel4Macro(arg)
End Function
 
Upvote 0
Mình mới học lập trình excel cần mọi người giúp đỡ vấn đề này:
Mình có 2 file excel cùng thư mục, một file chứa lịch sử hoạt động, file còn lại để báo cáo.
Mình muốn lập 1 hàm vba để lấy dữ liệu ngày mới nhất từ file lịch sử để đưa vào một ô trong file báo cáo.
Mã:
Public Function Solieu() As Variant
Dim s As Variant
s = GetValue(ActiveWorkbook.path, "Lichsu.xls", "8.2017", "a7")
MsgBox s
Solieu = s
End Function
Khi gọi số liệu bằng msgbox thì hiển thị được, nhưng ghi gọi bằng hàm thì lỗi #value. Mình không hiểu như thế nào. Mọi người giúp đỡ ạ
Bạn muốn tạo hàm thì phải cho hàm các đối số.
Như ở đây bạn tạo hàm Solieu thì cho Solieu các đối số, ví dụ như
Mã:
Public Function Solieu(ByVal wPath As String, ByVal wName As String, ByVal Ngay As String, ByVal DiaChi As String) As Variant
    Dim s As Variant
    s = GetValue(wPath, wName, Ngay, DiaChi)
    Solieu = s
End Function
Khi gọi hàm Solieu thì cho phần sau vào
Mã:
ActiveWorkbook.path, "Lichsu.xls", "8.2017", "a7"
chú ý cái ActiveWorkbook.path thì chuyển thành đường dẫn cụ thể
 
Upvote 0
chỉ cần đặt tên ảnh như trong video là ok

Cám ơn Minh Tùng, mình đã làm theo cách của bạn và rất ổn, không biết nói cảm ơn thế nào.
Nhưng mình lại gặp vấn đề, trong file dữ liệu có ảnh và tên SP, giờ có khoảng 1000 cái ảnh thì có cách nào để đặt tên tự động không, chứ làm từng cái thì cũng được nhưng thủ công quá.
 
Upvote 0
Cho em hỏi Code sau:
PHP:
With Application.Workbooks("OVT Report Aug 2017.xlsm").Sheets("OVT")
Code trên dùng để xuất dữ liệu từ file mẹ sang file đang mở là OVT Report Aug 2017.xlsm. Vì vậy hàng tháng em lại phải mở code để sửa đổi phần 3 ký tự này. Có cách nào thay thế bằng ký tự chung chung kiểu như
With Application.Workbooks("OVT Report *** 2017.xlsm").Sheets("OVT") không anh chị?
 
Upvote 0
Cho em hỏi Code sau:
PHP:
With Application.Workbooks("OVT Report Aug 2017.xlsm").Sheets("OVT")
Code trên dùng để xuất dữ liệu từ file mẹ sang file đang mở là OVT Report Aug 2017.xlsm. Vì vậy hàng tháng em lại phải mở code để sửa đổi phần 3 ký tự này. Có cách nào thay thế bằng ký tự chung chung kiểu như
With Application.Workbooks("OVT Report *** 2017.xlsm").Sheets("OVT") không anh chị?
Bạn hãy đưa tên Workbook vào 1 biến dạng như


Mã:
Dim WbName as String

WbName = “OVT Report *** 2017.xlsm"


With Application.Workbooks(WbName).Sheets("OVT")


Việc thay cái *** thì bạn thay tùy ý thôi.
 
Upvote 0
Bạn hãy đưa tên Workbook vào 1 biến dạng như


Mã:
Dim WbName as String

WbName = “OVT Report *** 2017.xlsm"


With Application.Workbooks(WbName).Sheets("OVT")


Việc thay cái *** thì bạn thay tùy ý thôi.

Ý mình cái tên file OVT Report *** 2017.xlsm chỗ *** hàng tháng phải thay đổi nên trong code cũng cần thay đổi theo để nó biết làm việc với file tên là gì. Mình thử cách của bạn thì báo lỗi không thấy file nào tên thế. File hiện tên là OVT Report Sep 2017.xlsm
 
Upvote 0
Cho em hỏi Code sau:
PHP:
With Application.Workbooks("OVT Report Aug 2017.xlsm").Sheets("OVT")
Code trên dùng để xuất dữ liệu từ file mẹ sang file đang mở là OVT Report Aug 2017.xlsm. Vì vậy hàng tháng em lại phải mở code để sửa đổi phần 3 ký tự này. Có cách nào thay thế bằng ký tự chung chung kiểu như
With Application.Workbooks("OVT Report *** 2017.xlsm").Sheets("OVT") không anh chị?
Ý anh là sang tháng mới thì tên file chỗ *** đó cũng đổi theo ạ? Hay là sao?
 
Upvote 0
Mình chỉ biết tạo một macro Auto_open, code như sau để mỗi lần mở file là nó mở luôn form để nhập liệu.

Sub Auto_open()
NhapLieu.Show
End Sub

Nhưng mình cần là mỗi lần mở file thì không mở form, chỉ khi nào mình bấm phím tắt thì mới mở form. Bạn nào biết có thể giúp mình với. Thanks
 
Upvote 0
Mình chỉ biết tạo một macro Auto_open, code như sau để mỗi lần mở file là nó mở luôn form để nhập liệu.

Sub Auto_open()
NhapLieu.Show
End Sub

Nhưng mình cần là mỗi lần mở file thì không mở form, chỉ khi nào mình bấm phím tắt thì mới mở form. Bạn nào biết có thể giúp mình với. Thanks
anh thử làm như thế này nghen
đầu tiên tạo một sub ShowForm trong module nào đó
Mã:
Sub ShowForm()
    NhapLieu.Show
End Sub
tiếp đó ra bảng tính làm như hình

upload_2017-9-8_12-12-22.png
 
Upvote 0
Mình chỉ biết tạo một macro Auto_open, code như sau để mỗi lần mở file là nó mở luôn form để nhập liệu.

Sub Auto_open()
NhapLieu.Show
End Sub

Nhưng mình cần là mỗi lần mở file thì không mở form, chỉ khi nào mình bấm phím tắt thì mới mở form. Bạn nào biết có thể giúp mình với. Thanks
Kiểu như thế này à anh? Em không biết nhiều, gà gà làm cho anh thôi. hehe.
Hiện form: phím Ctrl + f nhé!
 

File đính kèm

Upvote 0
Ý mình cái tên file OVT Report *** 2017.xlsm chỗ *** hàng tháng phải thay đổi nên trong code cũng cần thay đổi theo để nó biết làm việc với file tên là gì. Mình thử cách của bạn thì báo lỗi không thấy file nào tên thế. File hiện tên là OVT Report Sep 2017.xlsm
Đã giợi ý cho bạn việc đưa tên Wb vào 1 chuỗi, còn biến đổi thêm thì bạn tự tìm nhé, trên diễn đã có rất nhiều.
 
Upvote 0
anh thử làm như thế này nghen
đầu tiên tạo một sub ShowForm trong module nào đó
Mã:
Sub ShowForm()
    NhapLieu.Show
End Sub
tiếp đó ra bảng tính làm như hình

View attachment 182761
Kiểu như thế này à anh? Em không biết nhiều, gà gà làm cho anh thôi. hehe.
Hiện form: phím Ctrl + f nhé!

Qua hướng dẫn của 2 bạn thì mình phát hiện ra vấn đề của mình. Về cơ bản thì cách làm của mình giống 2 bạn nhưng khác ở tên của thủ tục. Nếu đặt là Auto_0pen thì khi mở nó tự load form lên luôn, còn đặt tên khác đi thì khi bấm phím tắt nó mới load. Cái này có thể là do Auto_0pen là một tên mặc định có sẵn của VBA hay gì đó mà mà mình vẫn chưa hiểu. Cảm ơn hai bạn.
 
Upvote 0
Qua hướng dẫn của 2 bạn thì mình phát hiện ra vấn đề của mình. Về cơ bản thì cách làm của mình giống 2 bạn nhưng khác ở tên của thủ tục. Nếu đặt là Auto_0pen thì khi mở nó tự load form lên luôn, còn đặt tên khác đi thì khi bấm phím tắt nó mới load. Cái này có thể là do Auto_0pen là một tên mặc định có sẵn của VBA hay gì đó mà mà mình vẫn chưa hiểu. Cảm ơn hai bạn.
bao nhiêu tên hay sao anh hem đặt như "Sub heo_dat_ham_an" nè
Sub Auto_ Open rơi vào đúng từ khóa của VBA, nó tương tự với sự với sự kiện Open() của workbook đó anh
Mã:
Private Sub Workbook_Open()
'...
End Sub
 
Upvote 0
Qua hướng dẫn của 2 bạn thì mình phát hiện ra vấn đề của mình. Về cơ bản thì cách làm của mình giống 2 bạn nhưng khác ở tên của thủ tục. Nếu đặt là Auto_0pen thì khi mở nó tự load form lên luôn, còn đặt tên khác đi thì khi bấm phím tắt nó mới load. Cái này có thể là do Auto_0pen là một tên mặc định có sẵn của VBA hay gì đó mà mà mình vẫn chưa hiểu. Cảm ơn hai bạn.
Thử dùng cái này xem.
http://www.automateexcel.com/vba/run-macro-excel-close
 
Upvote 0
bao nhiêu tên hay sao anh hem đặt như "Sub heo_dat_ham_an" nè
Sub Auto_ Open rơi vào đúng từ khóa của VBA, nó tương tự với sự với sự kiện Open() của workbook đó anh
Mã:
Private Sub Workbook_Open()
'...
End Sub
Cái ý đâu phải là từ khóa gì đâu, đơn thuần là tên của một thủ tục, khi mờ file excel sẽ tự chạy nó mà không cần người dùng phải kích chạy.
 
Upvote 0
Upvote 0
Đây là code thời gian chạy lùi trong file:

Option Explicit
Private Sub Cmd_Click()
Dim Dat As Double, kt As Double, Check As Boolean
Check = (Cmd.Caption = "Show Form")
Cmd.Caption = IIf(Check, "Close Form", "Show Form")
Dat = TimeValue("00:00:05")
If Check Then
UserForm1.Show
Do
UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
Dat = Dat - TimeValue("00:00:01")
kt = Timer
Do While Timer - kt < 1
DoEvents
If UserForm1.Label1.Caption = "00:00:00" Then
MsgBox "Het thoi gian nghi.": Exit Sub
End If
Loop
Loop
Else
Unload UserForm1: Exit Sub
End If
End Sub
----------------------------
- Giờ muốn cho nó chạy tiến thì chỉnh lại thế nào vậy mọi người? Cho nó chạy tiến, khi nào nhấn Close Form thì tắt ạ.
Trích dẫn: đây là file thầy Ndu cung cấp ạ.
 

File đính kèm

Upvote 0
Mấy hôm nay thread vắng tanh..
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là code thời gian chạy lùi trong file:

Option Explicit
Private Sub Cmd_Click()
Dim Dat As Double, kt As Double, Check As Boolean
Check = (Cmd.Caption = "Show Form")
Cmd.Caption = IIf(Check, "Close Form", "Show Form")
Dat = TimeValue("00:00:05")
If Check Then
UserForm1.Show
Do
UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
Dat = Dat - TimeValue("00:00:01")
kt = Timer
Do While Timer - kt < 1
DoEvents
If UserForm1.Label1.Caption = "00:00:00" Then
MsgBox "Het thoi gian nghi.": Exit Sub
End If
Loop
Loop
Else
Unload UserForm1: Exit Sub
End If
End Sub
----------------------------
- Giờ muốn cho nó chạy tiến thì chỉnh lại thế nào vậy mọi người? Cho nó chạy tiến, khi nào nhấn Close Form thì tắt ạ.
Trích dẫn: đây là file thầy Ndu cung cấp ạ.
Bạn sửa như sau
Mã:
Private Sub Cmd_Click()
  Dim Dat As Double, kt As Double, Check As Boolean
  Check = (Cmd.Caption = "Show Form")
  Cmd.Caption = IIf(Check, "Close Form", "Show Form")
  Dat = TimeValue("00:00:00")
  If Check Then
    UserForm1.Show
    Do
      UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
      Dat = Dat + TimeValue("00:00:01")
      kt = Timer
      Do While Timer - kt < 1
        DoEvents
        If UserForm1.Label1.Caption = "00:00:05" Then
          MsgBox "Het thoi gian nghi.": Exit Sub
        End If
    Loop
    Loop
  Else
    Unload UserForm1: Exit Sub
  End If
End Sub
 
Upvote 0
Bạn sửa như sau
Mã:
Private Sub Cmd_Click()
  Dim Dat As Double, kt As Double, Check As Boolean
  Check = (Cmd.Caption = "Show Form")
  Cmd.Caption = IIf(Check, "Close Form", "Show Form")
  Dat = TimeValue("00:00:00")
  If Check Then
    UserForm1.Show
    Do
      UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
      Dat = Dat + TimeValue("00:00:01")
      kt = Timer
      Do While Timer - kt < 1
        DoEvents
        If UserForm1.Label1.Caption = "00:00:05" Then
          MsgBox "Het thoi gian nghi.": Exit Sub
        End If
    Loop
    Loop
  Else
    Unload UserForm1: Exit Sub
  End If
End Sub
Dạ cảm ơn anh ạ. Vậy là theo code này thì vẫn có thời gian quy định đến bao nhiêu sẽ báo hết thời gian chứ không phải là để chạy tự do đến khi nào nhấn dừng thì thôi.
Vậy thì ta cứ chỉnh phần:
If UserForm1.Label1.Caption = "00:00:05" Then
MsgBox "Het thoi gian nghi.": Exit Sub
chỗ "00:00:05" thành "23:00:00" chẳng hạn là có thể vô tư ngồi nhìn nó chạy rồi.
Cảm ơn anh ạ!
 
Upvote 0
Bạn sửa như sau
Mã:
Private Sub Cmd_Click()
  Dim Dat As Double, kt As Double, Check As Boolean
  Check = (Cmd.Caption = "Show Form")
  Cmd.Caption = IIf(Check, "Close Form", "Show Form")
  Dat = TimeValue("00:00:00")
  If Check Then
    UserForm1.Show
    Do
      UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
      Dat = Dat + TimeValue("00:00:01")
      kt = Timer
      Do While Timer - kt < 1
        DoEvents
        If UserForm1.Label1.Caption = "00:00:05" Then
          MsgBox "Het thoi gian nghi.": Exit Sub
        End If
    Loop
    Loop
  Else
    Unload UserForm1: Exit Sub
  End If
End Sub
Nhưng có một vấn đề anh ơi, nếu Close Form trước 5s, Form vẫn đóng bình thường nhưng hết 5s nó vẫn hiện MsgBox báo hết giờ ạ. Làm sao để tắt trước giờ mình quy định thì nó không thông báo hết giờ nữa ạ?
Close Form trước giờ quy định thì code vẫn chạy ngầm thì phải (như ảnh): Untitled.jpg
 
Upvote 0
Nhưng có một vấn đề anh ơi, nếu Close Form trước 5s, Form vẫn đóng bình thường nhưng hết 5s nó vẫn hiện MsgBox báo hết giờ ạ. Làm sao để tắt trước giờ mình quy định thì nó không thông báo hết giờ nữa ạ?
Close Form trước giờ quy định thì code vẫn chạy ngầm thì phải (như ảnh): View attachment 182988
Bạn chỉnh câu lệnh tương ứng thành
Mã:
    Unload UserForm1:  End
 
Upvote 0
Bạn chỉnh câu lệnh tương ứng thành
Mã:
    Unload UserForm1:  End
Dạ vâng, cảm ơn anh.
Vậy trường hợp Form này chạy trên 1 Form chính khác (tức là nút Show Form ở trong 1 Form chính) thì nếu sửa lại thành: End thì nó sẽ tắt cả 2 Form luôn à anh? Giải quyết thế nào khi Close Form mà code ko chạy ngầm nữa và form chính vẫn hiện để tiếp tục xử lý dữ liệu trên form chính ạ.?
 
Upvote 0
Dạ vâng, cảm ơn anh.
Vậy trường hợp Form này chạy trên 1 Form chính khác (tức là nút Show Form ở trong 1 Form chính) thì nếu sửa lại thành: End thì nó sẽ tắt cả 2 Form luôn à anh? Giải quyết thế nào khi Close Form mà code ko chạy ngầm nữa và form chính vẫn hiện để tiếp tục xử lý dữ liệu trên form chính ạ.?
Loay hoay em chỉnh lại thế này, test thử có vẻ được, các anh xem xem có ổn không ạ:
- Cho nó chạy bắt đầu từ 01s.

Private Sub Cmd_Click()
Dim Dat As Double, kt As Double, Check As Boolean
Check = (Cmd.Caption = "Show Form")
Cmd.Caption = IIf(Check, "Close Form", "Show Form")
Dat = TimeValue("00:00:01")
If Check Then
UserForm1.Show
Do
UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
Dat = Dat + TimeValue("00:00:01")
kt = Timer
Do While Timer - kt < 1
DoEvents
If UserForm1.Label1.Caption = "00:00:00" Then
Unload UserForm1: Exit Sub
End If
Loop
Loop
Else
Unload UserForm1: Exit Sub
End If
End Sub
 
Upvote 0
Loay hoay em chỉnh lại thế này, test thử có vẻ được, các anh xem xem có ổn không ạ:
- Cho nó chạy bắt đầu từ 01s.

Private Sub Cmd_Click()
Dim Dat As Double, kt As Double, Check As Boolean
Check = (Cmd.Caption = "Show Form")
Cmd.Caption = IIf(Check, "Close Form", "Show Form")
Dat = TimeValue("00:00:01")
If Check Then
UserForm1.Show
Do
UserForm1.Label1.Caption = Format(Dat, "hh:mm:ss")
Dat = Dat + TimeValue("00:00:01")
kt = Timer
Do While Timer - kt < 1
DoEvents
If UserForm1.Label1.Caption = "00:00:00" Then
Unload UserForm1: Exit Sub
End If
Loop
Loop
Else
Unload UserForm1: Exit Sub
End If
End Sub
 

File đính kèm

Upvote 0
Quan trọng là dùng để làm gì. Ví dụ nếu dùng để tính thời gian làm bài thì tôi chỉ cần giữ chuột ở thanh tiêu đề của form là có thể "tạm dừng" được.
 
Upvote 0
Quan trọng là dùng để làm gì. Ví dụ nếu dùng để tính thời gian làm bài thì tôi chỉ cần giữ chuột ở thanh tiêu đề của form là có thể "tạm dừng" được.
Dạ cũng gần tương tự như chạy thời gian làm bài thôi ạ, nhưng khi muốn dừng tắt thời gian chạy đó thì nhấn nút để vừa dừng thời gian chạy cùng với tắt form thời gian đó luôn. Chứ cứ giữ mãi thanh tiêu đề của form để dừng thời gian thì bất tiện quá!
 
Upvote 0
Dạ cũng gần tương tự như chạy thời gian làm bài thôi ạ, nhưng khi muốn dừng tắt thời gian chạy đó thì nhấn nút để vừa dừng thời gian chạy cùng với tắt form thời gian đó luôn. Chứ cứ giữ mãi thanh tiêu đề của form để dừng thời gian thì bất tiện quá!
Tôi đang giả sử tôi là thí sinh. Trong thời gian suy nghĩ tôi nhấn giữ chuột ở thanh tiêu đề để tạm dừng thời gian. Mục đích là để gian lận thời gian.
 
Upvote 0
Tôi đang giả sử tôi là thí sinh. Trong thời gian suy nghĩ tôi nhấn giữ chuột ở thanh tiêu đề để tạm dừng thời gian. Mục đích là để gian lận thời gian.
Không đến mức phải gian lận vậy đâu anh. Mà chỉ có mình ngồi xử lý form thôi mà. Hội kia từng người làm bài, làm xong thì báo mồm. Kaka.
 
Upvote 0
Xin hỏi mọi người đoạn code này có nghĩa gì, tại sao lại khai báo biến ở tên của thủ tục (ByVal Target..) và Intersect có nghĩa gì ?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("AM1:XFD1")) Is Nothing Then
If Target.Rows.Count = 1 Then
Range("AL1").Value = Target.Value
Range("AL2").Value = Target.Offset(1).Value
GPE
End If
End If
End Sub
 
Upvote 0
Các anh chị giúp em với.
Nhờ các anh chị giải thích code của hàm sau với:
ThisWorkbook.Activate
wksInput.Shapes("cmbUniaxialAnalysis").ThreeD.BevelTopType = msoBevelSlope
 
Upvote 0
Cho em hỏi câu lệnh Căn giữa trong Msgbox như nào ạ! em xin cảm ơn
 
Upvote 0
Xin hỏi mọi người (1) đoạn code này có nghĩa gì, (1.1) tại sao lại khai báo biến ở tên của thủ tục (ByVal Target..) và (2) Intersect có nghĩa gì ?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
1 If Not Intersect(Target, Range("AM1:XFD1")) Is Nothing Then
If Target.Rows.Count = 1 Then
3 Range("AL1").Value = Target.Value
Range("AL2").Value = Target.Offset(1).Value
5 GPE
End If
7 End If
End Sub
(1) Đoạn mã này là 1 macro sự kiện; Có nghĩa là muốn thực hiện các dòng lệnh được đánh số từ 3 đến 5 cần thỏa vài điều kiện nào đó.
Điều kiện đầu tiên là: Dùng cái gì đó, như chuột, hay cái gì khác. . . đụng vô vùng ô giới hạn từ [AM1] cho đến [XFD1] (Quá lớn, fải không?)
Điều kiện thứ 2 là: Nếu đếm số dòng mà (bạn hay ai đó) vừa đụng tới chỉ là 1 hàng duy nhất thì sẽ thực hiện 3 lệnh (từ d3 đến d5)
(Trong đó D5 là triệu gọi 1 macro hay 1 cái gì đó như đứa con tinh thần của ai đó, thực hiện các câu lệnh công việc trong nội dung đã có)

(1.1) Thủ tục sự kiện thì sự kiện đó sẩy ra ở đâu, ở nơi nào trên trang tính. Sự mặc định này được VBE viết ra như thế (Mình hiểu nôm na là thế; Bạn chờ, có thể có thành viên nào đó giải thích cho bạn rõ ràng hơn chăng.)

2. Intersect() trước hết là 1 fương thức (Bạn có thể tìm hiểu sâu hơn bài lí thuyết về vấn đề này có trên diễn đàn; từ khóa là chính nó, thử xem)
Nôm na đã được giải thíc bên trên (ĐK 1)

3. VBA là 1 ngôn ngữ; Bạn học 1 ngôn ngữ mới mà chưa sẵn lòng dịch các câu hay mệnh đề của nó sang tiếng mẹ để hay sao? & như vậy sẽ khó cho bạn rồi.
Dịch từ ngôn ngữ này sang 1 ngôn ngữ khác càng lưu loát càng tỏ rõ sự am hiểu về ngôn ngữ mới đó bạn; Chúc nhiều thành công trên con đường chinh fục VBA!
 
Upvote 0
Mọi người cho mình hỏi vấn đề này:
Mình có làm ứng dụng nhỏ trong công việc, file excel chứa code đã chạy được, nay mình muốn xuất sang addin để chia sẽ cho anh em cơ quan, quá trình dùng có thể phải cập nhật, sửa lỗi thêm (nếu có) mà không phải chép lại file, chép dữ liệu rồi mới chạy code vba trong file đó.
Mình thử và tìm trên mạng vẫn ko thấy có hướng dẫn, có xem vài addin mở nhưng không hiểu lắm. Do vậy, mình nhờ mọi người hướng dẫn giúp các bước chi tiết với ạ (hay code luôn vào cái addin đi kèm làm mẫu để mình học với ạ). Cảm ơn nhiều.
 

File đính kèm

Upvote 0
Mọi người cho mình hỏi vấn đề này:
Mình có làm ứng dụng nhỏ trong công việc, file excel chứa code đã chạy được, nay mình muốn xuất sang addin để chia sẽ cho anh em cơ quan, quá trình dùng có thể phải cập nhật, sửa lỗi thêm (nếu có) mà không phải chép lại file, chép dữ liệu rồi mới chạy code vba trong file đó.
Mình thử và tìm trên mạng vẫn ko thấy có hướng dẫn, có xem vài addin mở nhưng không hiểu lắm. Do vậy, mình nhờ mọi người hướng dẫn giúp các bước chi tiết với ạ (hay code luôn vào cái addin đi kèm làm mẫu để mình học với ạ). Cảm ơn nhiều.
Mình thấy cái file mẫu nó lạ lạ thế nào ấy ... và đoạn Code trong Add In thì Sheet2 lấy tên Sheet còn Sheet3 lấy lấy giá trị xuất. Cái này để làm gì vậy bạn ?
 
Upvote 0
Mình thấy cái file mẫu nó lạ lạ thế nào ấy ... và đoạn Code trong Add In thì Sheet2 lấy tên Sheet còn Sheet3 lấy lấy giá trị xuất. Cái này để làm gì vậy bạn ?
Cái này mình làm mẫu ví dụ bạn à, để hướng dùm cách để có thể xuất dữ liệu. Cái code đó mình tạo trên file excel gồm 3 sheet, lệnh xuất sheet1 qua các sheet2, 3 đã chạy được, rồi mình xóa hết sheet2,3 để tạo file addin. Giờ muốn từ file bất kỳ sau khi add cái addin vào thì xuất như các ứng dụng đó bạn (mục đích có sửa code thì thay cái addin, chứ bắt thay luôn file thì không tiện lắm).
Ps: Mình có thử qua các lệnh thisworkbook hay activeworkbook nhưng vẫn không được, kiểu như nó hiểu xuất vào các sheet trong file addin thôi hay sao ý.
Nhờ bạn với mọi người hướng dẫn giúp (code vào file addin hộ).
 
Upvote 0
Cái này mình làm mẫu ví dụ bạn à, để hướng dùm cách để có thể xuất dữ liệu. Cái code đó mình tạo trên file excel gồm 3 sheet, lệnh xuất sheet1 qua các sheet2, 3 đã chạy được, rồi mình xóa hết sheet2,3 để tạo file addin. Giờ muốn từ file bất kỳ sau khi add cái addin vào thì xuất như các ứng dụng đó bạn (mục đích có sửa code thì thay cái addin, chứ bắt thay luôn file thì không tiện lắm).
Ps: Mình có thử qua các lệnh thisworkbook hay activeworkbook nhưng vẫn không được, kiểu như nó hiểu xuất vào các sheet trong file addin thôi hay sao ý.
Nhờ bạn với mọi người hướng dẫn giúp (code vào file addin hộ).
Trong file addin sửa code thế này.
Mã:
Public Sub Xuat()
Dim i As Long
For i = 2 To 16
    With ActiveWorkbook.Sheets(2)
        .Cells(i, 1).Formula = "='Sheet1'!B" & i
    End With
    With ActiveWorkbook.Sheets(3)
        .Cells(i, 1).Formula = "='Sheet1'!a" & i
    End With
Next
End Sub
 
Upvote 0
Dạ em chào mọi người.
Em có viết 1 đoạn code đơn giản như sau, em đang test thử ở màng hình immediate mà bị báo lỗi
range("A1").FormulaR1C1 = "=ISNUMBER(FIND("HKNK",RC[1]))"

Em phải làm sao để HKNK được hiểu là chuổi cần tìm mà ko phải là biến, để ô A1 trả về True.
Mong mọi người giúp em
 

File đính kèm

Upvote 0

Bài viết mới nhất

Back
Top Bottom