Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

[Excel 2013] Ottenere elenco stampanti

  1. #1
    Sgrubak non  in linea Scribacchino
    Buongiorno a tutti!

    con il codice di seguito riportato, cambio la stampante all'attivazione/disattivazione della cartella di lavoro con cui gestisco la stampa delle etichette:

    Option Explicit
    Private Sub Workbook_WindowActivate(ByVal Wn As Window)
    ThisWorkbook.Sheets("Nostre").Range("Stampante").Value = Application.ActivePrinter
    Dim tempo As Single
    tempo = Timer
    Do While Not Application.Ready
    DoEvents
    If Timer >= tempo + 5 Then Exit Do
    Loop
    Application.ActivePrinter = "DYMO LabelWriter 450 su Ne06:"
    End Sub

    Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
    Dim tempo As Single
    tempo = Timer
    If ThisWorkbook.Sheets("Nostre").Range("Stampante").Value <> "" Then
    Do While Not Application.Ready
    DoEvents
    If Timer >= tempo + 5 Then Exit Do
    Loop
    Application.ActivePrinter = ThisWorkbook.Sheets("Nostre").Range("Stampante").Value
    End If
    End Sub

    La fregatura che talvolta mi va in errore quando, all'attivazione della cartella, cerca di impostare ActivePrinter con la stringa "DYMO...". Il tutto nasce dal fatto che cambia la porta su cui trova la stampante: ogni tanto su Ne06: altre volte su Ne07:
    Vorrei poter ottenere un elenco delle stampanti di sistema, scorrere le varie stringhe e impostare ActivePrinter quando trovo la stringa che contiene "DYMO", ma non ho la pi pallida idea di come ottenere questo elenco e Google non mi ha aiutato molto.

    Grazie in anticipo.

  2. #2
    ℹ️ Leggi di pi su AntonioG ...

  3. #3
    Sgrubak non  in linea Scribacchino
    Quote Originariamente inviato da AntonioG Visualizza il messaggio
    Esattamente quel che cerco, ma il mio VBA non conosce l'oggetto Printer (mi da errore di tipo non definito dall'utente), e la mia Application non ha la collection Printers tra le propriet... L'operatore "&;" presente nella macro mi lascia un po' perplesso...

  4. #4
    Con queste

    Application.Dialogs(xlDialogPrinterSetup).Show
    MsgBox (Application.ActivePrinter)
    
    puoi far scegliere
    ℹ️ Leggi di pi su AntonioG ...

  5. #5
    Sgrubak non  in linea Scribacchino
    Grazie Antonio, ma preferisco che il tutto venga svolto senza interventi da parte dell'utente!

    Mi sono quindi armato di santa pazienza e mi sono creato un mini libreria (manca qualsiasi controllo e gestione delle eccezioni, lo so, ma comunque funziona... :-) ), l'ho referenziata in VBA, e l'ho usata cos:

    Private Sub Workbook_WindowActivate(ByVal Wn As Window)
    ThisWorkbook.Sheets("Nostre").Range("Stampante").Value = Application.ActivePrinter
    Dim tempo As Single
    tempo = Timer
    Do While Not Application.Ready
    DoEvents
    If Timer >= tempo + 5 Then Exit Do
    Loop

    Dim ele As New ElencoStampanti
    Application.ActivePrinter = ele.Cercastampante("DYMO")
    End Sub


    di seguito il codice in C# della libreria:

    using Microsoft.Win32;
    using System;
    using System.Text.RegularExpressions;

    namespace Stampanti
    {
    public class ElencoStampanti
    {
    public ElencoStampanti() { }
    public string[] Elenco()
    {
    var stampanti = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion\Devices");
    string[] arr = new string[stampanti.ValueCount];
    int i = 0;
    foreach (string nome in stampanti.GetValueNames())
    {
    string valore = (string)stampanti.GetValue(nome);
    string porta = Regex.Match(valore, @"(Ne\d+:)", RegexOptions.IgnoreCase).Value;
    arr[i] = nome + " su " + porta;
    i++;
    }
    return arr;
    }
    public string CercaStampante(string valore)
    {
    return Elenco()[Array.FindIndex(Elenco(), x => x.Contains(valore))];
    }
    }
    }


    Adesso pu cambiarsi la porta a piacimento che tanto l'ho fregato.
    P.S. Essendo la stampate USB, pu aver cambiato la porta dopo che l'ho scollegata/ricollegata?

    P.P.S: Se dovesse essere utile, posso mettere a disposizione il file TLB compilato.

  6. #6
    L'avatar di Zer0Kelvin
    Zer0Kelvin non  in linea Scolaretto
    Ciao.
    E' possibile anche utilizzare un oggetto Wscript per ottenere l'elenco delle stampanti
    Function GetPrinters() As String()
    Dim i
    Dim wshNetwork As Object, oPrinters As Object, temp As String
    ReDim result(100) As String
        ' Get the network object
        Set wshNetwork = CreateObject("WScript.Network")
        Set oPrinters = wshNetwork.EnumPrinterConnections
        ' Printers collection has two elements for each printer.
        For i = 0 To oPrinters.Count - 1 Step 2
            ' Get what Excel sees.
            result(i \ 2) = oPrinters.Item(i + 1) & " su " & oPrinters.Item(i)
        Next
        ReDim Preserve result((i \ 2))
        GetPrinters = result
    End Function
    
    Sub test()
    Dim Printers() As String
    Dim R As Long
        Printers = GetPrinters
        With Foglio3
            For R = LBound(Printers) To UBound(Printers)
                .Cells(R + 1, 1) = Printers(R)
            Next R
        End With
    End Sub
    
    Si tratta di un codice trovato in rete tempo fa. Funziona sulla versione Italiana; nella versione inglese l'istruzione
    result(i \ 2) = oPrinters.Item(i + 1) & " su " & oPrinters.Item(i)
    
    va modificata in
    result(i \ 2) = oPrinters.Item(i + 1) & " on " & oPrinters.Item(i)
    
    Ultima modifica di Zer0Kelvin; 13-05-2018 11:01 
    ℹ️ Leggi di pi su Zer0Kelvin ...

  7. #7
    Sgrubak non  in linea Scribacchino
    Quote Originariamente inviato da Zer0Kelvin Visualizza il messaggio
    Ciao.
    E' possibile anche utilizzare un oggetto Wscript per ottenere l'elenco delle stampanti
    Function GetPrinters() As String()
    Dim i
    Dim wshNetwork As Object, oPrinters As Object, temp As String
    ReDim result(100) As String
        ' Get the network object
        Set wshNetwork = CreateObject("WScript.Network")
        Set oPrinters = wshNetwork.EnumPrinterConnections
        ' Printers collection has two elements for each printer.
        For i = 0 To oPrinters.Count - 1 Step 2
            ' Get what Excel sees.
            result(i \ 2) = oPrinters.Item(i + 1) & " su " & oPrinters.Item(i)
        Next
        ReDim Preserve result((i \ 2))
        GetPrinters = result
    End Function
    
    Sub test()
    Dim Printers() As String
    Dim R As Long
        Printers = GetPrinters
        With Foglio3
            For R = LBound(Printers) To UBound(Printers)
                .Cells(R + 1, 1) = Printers(R)
            Next R
        End With
    End Sub
    
    Si tratta di un codice trovato in rete tempo fa. Funziona sulla versione Italiana; nella versione inglese l'istruzione
    result(i \ 2) = oPrinters.Item(i + 1) & " su " & oPrinters.Item(i)
    
    va modificata in
    result(i \ 2) = oPrinters.Item(i + 1) & " on " & oPrinters.Item(i)
    
    Molto meno macchinosa della mia! Grazie mille Zer0Kelivin.

  8. #8
    Samu2006 non  in linea Novello
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Grazie Antonio, ma preferisco che il tutto venga svolto senza interventi da parte dell'utente!

    Mi sono quindi armato di santa pazienza e mi sono creato un mini libreria (manca qualsiasi controllo e gestione delle eccezioni, lo so, ma comunque funziona... :-) ), l'ho referenziata in VBA, e l'ho usata cos:

    Adesso pu cambiarsi la porta a piacimento che tanto l'ho fregato.
    P.S. Essendo la stampate USB, pu aver cambiato la porta dopo che l'ho scollegata/ricollegata?

    P.P.S: Se dovesse essere utile, posso mettere a disposizione il file TLB compilato.

    Ti posso chiedere cortesemente qualche suggerimento per collegare/referenziare delle classi in C per utilizzarle in VBA

    Se volessi utilizzare la tua come la dovrei compilare ?


    Grazie

  9. #9
    Sgrubak non  in linea Scribacchino
    Quote Originariamente inviato da Samu2006 Visualizza il messaggio
    Ti posso chiedere cortesemente qualche suggerimento per collegare/referenziare delle classi in C per utilizzarle in VBA
    Puoi seguire questa guida.

    Il codice pubblicato nel mio post #5.
    Ultima modifica di Sgrubak; 22-02-2021 17:13  Motivo: Corretto link alla guida

  10. #10
    Samu2006 non  in linea Novello
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    Puoi seguire questa guida.
    il collegamento errato

    grazie per la risposta

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Aprire un file excel 2013 con comando access 2013
    Da MikeEvsp nel forum Microsoft Access
    Risposte: 6
    Ultimo Post: 03-07-2015, 08:41
  2. [EXCEL 2013] problema con macro
    Da Azalyn nel forum Microsoft Excel
    Risposte: 1
    Ultimo Post: 20-06-2015, 14:43
  3. Da elenco a tendina ottenere testo
    Da psychocircus nel forum Microsoft Excel
    Risposte: 2
    Ultimo Post: 17-11-2013, 22:53
  4. Elenco stampanti online
    Da musiclover85 nel forum Visual Basic .Net
    Risposte: 1
    Ultimo Post: 07-02-2011, 16:35
  5. Windows XP: Ottenere elenco dei login
    Da sal21 nel forum Microsoft Windows
    Risposte: 5
    Ultimo Post: 29-01-2011, 11:18