Lựa chọn Máy và in bằng Form DialogSheet (5 người xem)

Liên hệ QC

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

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,538
Được thích
4,129
Giới tính
Nam
Mình có làm một Form in bằng Dialog Sheet mà nó lỗi khi Add máy in vào Text và lựa chọn số trang in trên DialogSheet....
Mong các bạn trợ giúp xem nó lỗi dó mình viết code nó Không hiểu hay mình không hiểu nó hay sao ấy ....--=0--=0

Trên Form thì mình làm được còn trên DialogSheet thì đang kẹt cái vụ TextBox...Link máy in vào đó và Gõ số trang in ...khi nhấn in thì in xong thoát luôn cái DialogSheet đó luôn...

Khi ở bất cứ Sheet nào thì nó in theo Vùng mình viết trong Code

Rất mong các thành viên trợ giúp
Link File
http://www.mediafire.com/download/i9003051422s5x0/Seup_May_In.rar
Xin cảm ơn Các Bạn
 
Lần chỉnh sửa cuối:
tự nhiên post cái bài này chi báo hại tui đi tìm hiểu khái niệm dialog sheet coi nó là cái quái gì .
trong file của anh có 2 chỗ chú thích màu xanh
1/
Mã:
EditBox7 = Application.ActivePrinter ';LOi
tôi sửa lại thành
Mã:
.EditBoxes("Edit Box 7").Text = Application.ActivePrinter

2/
Mã:
'.Range("A1:G86").PrintOut Copies:=(EditBox8.Value) ''Chon In may Trang ...Loi
tôi sửa lại thành
Mã:
DialogSheets("Dialog1").Hide
 Application.OnTime Now + TimeValue("00:00:01"), "innn"

nghe người ta nói muốn in là phải có delay để chờ Hide cái dialog

nội dung đại khái của sub innn
Mã:
Private Sub innn()
ActiveSheet.PrintOut Copies:=Val(DialogSheets("Dialog1").EditBoxes("Edit Box 8").Text)
End Sub
 
Upvote 0
tự nhiên post cái bài này chi báo hại tui đi tìm hiểu khái niệm dialog sheet coi nó là cái quái gì .
trong file của anh có 2 chỗ chú thích màu xanh
1/
Mã:
EditBox7 = Application.ActivePrinter ';LOi
tôi sửa lại thành
Mã:
.EditBoxes("Edit Box 7").Text = Application.ActivePrinter

2/
Mã:
'.Range("A1:G86").PrintOut Copies:=(EditBox8.Value) ''Chon In may Trang ...Loi
tôi sửa lại thành
Mã:
DialogSheets("Dialog1").Hide
 Application.OnTime Now + TimeValue("00:00:01"), "innn"

nghe người ta nói muốn in là phải có delay để chờ Hide cái dialog

nội dung đại khái của sub innn
Mã:
Private Sub innn()
ActiveSheet.PrintOut Copies:=Val(DialogSheets("Dialog1").EditBoxes("Edit Box 8").Text)
End Sub

cảm Ơn bạn nhiều
cuối cùng làm theo hướng dẫn của Bạn OK Chạy vèo vèo
1/ Set Máy in
PHP:
Sub Form_Initialize()
With DialogSheets("Dialog1")
    .Application.Dialogs(xlDialogPrinterSetup).Show
    .EditBoxes("M1").Text = Application.ActivePrinter
End With
End Sub
2/ Hide Form DialogSheet
PHP:
Public Sub VungIn()
    DialogSheets("Dialog1").Hide
    Application.OnTime Now + TimeValue("00:00:01"), "InPhieu"
    ActiveSheet.Range("C5:C82").AutoFilter 1, "<>"
End Sub
3/In Phiếu
PHP:
Public Sub InPhieu()
    ActiveSheet.Range("A1:G86").PrintOut Copies:=Val(DialogSheets("Dialog1").EditBoxes("S1").Text)
End Sub

Quan Trọng nhất là dòng Sau nếu ko có thì Tèo Téo Teo
Application.OnTime Now + TimeValue("00:00:01"), "InPhieu"
 
Upvote 0
làm form như anh còn bất tiện quá . có cách nào đọc danh sách các máy in bỏ vào 1 cái combobox không ta ? lúc này ta sử dụng combobox thế vào chỗ cái textbox máy in. khỏi cần hiện ra cái Application.Dialogs(xlDialogPrinterSetup).Show chi cho mệt . --=0--=0--=0
 
Upvote 0
có cách nào đọc danh sách các máy in bỏ vào 1 cái combobox không ta ? lúc này ta sử dụng combobox thế vào chỗ cái textbox máy in. khỏi cần hiện ra cái Application.Dialogs(xlDialogPrinterSetup).Show chi cho mệt . --=0--=0--=0

Thử code vầy xem:
Mã:
Sub Test()
  Dim aPrinters As Object
  Dim i As Long, n As Long
  With CreateObject("WScript.Network")
    Set aPrinters = .EnumPrinterConnections
    ReDim [COLOR=#ff0000]arr[/COLOR](1 To Int(aPrinters.Count / 2))
    For i = 1 To aPrinters.Count Step 2
      n = n + 1
      [COLOR=#ff0000]arr(n)[/COLOR] = aPrinters.Item(i)
    Next
    MsgBox Join([COLOR=#ff0000]arr[/COLOR], vbLf)
  End With
End Sub
Biến arr chính là mảng với các phần tử là Printer đấy... làm gì sau đó tùy thích
 
Upvote 0
làm form như anh còn bất tiện quá . có cách nào đọc danh sách các máy in bỏ vào 1 cái combobox không ta ? lúc này ta sử dụng combobox thế vào chỗ cái textbox máy in. khỏi cần hiện ra cái Application.Dialogs(xlDialogPrinterSetup).Show chi cho mệt . --=0--=0--=0
tại đang xài cái UserForm kia lâu rồi thấy chán....thấy anh Ndu làm cái Help hay quá nổi hứng lên tập vọc sang Dialog xem sao ấy mà.....thú thất mà nói Dialog ứng dụng làm help, Msgbox, và Form hay thiệt........--=0--=0
 
Upvote 0
Thử code vầy xem:
Mã:
Sub Test()
  Dim aPrinters As Object
  Dim i As Long, n As Long
  With CreateObject("WScript.Network")
    Set aPrinters = .EnumPrinterConnections
    ReDim [COLOR=#ff0000]arr[/COLOR](1 To Int(aPrinters.Count / 2))
    For i = 1 To aPrinters.Count Step 2
      n = n + 1
      [COLOR=#ff0000]arr(n)[/COLOR] = aPrinters.Item(i)
    Next
    MsgBox Join([COLOR=#ff0000]arr[/COLOR], vbLf)
  End With
End Sub
Biến arr chính là mảng với các phần tử là Printer đấy... làm gì sau đó tùy thích
Code này Anh viết Em cho lên UserForm hay Sheet chạy Tuyệt vời luôn....

Nhưng trên Dialog là Em Tịt....lạ ghê cái Tên Texbox,Combobox... trên đó nó cũng khác UserForm hay Cobox trên Sheet

Em không hình dung được tên nó như thế nào cho đúng.... nếu được nhờ Anh chỉ dùm...

Code Sau của Anh Em cho trên UserForm chạy rất tốt
PHP:
Private Sub UserForm_Initialize()
    Dim aPrinters As Object
    Dim i As Long, n As Long
    With CreateObject("WScript.Network")
        Set aPrinters = .EnumPrinterConnections
        ReDim ARR(1 To Int(aPrinters.Count / 2))
        For i = 1 To aPrinters.Count Step 2
          n = n + 1
          ARR(n) = aPrinters.Item(i)
        Next
        Printer_Setup.List = ARR
    End With
End Sub

Em cảm ơn
 
Upvote 0
Code này Anh viết Em cho lên UserForm hay Sheet chạy Tuyệt vời luôn....

Nhưng trên Dialog là Em Tịt....lạ ghê cái Tên Texbox,Combobox... trên đó nó cũng khác UserForm hay Cobox trên Sheet

Em không hình dung được tên nó như thế nào cho đúng.... nếu được nhờ Anh chỉ dùm...

Code Sau của Anh Em cho trên UserForm chạy rất tốt
Mã:
Private Sub UserForm_Initialize()
    Dim aPrinters As Object
    Dim i As Long, n As Long
    With CreateObject("WScript.Network")
        Set aPrinters = .EnumPrinterConnections
        ReDim ARR(1 To Int(aPrinters.Count / 2))
        For i = 1 To aPrinters.Count Step 2
          n = n + 1
          ARR(n) = aPrinters.Item(i)
        Next
        Printer_Setup.List = ARR
    End With
End Sub

Em cảm ơn

Cái ComboBox trong DialogSheet nó được gọi là DropDown nên sẽ viết thế này:
Mã:
Private Sub UserForm_Initialize()
  Dim aPrinters As Object
  Dim i As Long, n As Long
  [COLOR=#ff0000]Dim Printer_Setup As DropDown
  Set Printer_Setup = DialogSheets("Dialog1").DropDowns("Printer_Setup")[/COLOR]
  With CreateObject("WScript.Network")
    Set aPrinters = .EnumPrinterConnections
    ReDim ARR(1 To Int(aPrinters.Count / 2))
    For i = 1 To aPrinters.Count Step 2
      n = n + 1
      ARR(n) = aPrinters.Item(i)
    Next
    Printer_Setup.List = ARR
  End With
End Sub
Ngay sau khi khai báo như dòng màu đỏ thì thằng Printer_Setup đã có thuộc tính rồi đấy (gõ Printer_Setup rồi dấu chấm, sẽ có list gợi ý)
---------------------------
Xem thêm bài này để biết 1 số cách gọi tên:
http://www.giaiphapexcel.com/forum/showthread.php?31515-Tạo-Form-bằng-DialogSheet
 
Lần chỉnh sửa cuối:
Upvote 0
Thử code vầy xem:
Mã:
Sub Test()
  Dim aPrinters As Object
  Dim i As Long, n As Long
  With CreateObject("WScript.Network")
    Set aPrinters = .EnumPrinterConnections
    ReDim [COLOR=#ff0000]arr[/COLOR](1 To Int(aPrinters.Count / 2))
    For i = 1 To aPrinters.Count Step 2
      n = n + 1
      [COLOR=#ff0000]arr(n)[/COLOR] = aPrinters.Item(i)
    Next
    MsgBox Join([COLOR=#ff0000]arr[/COLOR], vbLf)
  End With
End Sub
Biến arr chính là mảng với các phần tử là Printer đấy... làm gì sau đó tùy thích

E áp dụng code trên nhưng có 1 vấn đề:
A cho e hỏi sau khi e add cái Arr ( Printer ) vào combobox. Sau khi e chọn 1 tên máy in trong list để 'Active' nó thành 'default Printer' thì nó lại báo lỗi " Method 'Active Printer' of object '_Application' failed "

Mong a có thể hướng dẫn e cách khắc phục lỗi này không ah

Code e chọn active printer : Application.ActivePrinter = .List(.ListIndex, 0)

E cám ơn !
 
Upvote 0
Cái ComboBox trong DialogSheet nó được gọi là DropDown nên sẽ viết thế này:
Mã:
Private Sub UserForm_Initialize()
  Dim aPrinters As Object
  Dim i As Long, n As Long
  [COLOR=#ff0000]Dim Printer_Setup As DropDown
  Set Printer_Setup = DialogSheets("Dialog1").DropDowns("Printer_Setup")[/COLOR]
  With CreateObject("WScript.Network")
    Set aPrinters = .EnumPrinterConnections
    ReDim ARR(1 To Int(aPrinters.Count / 2))
    For i = 1 To aPrinters.Count Step 2
      n = n + 1
      ARR(n) = aPrinters.Item(i)
    Next
    Printer_Setup.List = ARR
  End With
End Sub
Ngay sau khi khai báo như dòng màu đỏ thì thằng Printer_Setup đã có thuộc tính rồi đấy (gõ Printer_Setup rồi dấu chấm, sẽ có list gợi ý)
---------------------------
Xem thêm bài này để biết 1 số cách gọi tên:
http://www.giaiphapexcel.com/forum/showthread.php?31515-Tạo-Form-bằng-DialogSheet
Em làm theo Anh hướng dẫn thì OK rồi còn một mục nhỏ nữa là khi nó hiện Form lên em bấm vào đó có list máy in sổ nhưng nó không gán vào đó luôn mà thành Empty khi thả chuột ra... mong Anh chỉ thêm..
Em cảm ơn
Link File Test
http://www.mediafire.com/download/oohn5yy6g9x6gaf/Printer_Setup.rar
 
Upvote 0
E áp dụng code trên nhưng có 1 vấn đề:
A cho e hỏi sau khi e add cái Arr ( Printer ) vào combobox. Sau khi e chọn 1 tên máy in trong list để 'Active' nó thành 'default Printer' thì nó lại báo lỗi " Method 'Active Printer' of object '_Application' failed "

Mong a có thể hướng dẫn e cách khắc phục lỗi này không ah

Code e chọn active printer : Application.ActivePrinter = .List(.ListIndex, 0)

E cám ơn !
Bạn tải File mình mới úp bài 10 đó mà coi... do bạn làm sai một cái gì đó nên nó mới vậy
 
Lần chỉnh sửa cuối:
Upvote 0
Em làm theo Anh hướng dẫn thì OK rồi còn một mục nhỏ nữa là khi nó hiện Form lên em bấm vào đó có list máy in sổ nhưng nó không gán vào đó luôn mà thành Empty khi thả chuột ra... mong Anh chỉ thêm..
Em cảm ơn
Link File Test
http://www.mediafire.com/download/oohn5yy6g9x6gaf/Printer_Setup.rar

làm vậy mất vui . làm không được thì phải suy nghĩ đến khi nào được mới thôi chứ --=0--=0--=0
nếu 3 ngày 3 đêm nghĩ chưa ra mới gọi thầy giải chứ
 
Upvote 0
Em làm theo Anh hướng dẫn thì OK rồi còn một mục nhỏ nữa là khi nó hiện Form lên em bấm vào đó có list máy in sổ nhưng nó không gán vào đó luôn mà thành Empty khi thả chuột ra... mong Anh chỉ thêm..
Em cảm ơn
Link File Test
http://www.mediafire.com/download/oohn5yy6g9x6gaf/Printer_Setup.rar

Không gán được là đúng rồi, bởi bạn đâu có viết code gì cho nó đâu!
Code cho sự kiện Change của DropDown:
Mã:
Sub DropDown_Change()
  Dim Printer_Setup As DropDown
  Dim arr, sPrinter As String
  Set Printer_Setup = DialogSheets("Dialog2").DropDowns("Printer_Setup")
  arr = Printer_Setup.List()
  sPrinter = arr(Printer_Setup.Value)
  Printer_Setup.Caption = sPrinter
  Application.ActivePrinter = sPrinter
End Sub
Assign Macro thằng ComboBox cho Sub này nhé
------------------
Còn code Priter_Setup_CamBox sửa thành vầy xem:
Mã:
Sub Priter_Setup_CamBox()
  Dim aPrinters As Object
  Dim i As Long, n As Long, arr()
  [COLOR=#ff0000]Dim sTmp As String[/COLOR]
  Dim Printer_Setup As DropDown
  Set Printer_Setup = DialogSheets("Dialog2").DropDowns("Printer_Setup")
  Printer_Setup.Enabled = True
  With CreateObject("WScript.Network")
    Set aPrinters = .EnumPrinterConnections
    ReDim arr(1 To Int(aPrinters.Count / 2))
    For i = 1 To aPrinters.Count Step 2
      n = n + 1
     [COLOR=#ff0000]If n = 1 Then
       sTmp = " on nul:"
     Else
       sTmp = " on Ne" & Format(n - 2, "00") & ":"
     End If
     arr(n) = aPrinters.Item(i) & sTmp[/COLOR]
   Next
   Printer_Setup.List = arr
  End With
End Sub
Chỗ màu đỏ là mới sửa lại
------------------------------------------
E áp dụng code trên nhưng có 1 vấn đề:
A cho e hỏi sau khi e add cái Arr ( Printer ) vào combobox. Sau khi e chọn 1 tên máy in trong list để 'Active' nó thành 'default Printer' thì nó lại báo lỗi " Method 'Active Printer' of object '_Application' failed "

Mong a có thể hướng dẫn e cách khắc phục lỗi này không ah

Code e chọn active printer : Application.ActivePrinter = .List(.ListIndex, 0)

E cám ơn !
Xem lại code mới nhé
(tôi không có máy in nên khó test mấy vụ này. Các bạn có thể tự thí nghiệm là biết liền chứ gì)
 

File đính kèm

Upvote 0
Không gán được là đúng rồi, bởi bạn đâu có viết code gì cho nó đâu!
Code cho sự kiện Change của DropDown:
Mã:
Sub DropDown_Change()
  Dim Printer_Setup As DropDown
  Dim arr, sPrinter As String
  Set Printer_Setup = DialogSheets("Dialog2").DropDowns("Printer_Setup")
  arr = Printer_Setup.List()
  sPrinter = arr(Printer_Setup.Value)
  Printer_Setup.Caption = sPrinter
  Application.ActivePrinter = sPrinter
End Sub
Assign Macro thằng ComboBox cho Sub này nhé
------------------
Còn code Priter_Setup_CamBox sửa thành vầy xem:
Mã:
Sub Priter_Setup_CamBox()
  Dim aPrinters As Object
  Dim i As Long, n As Long, arr()
  [COLOR=#ff0000]Dim sTmp As String[/COLOR]
  Dim Printer_Setup As DropDown
  Set Printer_Setup = DialogSheets("Dialog2").DropDowns("Printer_Setup")
  Printer_Setup.Enabled = True
  With CreateObject("WScript.Network")
    Set aPrinters = .EnumPrinterConnections
    ReDim arr(1 To Int(aPrinters.Count / 2))
    For i = 1 To aPrinters.Count Step 2
      n = n + 1
     [COLOR=#ff0000]If n = 1 Then
       sTmp = " on nul:"
     Else
       sTmp = " on Ne" & Format(n - 2, "00") & ":"
     End If
     arr(n) = aPrinters.Item(i) & sTmp[/COLOR]
   Next
   Printer_Setup.List = arr
  End With
End Sub
Chỗ màu đỏ là mới sửa lại
------------------------------------------

Xem lại code mới nhé
(tôi không có máy in nên khó test mấy vụ này. Các bạn có thể tự thí nghiệm là biết liền chứ gì)
Em mới thử khi gán vào nó báo lỗi dòng sau Anh
Application.ActivePrinter = sPrinter
Em sửa lại vậy mới Ok ...Chắc Anh Viết lộn
sPrinter = Application.ActivePrinter
Cảm ơn Anh
 
Lần chỉnh sửa cuối:
Upvote 0
Xin nói thêm về cách thí nghiệm để biết tên của các máy in được Excel gọi tên là gì:
1> Giả định bạn đang có 3 máy in
2> Bạn cứ Setup bằng tay máy in 1 (cho máy in 1 làm máy in mặc định)
3> Xong, gõ vào cửa sổ Immediate dòng lệnh: ?Application.ActivePrinter rồi Enter phát
4> Ghi lại tên máy in trong trường hợp này
5> Tiếp theo, Setup bàng tay máy in thứ 2 rồi thực hiện lại các bước từ 3 đến 4
6> Cứ thế làm cho tất cả các máy in... bạn sẽ có được danh sách tên thật của các máy in
 
Upvote 0
Thử từng phần tử trong ComboBox xem lỗi khi chọn cái nào
Em thử hết rồi chạy tốt...nhưng tên máy in trong ComboBox khác với Immediate trong VBA

ComboBox có cái đuôi là HP LaserJet Professional P1102 on Ne00:

Immediate có cái đuôi là HP LaserJet Professional P1102 on Ne01:

Chung kết chạy tốt không lỗi
Em cảm ơn Anh
 
Upvote 0
Em thử hết rồi chạy tốt...nhưng tên máy in trong ComboBox khác với Immediate trong VBA

ComboBox có cái đuôi là HP LaserJet Professional P1102 on Ne00:

Immediate có cái đuôi là HP LaserJet Professional P1102 on Ne01:

Chung kết chạy tốt không lỗi
Em cảm ơn Anh

Thì bạn cứ thí nghiệm và sửa lại cho đúng! Tại tôi không có máy in nên chỉ đoán mò
(nói chung là nó chỉ khác cái đuôi Ne00, Ne01, Ne02... gì đó thôi)
-----------------------------------------------------------
Em mới thử khi gán vào nó báo lỗi dòng sau Anh
Application.ActivePrinter = sPrinter
Em sửa lại vậy mới Ok ...Chắc Anh Viết lộn
sPrinter = Application.ActivePrinter
Cảm ơn Anh
Sửa vay vậy đâu có được.
Application.ActivePrinter = sPrinter là chọn và gán máy in (tức là ta muốn in bằng máy in nào thì chọn máy đó)
sPrinter = Application.ActivePrinter là lấy tên máy in hiện hành
2 chuyện khác nhau mà!
 
Lần chỉnh sửa cuối:
Upvote 0
ndu96081631 đã viết:
Sửa vay vậy đâu có được.
Application.ActivePrinter = sPrinter là chọn và gán máy in (tức là ta muốn in bằng máy in nào thì chọn máy đó)
sPrinter = Application.ActivePrinter là lấy tên máy in hiện hành
2 chuyện khác nhau mà!

Vụ này Em cũng không biết lý do lỗi là do cái gì nữa. nếu để theo cách Anh viết khi bấm vào Cambox là báo lỗi liền ... Em thử hoài vẫn vậy .... còn nếu đảo ngược lại là ok....
 
Lần chỉnh sửa cuối:
Upvote 0
Sửa vay vậy đâu có được.
Application.ActivePrinter = sPrinter là chọn và gán máy in (tức là ta muốn in bằng máy in nào thì chọn máy đó)
sPrinter = Application.ActivePrinter là lấy tên máy in hiện hành
2 chuyện khác nhau mà!

Vụ này Em cũng không biết lý do lỗi là do cái gì nữa. nếu để theo cách Anh viết khi bấm vào Cambox là báo lỗi liền ... Em thử hoài vẫn vậy .... còn nếu đảo ngược lại là ok....

Vấn đề là sau khi chọn xong, bạn có in được với đúng cái máy in bạn đã chọn không ấy chứ?
 
Upvote 0
Web KT

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

Back
Top Bottom