Тема: VBS:Копирование данных из таблицы для создания и использования массива
Есть таблица данных из 10 столбцов и N строк. В данном случае 11 строк.
1 3345632 261 4315875 1 æåâ 3400 àìòã UPH28
2 3345632 261 4536033 1 éç' 3400 àìòã UPH28
1 3345639 2400 311 52365 2 éç' 3400 ãîéèøé UPH28
2 3345639 2400 311 56754 2 éç' 3400 ãîéèøé UPH28
3 3345639 2400 311 3363801 2 éç' 3400 ãîéèøé UPH28
4 3345639 2400 311 4315875 1 æåâ 3400 ãîéèøé UPH28
1 3345742 261 3061264 1 éç' 3400 àìëñ UPH28
2 3345742 261 3276995 7 ì' 3400 àìëñ UPH28
3 3345742 261 4315875 1 æåâ 3400 àìëñ UPH28
4 3345742 261 5002031 1 éç' 3400 àìëñ UPH28
5 3345742 261 5002033 1 éç' 3400 àìëñ UPH28
Задача:
Создать массив по указанной таблице данных.
Необходимо внести в массив не всю таблицу, а только следующие столбцы:
1,2,3,4,5,6,8 (слева направо)
Пояснения:
VBScript.
Windows 7 - нет прав администратора. Word 2010, Excel 2010.
Буквенные столбцы не отображаются корректно (Unicode) и значения не имеют.
Предположим, что количество строк в таблице может быть не более 99.
Обратите внимание, что данная таблица содержит 3 подтаблицы (видно по первому и второму столбцам). Т.е. в данном случае в скрипте будет использоваться 3 цикла (что также должно быть отражено в массиве данных)
Цель скрипта автоматизировать работу некой Главной Программы, методом иммитации нажатия клавиш и подстановки данных из указанной таблицы.
Скрипт должен запускаться следующим образом:
1. В Эксель выделяются необходимые строки.
2. "Горячими" клавишами запускается скрипт, который производит иммитацию нажатия клавиш CTRL+C и копирует всю таблицу в буфер обмена.
Далее, либо прямо из буфера обмена, либо скопировав всю таблицу во временный файл, необходимо определить массив с указанными выше столбцами.
Следует сказать, что скрипт без использования массива уже написан. Ввод данных в нем производится последовательным копираванием элементов второго столбца. В данном случае: первого, третьего и седьмого элементов (3345632, 3345639 3345742). Для выхода из цикла ввода данных, в буфер обмена копируется любое не семизначное число из таблицы.
Массив arr4() пока не используется.
Недостатком написанного скрипта является минимальное количество необходимых данных.
Option Explicit
Dim WshShell, oRegExp, sLine, LastLine, WshExec, Number, n7, n4
Dim arr7(): redim arr7(0)
Dim arr4(): redim arr4(0)
' creating link to an object
Set WshShell = WScript.CreateObject("WScript.Shell")
' Use a regular expression
set oRegExp = CreateObject("VBScript.RegExp")
oRegExp.IgnoreCase = True
n4 = -1
n7 = -1
' Clear Clipboard
CopyToClipBoard ""
LastLine = ""
' Cycle
Do
sLine = GetFromClipBoard()
if (sLine <> LastLine) and (not isMatchInArray(sLine, arr7)) then
if TestPattern (sLine, "^[0-9]{4,4}$") then
n4 = n4 + 1
redim preserve arr4(n4)
arr4(n4) = sLine
elseif TestPattern (sLine, "^[0-9]{7,7}$") then
n7 = n7 + 1
redim preserve arr7(n7)
arr7(n7) = sLine
else
Exit Do
end if
LastLine = sLine
End if
WScript.Sleep 800
Loop
WshShell.Run "MainProgram.exe", 1
WScript.Sleep 6500
for i = 1 to 2 : WshShell.SendKeys "%+" : Next : WScript.Sleep 100
For each Number in arr7
CopyToClipBoard Number
WScript.Sleep 100
Dim i, a, q
'==========
'Program's body
'==========
Next
Dim s, oShell
for each Number in arr7
s = s & Number & vbCrLf
next
set oShell = WScript.CreateObject ("WScript.Shell")
oShell.Popup s, 6000
Function isMatchInArray(exNumber, arr)
isMatchInArray = false
For each Number in arr
if exNumber = Number then isMatchInArray = true: exit For
Next
End Function
Sub CopyToClipBoard(Data)
Dim oShell: set oShell = CreateObject("WScript.Shell")
Dim mshta: mshta = oShell.ExpandEnvironmentStrings("%windir%") & "\system32\mshta.exe"
oShell.Run mshta & " ""vbscript:document.parentwindow.clipboardData.SetData(""text"",replace(""" & replace(Data," ","$#@!~%") & """,""$#@!~%"",chr(32)))&close()""",2,true
End Sub
' Checking the variable for matching a regular expression
Function TestPattern(Variable, Pattern)
oRegExp.Pattern = Pattern
TestPattern = CBool(oRegExp.Test(Variable))
End Function
Function GetFromClipBoard()
GetFromClipBoard = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")
End Function
Искренне благодарю всех за помощь.

