Giúp đỡ về chạy Input Box (1 người xem)

Liên hệ QC

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

Mr.Death

Thành viên mới
Tham gia
14/3/09
Bài viết
5
Được thích
1
Chào các thầy,
Em mới mò mẫm VBA cho excel để hỗ trợ công việc hàng ngày 1 tí.
Em đang vướng đoạn VBA như thế này, em nêu ý tưởng và đính kèm file gốc (đã xóa sạch dữ liệu vì tính bảo mật của công ty), nhờ các thầy giúp em với.
Khi nhấn nút TR generating thì cửa sổ InputBox hiện ra để chọn ô có dữ liệu cần làm.
a. Nếu Cell được chọn bằng con trỏ chuột có số cột không phải 19 thì sẽ hiện MsgBox để thông báo và yêu cầu người dùng chọn lại.
b. Nếu Cell được chọn bằng con trỏ chuột có số cột là 19 và dữ liệu trong ô đã có sẵn thì hiện MsgBox để thông báo và hỏi người dùng có muốn chọn Cell khác không.
c. Nếu Cell được chọn bằng con trỏ chuột có số cột là 19 và dữ liệu trong Cell là rỗng thì thực hiện hàm TRgenerating.
d. b, c và InputBox sẽ được lặp lại cho đến khi c đúng (Do...Loop Until) mà em ngu không biết đặt cái Do...Loop Until ở đâu cho phải.
Q: Khi em chạy chương trình thì macro luôn hiểu activecell là cell mà em đã chọn trước chứ không phải cell mà con trỏ chuột lựa chọn sau khi InputBox được mở ra. => Nếu em muốn dữ liệu mà InputBox nhận là nguồn vào thì em phải gõ code thế nào ạ?

Em cảm ơn nhiều.

Pass mở file excel là 1234 ạ. Em lười xíu.
 

File đính kèm

Em up topic này lên không trôi mất ạ.

Em cảm ơn.
 
Upvote 0
Em cũng không biết nên gọi nó là hàm hay là cái gì nữa, nhưng nó là thủ tục em viết ra để chạy chương trình thôi ạ.
 
Upvote 0
Dùng InputBox để chọn ô - Lặp đi lặp lại theo ý muốn...

Để dung hàm InputBox chọn ô lặp đi lặp lại đến khi đạt giá trị mình muốn thì có 2 cách. Một là dùng vòng lặp, hai là dùng Label. Ở đây dùng Label là phù hợp. Code tôi gửi dưới đây sử dụng dùng kỹ thuật Label.

[GPECODE=vb]
Public oldActiveCell As Range

Private Sub CommandButton1_Click()
'Modified: Nguyen Duy Tuan
Dim ans As VbMsgBoxResult

Sheets("Database").Activate

lbBegin:
Set oldActiveCell = InputBox
If oldActiveCell Is Nothing Then Exit Sub

If oldActiveCell.Column <> 19 Then
ans = MsgBox("Please choose cell in column S!" & vbNewLine & "Do you want to try again?", vbYesNo, "Alert")
If ans = vbYes Then
GoTo lbBegin ' InputBox
Else
Exit Sub
End If
End If
If oldActiveCell.Value <> "" Then
Select Case ans = MsgBox("This trouble have reported!" & vbNewLine & "Do you want to regenerate it?", vbYesNo, "TR Generate")
Case ans = vbNo
ans = MsgBox("Do you want to choose other trouble?", vbYesNo, "TR generate")
If ans = vbYes Then
GoTo lbBegin ' InputBox
Else
Exit Sub
End If
End Select
End If

lbGenerate:
TRgenerate oldActiveCell

End Sub

Function InputBox() As Range
On Error GoTo lbErr
If oldActiveCell Is Nothing Then Set oldActiveCell = ActiveCell
Set InputBox = Application.InputBox("Please choose the cell have TR you want to generate:", "TR choose", Type:=8, Default:=oldActiveCell.Address)
Exit Function
lbErr:
Set InputBox = Nothing
End Function

Sub TRgenerate(ByVal oldActiveCell As Range)
Sheets("TR template").Range("AB10") = oldActiveCell.Offset(0, -6).Value
Sheets("TR template").Range("F12") = oldActiveCell.Offset(0, -11).Value
Sheets("TR template").Range("K12") = oldActiveCell.Offset(0, -16).Value
Sheets("TR template").Range("Y12") = oldActiveCell.Offset(0, -4).Value
Sheets("TR template").Range("D13") = oldActiveCell.Offset(0, -10).Value
Sheets("TR template").Range("L14") = oldActiveCell.Offset(0, -15).Value
Sheets("TR template").Range("Y14") = oldActiveCell.Offset(0, -5).Value
Sheets("TR template").Range("F15") = oldActiveCell.Offset(0, -14).Value
Sheets("TR template").Range("F16") = oldActiveCell.Offset(0, -8).Value
Sheets("TR template").Range("F17") = oldActiveCell.Offset(0, -7).Value
Sheets("TR template").Activate
End Sub
[/GPECODE]
 

File đính kèm

Upvote 0
Thanks thầy Tuân,
Chiều muộn tối qua em đã dùng hàm Do... Loop Until được rồi ạ. Nhưng cách của thầy cho em cách nhìn mới khi dùng label, em sẽ lưu ý.
Và hôm qua sở dĩ lúc nào cái code của em không chạy như ý là bởi em dùng cái ActiveCell và chưa biết dùng cách khai báo biến Range. Giờ đã hiểu.

Cám ơn thầy, em đang phát triển thêm 1 số tính năng cho cái file của em, có gì khó sẽ lại nhờ các thầy.

Thanks again.
 
Upvote 0
Thanks thầy Tuân,
Chiều muộn tối qua em đã dùng hàm Do... Loop Until được rồi ạ. Nhưng cách của thầy cho em cách nhìn mới khi dùng label, em sẽ lưu ý.
Và hôm qua sở dĩ lúc nào cái code của em không chạy như ý là bởi em dùng cái ActiveCell và chưa biết dùng cách khai báo biến Range. Giờ đã hiểu.

Cám ơn thầy, em đang phát triển thêm 1 số tính năng cho cái file của em, có gì khó sẽ lại nhờ các thầy.

Thanks again.

Bạn cũng kiểm tra lại logic chaỵh lệnh và thoát vì code cũ mình phải sửa cả cái đó.
 
Upvote 0
Thanks thầy,
Em có xem lại cái Loop của em và nó có chạy nhưng không đúng ý, vẫn còn 1 số logic không phù hợp, nên em đã tham khảo lại cách chạy label của thầy.

Hì hục mãi cuối cùng cũng khiến nó chạy tương đối đúng ý. Hy vọng không gặp lỗi gì ngoài ý muốn cho hàm đơn giản này nữa.

Thầy xem đoạn code bên dưới nhé. Coi như em trả bài :D.

Public box As Range

Private Sub commandbutton1_click()
On Error GoTo lberr
Dim ans1 As VbMsgBoxResult
Dim ans2 As VbMsgBoxResult
Dim ans3 As VbMsgBoxResult
lbbegin:
InputBox
If box.Cells.Column <> 19 Then
ans1 = MsgBox("Please choose cell of TR in column S" & vbNewLine & "Do you want to try again?", vbYesNo, "TR generating")
If ans1 = vbYes Then GoTo lbbegin
Exit Sub
ElseIf box.Cells.Value <> "" Then
ans2 = MsgBox("This TR had report already" & vbNewLine & "Do you want to re-generate it?", vbYesNo)
If ans2 = vbYes Then GoTo lbrun
ans3 = MsgBox("Do you want to choose other?", vbYesNo, "Alert")
If ans3 = vbYes Then GoTo lbbegin
Exit Sub
End If
lbrun:
TRgenerate
lberr:
Exit Sub
End Sub


Sub TRgenerate()
Sheets("TR template").Range("AB10") = box.Cells.Offset(0, -6).Value
Sheets("TR template").Range("F12") = box.Cells.Offset(0, -11).Value
Sheets("TR template").Range("K12") = box.Cells.Offset(0, -16).Value
Sheets("TR template").Range("Y12") = box.Cells.Offset(0, -4).Value
Sheets("TR template").Range("D13") = box.Cells.Offset(0, -10).Value
Sheets("TR template").Range("L14") = box.Cells.Offset(0, -15).Value
Sheets("TR template").Range("Y14") = box.Cells.Offset(0, -5).Value
Sheets("TR template").Range("F15") = box.Cells.Offset(0, -14).Value
Sheets("TR template").Range("F16") = box.Cells.Offset(0, -8).Value
Sheets("TR template").Range("F17") = box.Cells.Offset(0, -7).Value
Sheets("TR template").Activate
End Sub


Sub InputBox()
Set box = Application.InputBox("Please choose the cell have TR you want to generate:", "TR choose", ActiveCell.Address, Type:=8)
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom