Quero ler uma planilha Excel e exibir o conteúdo com vbscript. Também quero que o usuário possa escolher o diretório de origem, daí a adição de hta furteron. O provedor ACE OLEDB deve ser usado (por favor, não pergunte, eu sei que isso é o fim da vida útil e não é sustentável, etc., mas não posso mudar isso agora), então instalei o Microsoft Access Database Engine 2016 Redistributable (accessdatabaseengine_X64.exe ) aqui: https://www.microsoft.com/en-us/download/details.aspx?id=54920 . Além disso, tenho o Microsoft 365 Apps for Enterprise instalado (x64) em meu laptop com Windows 11. Criei um arquivo Excel com 1 planilha, 2 colunas e algumas linhas de conteúdo como este:
e nomeou o bloco destacado como 'namenblok' e salvou o arquivo como test.xlsx . Em seguida, criei um arquivo chamado test.vbs no mesmo diretório com este conteúdo:
Option Explicit
Dim fso : set fso = CreateObject("Scripting.FileSystemObject")
Dim g_sCfg : g_sCfg = fso.GetFolder(fso.GetAbsolutePathName(".")) & "\" & "test.xlsx"
Dim connectString : connectString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & g_sCfg & ";Extended Properties=""Excel 12.0;HDR=Yes;"";"
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adUseClient = 3
Dim objConnection, objRecordset
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordset = CreateObject("ADODB.Recordset")
objConnection.Open connectString
' wscript.sleep 1000
objRecordset.CursorLocation = adUseClient
On Error Resume Next
objRecordset.Open "SELECT * FROM namenblok" , objConnection, adOpenStatic, adLockOptimistic ' namenblok is een op naam gedefinieerde blok aan cellen
If Err.Number <> 0 Then
'error handling:
WScript.Echo Err.Number & " Srce: " & Err.Source & " Desc: " & Err.Description
Err.Clear
End If
Do While Not(objRecordset.EOF)
wscript.echo objRecordset("id") & " " & objRecordset("naam")
objRecordset.MoveNext
Loop
objRecordset.Close
objConnection.Close
Quando executo isso (por exemplo, clique duas vezes nele), ele exibe todas as linhas da planilha do Excel, uma por uma, assim:
Mas quando alterado para um .hta (aplicativo html) e adicionando apenas as partes do script assim:
<script language="VBScript">
Option Explicit
…
…
objConnection.Close
</script>
diz quando executado: "O provedor não pode ser encontrado. Ele pode não estar instalado corretamente." e aponta para a linha 15 com: objConnection.Open connectString:
Provavelmente terei que ajustar a parte html devido às alterações nas restrições de html, mas não consigo descobrir como e o que exatamente. Qualquer ajuda seria apreciada!
O erro está ocorrendo porque o HTA está sendo executado no modo de 32 bits, enquanto o script VBS independente está sendo executado no modo de 64 bits.
Os scripts HTA são executados no modo de 32 bits por padrão. Os scripts VBS são executados no modo de 64 bits por padrão.
Se você abrir um
Cmd
prompt e executar o HTA no modo de 64 bits executandomshta.exe
a partir do System32 e fornecendo o caminho completo para o seu HTA na linha de comando, seu HTA será executado corretamente.Por exemplo:
Observação : por padrão,
C:\Windows\System32
está no caminho de pesquisa, portanto, inserirmshta
normalmente funcionará bem, mas para garantir que você esteja executando a versão de 64 bits, independentemente das configurações do caminho, especifique o caminho completo deC:\Windows\System32\mshta.exe
.Nota : O código VBSCript postado na pergunta usa
WScript.Echo
. Isso deve ser alterado paraMsgBox
para funcionar a partir de um HTA porque o host émshta.exe
em vez dewscript.exe
oucscript.exe
.Nota : O código VBSCript postado na pergunta requer que a pasta atual seja a pasta do script (assumindo que o arquivo XLSX esteja na mesma pasta do script). Caso contrário, o script irá parar com o erro:
The Microsoft Access database engine cannot open or write to the file
. Para garantir que a pasta atual seja a pasta do script, o código a seguir pode ser adicionado ao topo do script VBS no arquivo HTA:Se o arquivo XLSX estiver em uma pasta diferente do script, você definirá explicitamente essa pasta como a pasta atual, assim: