Lựa chọn Máy và in bằng Form DialogSheet (8 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:
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ứ?
em nghĩ là cái chỗ thầy tô màu đỏ ở trên sao đó
em phải sửa lại vầy mới chạy được trên máy em
Mã:
For i = 1 To aPrinters.Count Step 2
      n = n + 1
     sTmp = " on Ne" & Format(n - 1, "00") & ":"
     arr(n) = aPrinters.Item(i) & sTmp
   Next
 
Upvote 0
Xin lỗi ....Bài thừa nhờ mod xóa dùm
 
Lần chỉnh sửa cuối:
Upvote 0
em nghĩ là cái chỗ thầy tô màu đỏ ở trên sao đó
em phải sửa lại vầy mới chạy được trên máy em
Mã:
For i = 1 To aPrinters.Count Step 2
      n = n + 1
     sTmp = " on Ne" & Format(n - 1, "00") & ":"
     arr(n) = aPrinters.Item(i) & sTmp
   Next

Đã nói là tôi không có máy in nên tôi không biết đâu! Ai có máy in cứ tự thí nghiệm và sửa sao cho phù hợp thì thôi
Bằng cách gõ vào cửa sổ Immediate dòng lệnh ?Application.ActivePrinter xem nó có cái "đuôi" gì không rồi tự sửa code. Mục đích cuối cùng là làm sao ta gán máy in nó không báo lỗi là được!
 
Upvote 0
thì ở trên em có nói đó . sửa lại bài #13 theo như em nói thì mới được . còn không là cứ
method activeprinter of object application fail => cái này là nói anh kieu manh nha hok phải nói với thầy
 
Upvote 0
thì ở trên em có nói đó . sửa lại bài #13 theo như em nói thì mới được . còn không là cứ
method activeprinter of object application fail => cái này là nói anh kieu manh nha hok phải nói với thầy
Cảm Ơn bạn làm theo hướng dẫn này thì máy in khi chon Cambox thay đổi tức thì .........OKOK
Nhưng phát sinh lỗi khi lỡ tay chọn máy in có đuôi là on nul:
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm Ơn bạn làm theo hướng dẫn này thì máy in khi chon Cambox thay đổi tức thì .........OKOK
Nhưng phát sinh lỗi khi lỡ tay chọn máy in có đuôi là on nul:

anh nhìn kĩ code ở trên nhé . không có cái nào là máy on null cả
on đầu tiên là on 00

nếu xong vấn đề máy in ta mới giao lưu vấn đề số trang

làm sao gõ vào textbox số trang nội dung là
1,2-4,7,8
thì sẽ in các trang 1,2,3,4,7,8 ?
 
Upvote 0
anh nhìn kĩ code ở trên nhé . không có cái nào là máy on null cả
on đầu tiên là on 00

nếu xong vấn đề máy in ta mới giao lưu vấn đề số trang

làm sao gõ vào textbox số trang nội dung là
1,2-4,7,8
thì sẽ in các trang 1,2,3,4,7,8 ?

gặp tình huống " Send One Note 2013" thì dù cho có "00" thì khi chọn cũng báo lỗi.
Thếm tình huống nữa là máy in ảo " Cute Pdf" thì thằng này mà chơi "on Ne ...." thì không active máy in này được luôn.
Trên đây là 2 tình huống mình gặp phải !
 
Upvote 0
anh nhìn kĩ code ở trên nhé . không có cái nào là máy on null cả
on đầu tiên là on 00

nếu xong vấn đề máy in ta mới giao lưu vấn đề số trang

làm sao gõ vào textbox số trang nội dung là
1,2-4,7,8
thì sẽ in các trang 1,2,3,4,7,8 ?
Chính xác là vậy.... sory chưa coi kỹ code ....ẩu quá
 
Upvote 0
gặp tình huống " Send One Note 2013" thì dù cho có "00" thì khi chọn cũng báo lỗi.
Thếm tình huống nữa là máy in ảo " Cute Pdf" thì thằng này mà chơi "on Ne ...." thì không active máy in này được luôn.
Trên đây là 2 tình huống mình gặp phải !

Với "Send One Note... " thì hình như nó chơi với "on nul:" thì phải
 
Upvote 0
gặp tình huống " Send One Note 2013" thì dù cho có "00" thì khi chọn cũng báo lỗi.
Thếm tình huống nữa là máy in ảo " Cute Pdf" thì thằng này mà chơi "on Ne ...." thì không active máy in này được luôn.
Trên đây là 2 tình huống mình gặp phải !
khi nào gặp phải tình huống đó thì các vị phải vào regedit mà ngó coi nó là ne gì ?

nó nằm ở đường dẫn HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices

mVtULhflFfT79UJA_Sf_IsJ7E52UYf3EuYbHb37JsAY=w817-h270-no


mà muốn đọc được các giá trị này thì chỉ có nước dùng hàm API thôi
 
Upvote 0
khi nào gặp phải tình huống đó thì các vị phải vào regedit mà ngó coi nó là ne gì ?

nó nằm ở đường dẫn HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices

mà muốn đọc được các giá trị này thì chỉ có nước dùng hàm API thôi

Chính xác là chỉ dùng hàm API mới thiết lập 'ActivePrinter' đúng nhất.
Riêng trường hợp 'Send One Note... ' thì không để 'On Ne..' hay 'On Nul:' mới không có lỗi.
 
Upvote 0
khi nào gặp phải tình huống đó thì các vị phải vào regedit mà ngó coi nó là ne gì ?

nó nằm ở đường dẫn HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices

mVtULhflFfT79UJA_Sf_IsJ7E52UYf3EuYbHb37JsAY=w817-h270-no


mà muốn đọc được các giá trị này thì chỉ có nước dùng hàm API thôi

Cái đường dẫn chứa printers này tôi biết! Và cũng không hẳn chỉ có API mới đọc được mấy giá trị này đâu
Vấn đề là:
- Nếu dùng API thì ghét nhất cái vụ "lộn xộn" khi chạy trên hệ thống 32 hoặc 64 (có khi sửa hoài cũng không chạy! Bạn đã từng có lần thắc mắc vụ này đấy thôi)
- Nếu can thiệp registry thì.. ghét nhất cái vụ UAC trên máy tính của người khác. Hệ thống bảo mật sẽ không cho phép bạn làm điều này (lại phải tốn thêm 1 đống code khác để điều khiển thằng UAC này trước khi chạy code chính)... Hic!

có nhiều cái.. "ghét nhất" nên chưa muốn động tới
--------------------------------
Riêng trường hợp 'Send One Note... ' thì không để 'On Ne..' hay 'On Nul:' mới không có lỗi.
Cái đó chưa chắc! Ít nhất tôi đã thấy 1 vài máy nó "on nul:" đấy
 
Lần chỉnh sửa cuối:
Upvote 0
Cái đường dẫn chứa printers này tôi biết! Và cũng không hẳn chỉ có API mới đọc được mấy giá trị này đâu
Vấn đề là:
- Nếu dùng API thì ghét nhất cái vụ "lộn xộn" khi chạy trên hệ thống 32 hoặc 64 (có khi sửa hoài cũng không chạy! Bạn đã từng có lần thắc mắc vụ này đấy thôi)
- Nếu can thiệp registry thì.. ghét nhất cái vụ UAC trên máy tính của người khác. Hệ thống bảo mật sẽ không cho phép bạn làm điều này (lại phải tốn thêm 1 đống code khác để điều khiển thằng UAC này trước khi chạy code chính)... Hic!

có nhiều cái.. "ghét nhất" nên chưa muốn động tới

trời ơi mấy cái này em nói với mấy bạn chứ sao dám nói với thầy .
em chỉ nghĩ đơn giản mấy cái giá trị registry này ta ĐỌC chứ đâu có GHI mà UAC hả thầy
nếu là thầy thì thầy làm sao
 
Upvote 0
trên file bài #13 em thử code này với máy có UAC thấy có đọc được
các bạn đem code này về test với các máy khác xem sao . đặc biệt các máy có ne lạ

Mã:
Sub Priter_Setup_CamBox()
  Dim aPrinters As Object
  Dim i As Long, n As Long, arr()
  Dim sTmp As String, regRed As Object, regName As String
  Dim Printer_Setup As DropDown
  Set Printer_Setup = DialogSheets("Dialog2").DropDowns("Printer_Setup")
  Printer_Setup.Enabled = True
  Set regRed = CreateObject("WScript.Shell")
  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
        regName = regRed.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices\" & _
        aPrinters.Item(i))
        regName = Right(regName, Len(regName) - InStr(regName, ",Ne"))
        arr(n) = aPrinters.Item(i) & " on " & regName
   Next
   Printer_Setup.List = arr
  End With
End Sub
 
Upvote 0
trời ơi mấy cái này em nói với mấy bạn chứ sao dám nói với thầy .
em chỉ nghĩ đơn giản mấy cái giá trị registry này ta ĐỌC chứ đâu có GHI mà UAC hả thầy
nếu là thầy thì thầy làm sao

Cái vụ đọc Reg thằng UAC nó có cho phép hay không tôi không biết. Tuy nhiên, nếu thích reg thì có reg cho bạn đây:
Mã:
Public Const HKCU = &H80000001
Public Const regKey = "Software\Microsoft\Windows NT\CurrentVersion\Devices"
Function GetAllPrinters()
  Dim prn, aPrinters
  Dim prnName As String
  Dim regValue As String
  Dim n As Long
  Dim arr()
  With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    .enumvalues HKCU, regKey, aPrinters
    For Each prn In aPrinters
      .getstringvalue HKCU, regKey, prn, regValue
      prnName = prn & " on " & Split(regValue, ",")(1)
      n = n + 1
      ReDim Preserve arr(1 To n)
      arr(n) = prnName
      Debug.Print prnName
    Next
  End With
  If n Then
    GetAllPrinters = arr
  End If
End Function
Cứ thí nghiệm, tôi cũng không chắc lắm (bởi trên máy tôi nó chạy được còn máy khác thì.. phải test mới biết)
 
Lần chỉnh sửa cuối:
Upvote 0
trước giờ muốn làm cái gì với registry lên mạng tìm nó toàn quăng cho 1 đống API về đọc => bị ảo giác chỉ có API mới làm việc với registry
trao đổi với thầy mới học tập được nhiều điều bổ ích . cám ơn thầy
 
Upvote 0
Cái vụ đọc Reg thằng UAC nó có cho phép hay không tôi không biết. Tuy nhiên, nếu thích reg thì có reg cho bạn đây:
Mã:
Public Const HKCU = &H80000001
Public Const regKey = "Software\Microsoft\Windows NT\CurrentVersion\Devices"
Function GetAllPrinters()
  Dim prn, aPrinters
  Dim prnName As String
  Dim regValue As String
  Dim n As Long
  Dim arr()
  With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    .enumvalues HKCU, regKey, aPrinters
    For Each prn In aPrinters
      .getstringvalue HKCU, regKey, prn, regValue
      prnName = prn & " on " & Split(regValue, ",")(1)
      n = n + 1
      ReDim Preserve arr(1 To n)
      arr(n) = prnName
      Debug.Print prnName
    Next
  End With
  If n Then
    GetAllPrinters = arr
  End If
End Function
Cứ thí nghiệm, tôi cũng không chắc lắm (bởi trên máy tôi nó chạy được còn máy khác thì.. phải test mới biết)

Quá phê a ơi. Nó chạy mà không có xuất hiện 1 lỗi gì trên máy e ( dù thằng 'Send One Note ... choi 'On Nul:' nó vẫn active tuốt )
 
Upvote 0
Cái vụ đọc Reg thằng UAC nó có cho phép hay không tôi không biết. Tuy nhiên, nếu thích reg thì có reg cho bạn đây:
Mã:
Public Const HKCU = &H80000001
Public Const regKey = "Software\Microsoft\Windows NT\CurrentVersion\Devices"
Function GetAllPrinters()
  Dim prn, aPrinters
  Dim prnName As String
  Dim regValue As String
  Dim n As Long
  Dim arr()
  With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    .enumvalues HKCU, regKey, aPrinters
    For Each prn In aPrinters
      .getstringvalue HKCU, regKey, prn, regValue
      prnName = prn & " on " & Split(regValue, ",")(1)
      n = n + 1
      ReDim Preserve arr(1 To n)
      arr(n) = prnName
      Debug.Print prnName
    Next
  End With
  If n Then
    GetAllPrinters = arr
  End If
End Function
Xài Fuction code còn ngắn lại tí tẹo ....
PHP:
Sub Priter_Setup_CamBox()
    With DialogSheets("Dialog2")
        .DropDowns("Printer_Setup").Enabled = True
        .DropDowns("Printer_Setup").List = GetAllPrinters()
    End With
End Sub
Cứ thí nghiệm, tôi cũng không chắc lắm (bởi trên máy tôi nó chạy được còn máy khác thì.. phải test mới biết)
Quá hay ..........Xài Function có thể Áp dụng chung cho nhiều Form khác nhau....Tổng quát....Hay
 
Lần chỉnh sửa cuối:
Upvote 0
trên file bài #13 em thử code này với máy có UAC thấy có đọc được
các bạn đem code này về test với các máy khác xem sao . đặc biệt các máy có ne lạ

Mã:
Sub Priter_Setup_CamBox()
  Dim aPrinters As Object
  Dim i As Long, n As Long, arr()
  Dim sTmp As String, regRed As Object, regName As String
  Dim Printer_Setup As DropDown
  Set Printer_Setup = DialogSheets("Dialog2").DropDowns("Printer_Setup")
  Printer_Setup.Enabled = True
  Set regRed = CreateObject("WScript.Shell")
  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
        regName = regRed.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices\" & _
        aPrinters.Item(i))
        regName = Right(regName, Len(regName) - InStr(regName, ",Ne"))
        arr(n) = aPrinters.Item(i) & " on " & regName
   Next
   Printer_Setup.List = arr
  End With
End Sub
Chạy Quá Tốt....Cuối cùng ko đụng đến API mà giải quyết được vấn đề
 
Upvote 0
Nhân tiện tặng các "đồng chí bạn" code tổng quát hơn nữa: Lấy tất cả các names và values trong 1 key nào đó
Mã:
Public Const HKEY_CLASSES_ROOT As Long = &H80000000
Public Const HKEY_CURRENT_USER As Long = &H80000001
Public Const HKEY_LOCAL_MACHINE As Long = &H80000002
Public Const HKEY_USERS As Long = &H80000003
'Public Const HKEY_PERFORMANCE_DATA as Long = &H80000004
Public Const HKEY_CURRENT_CONFIG As Long = &H80000005
'Public Const HKEY_DYN_DATA as Long = &H80000006

Public Const WMI_CLASS = "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"

Function GetAllNames(ByVal RootKey As Long, ByVal RegKey As String)
  Dim arr(), aNames, regName, regValue
  Dim ret As String
  Dim n As Long
  With CreateObject(WMI_CLASS)
    .EnumValues RootKey, RegKey, aNames
    For Each regName In aNames
      .GetStringValue RootKey, RegKey, regName, regValue
      ret = regName & vbTab & regValue
      n = n + 1
      ReDim Preserve arr(1 To n)
      arr(n) = ret
      Debug.Print ret
    Next
  End With
  If n Then GetAllNames = arr
End Function
Ví dụ lấy mấy lấy tên các chương trình chạy tự động cùng Windows
Mã:
Sub Test()
  Dim aRes
  aRes = GetAllNames(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Run")
End Sub
Trong Function GetAllNames tôi cho regName nối với regValue thông qua vbTab. Các bạn cũng có thể tách chung riêng ra (chẳng hạn cho nằm trong mảng 2 chiều)
Ẹc... Ẹc... hàng đống thứ có thể chế biến
-------------------
Cũng phải cảm ơn nhà bác học kieu manh khởi tạo chủ đề, mới có cái cho chúng ta nghiên cứu (nếu không sẽ "nhũn não" mất --=0)
 
Upvote 0
Web KT

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

Back
Top Bottom