<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS:Копирование данных из таблицы для создания и использования массива]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=10328</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10328&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS:Копирование данных из таблицы для создания и использования массива».]]></description>
		<lastBuildDate>Sat, 24 Jan 2015 11:06:36 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS:Копирование данных из таблицы для создания и использования массива]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=90925#p90925</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Я бы просто использовал библиотеку AutoItX3.dll.</p></blockquote></div><p>Пока невозможно, т.к. нет прав администратора.</p><div class="quotebox"><blockquote><p>Непонятно, зачем нужен массив, промежуточная таблица, буфер обмена</p></blockquote></div><br /><p>Все очень просто. Имеются большое количество данных в окне некой программы (исходная таблица в первом посте), которые не имеет смысла вводить через диалоговые окна. Проще выделить их в окне указанной программы, затем скопировать в буфер обмена и передать в vbs script, где и предлагается их обработать, посредством создания массива данных.</p><div class="quotebox"><blockquote><p>Также непонятно это:<br />Для выхода из цикла ввода данных, в буфер обмена копируется любое не семизначное число из таблицы.</p></blockquote></div><br /><p>Для выхода из цикла ввода данных. Т.е. сначала запускается скрипт. Цикл ожидает копирование данных в буфер обмена.<br />Копируем данные в буфер обмена. После этого необходимо &quot;сообщить&quot; скрипту, что ввод данных завершен. Для этого копируем в буфер обмена любое НЕ семизначное число из окна указанной программы(семизначное число - это данные для работы скрипта). Ничего оригинальнее не придумал, но так работал старый скрипт ( без массива ). </p><p>P.S. аlexii. Благодарю Вас. Обязательно составлю письмо с пояснениями.</p>]]></description>
			<author><![CDATA[null@example.com (lammv)]]></author>
			<pubDate>Sat, 24 Jan 2015 11:06:36 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=90925#p90925</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS:Копирование данных из таблицы для создания и использования массива]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=90922#p90922</link>
			<description><![CDATA[<p>Перечитал первый пост. Непонятно, зачем нужен массив, промежуточная таблица, буфер обмена. Также непонятно это:<br /></p><div class="quotebox"><blockquote><p>Для выхода из цикла ввода данных, в буфер обмена копируется любое не семизначное число из таблицы.</p></blockquote></div><p>Я бы просто использовал <a href="http://www.script-coding.com/AutiItX.html">библиотеку AutoItX3.dll</a>.</p><p>P.S. <strong>lammv</strong>, по поводу поста в личку: предлагаю Вам изложить подробности в письме.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sat, 24 Jan 2015 05:19:34 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=90922#p90922</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS:Копирование данных из таблицы для создания и использования массива]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=90919#p90919</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>1. Как выполнить ту же задачу, но не из файла file.xlsx, а прямо из буфера обмена. Т.е. предполагается, что таблица данных находится уже в буфере обмена, а не в указанном файле эксель.</p></blockquote></div><p>Никак. С буфером обмена можно работать только как с буфером обмена. И только. Посему — открыть Excel, добавить Рабочую книгу, вставить содержимое буфера обмена на Рабочий лист. Далее — по написанному.</p><div class="quotebox"><blockquote><p>2. Путаюсь в синтаксисе. Как вывести сообщением весь массив с помощью MsgBox, а не только его отдельные элементы: &quot;wscript.echo array1(2,7)&quot;</p></blockquote></div><p>Сформировать строку. Например:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>Option Explicit

Dim arrSomeValues(2, 3)
Dim i, j

Dim strLine


&#039; Произвольно заполняем массив
Randomize Timer

For i = LBound(arrSomeValues, 1) To UBound(arrSomeValues, 1)
    For j = LBound(arrSomeValues, 2) To UBound(arrSomeValues, 2)
        arrSomeValues(i, j) = Int(100 * Rnd)
    Next
Next

&#039; Формируем строку
strLine = &quot;&quot;

strLine = strLine &amp; vbTab &amp; &quot;|&quot;

For j = LBound(arrSomeValues, 2) To UBound(arrSomeValues, 2)
    strLine = strLine &amp; vbTab &amp; CStr(j)
Next

strLine = strLine &amp; vbLf &amp; String(8 * (UBound(arrSomeValues, 2) + 2), &quot;=&quot;) &amp; vbLf

For i = LBound(arrSomeValues, 1) To UBound(arrSomeValues, 1)
    strLine = strLine &amp; CStr(i) &amp; vbTab &amp; &quot;|&quot;
    
    For j = LBound(arrSomeValues, 2) To UBound(arrSomeValues, 2)
        strLine = strLine &amp; vbTab &amp; arrSomeValues(i, j)
    Next
    
    strLine = strLine &amp; vbLf
Next

MsgBox strLine

WScript.Quit 0
</code></pre></div></div></div><p>Но проще работать под консольным «cscript.exe» и просто делать вывод в консоль в виде:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>Option Explicit

Dim arrSomeValues(2, 3)
Dim i, j


&#039; Произвольно заполняем массив
Randomize Timer

For i = LBound(arrSomeValues, 1) To UBound(arrSomeValues, 1)
    For j = LBound(arrSomeValues, 2) To UBound(arrSomeValues, 2)
        arrSomeValues(i, j) = Int(100 * Rnd)
    Next
Next

&#039; Формируем строку
For j = LBound(arrSomeValues, 2) To UBound(arrSomeValues, 2)
    WScript.StdOut.Write vbTab &amp; CStr(j)
Next

WScript.StdOut.WriteLine
WScript.StdOut.WriteLine String(8 * (UBound(arrSomeValues, 2) + 2), &quot;=&quot;)

For i = LBound(arrSomeValues, 1) To UBound(arrSomeValues, 1)
    WScript.StdOut.Write CStr(i) &amp; vbTab &amp; &quot;|&quot;
    
    For j = LBound(arrSomeValues, 2) To UBound(arrSomeValues, 2)
        WScript.StdOut.Write vbTab &amp; arrSomeValues(i, j)
    Next
    
    WScript.StdOut.WriteLine
Next

WScript.Quit 0
</code></pre></div></div></div>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 23 Jan 2015 21:09:57 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=90919#p90919</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS:Копирование данных из таблицы для создания и использования массива]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=90915#p90915</link>
			<description><![CDATA[<p>Решение созрело:</p><div class="codebox"><pre><code>
Set objExcel = CreateObject(&quot;Excel.Application&quot;)
Set objWorkbook = objExcel.Workbooks.Open _
    (&quot;d:\1\file.xlsx&quot;)

&#039; i - row
&#039; j - column
i = 1
Dim array1(99,7), i,j
Do Until objExcel.Cells(i,1).Value = &quot;&quot;
 For j = 1 To 7
        If IsNull( objExcel.Cells(i, j).Value ) Then
   array1( i, j ) = &quot;&quot;
        Else
            array1( i, j ) = objExcel.Cells(i, j).Value
        End If
 Next
    i = i + 1
Loop
objExcel.Quit
&#039;  Output of an array&#039;s element 
wscript.echo array1(2,7)
</code></pre></div><br /><p>1. Как выполнить ту же задачу, но не из файла file.xlsx, а прямо из буфера обмена. Т.е. предполагается, что таблица данных находится уже в буфере обмена, а не в указанном файле эксель.</p><p>2. Путаюсь в синтаксисе. Как вывести сообщением весь массив с помощью MsgBox, а не только его отдельные элементы: &quot;wscript.echo array1(2,7)&quot;</p>]]></description>
			<author><![CDATA[null@example.com (lammv)]]></author>
			<pubDate>Fri, 23 Jan 2015 19:13:57 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=90915#p90915</guid>
		</item>
		<item>
			<title><![CDATA[VBS:Копирование данных из таблицы для создания и использования массива]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=90364#p90364</link>
			<description><![CDATA[<p>Есть таблица данных из 10 столбцов и N строк. В данном случае 11 строк.&nbsp; </p><div class="codebox"><pre><code>
1    3345632           261    4315875    1    æåâ     3400    àìòã            UPH28
2    3345632           261    4536033    1    éç&#039;     3400    àìòã             UPH28
1    3345639  2400    311     52365      2    éç&#039;     3400    ãîéèøé          UPH28
2    3345639  2400    311     56754      2    éç&#039;     3400    ãîéèøé          UPH28
3    3345639  2400    311     3363801    2    éç&#039;     3400    ãîéèøé          UPH28
4    3345639  2400    311     4315875    1    æåâ     3400    ãîéèøé          UPH28
1    3345742           261    3061264    1    éç&#039;      3400    àìëñ            UPH28
2    3345742           261    3276995    7    ì&#039;        3400    àìëñ           UPH28
3    3345742           261    4315875    1    æåâ      3400    àìëñ            UPH28
4    3345742           261    5002031    1    éç&#039;      3400     àìëñ            UPH28
5    3345742           261    5002033    1    éç&#039;      3400     àìëñ            UPH28
</code></pre></div><p>Задача:<br />Создать массив по указанной таблице данных.<br />Необходимо внести в массив не всю таблицу, а только следующие столбцы: <br />1,2,3,4,5,6,8&nbsp; (слева направо)</p><p>Пояснения:<br />VBScript.<br />Windows 7 - нет прав администратора. Word 2010, Excel 2010.<br />Буквенные столбцы не отображаются корректно (Unicode) и значения не имеют.<br />Предположим, что количество строк в таблице может быть не более 99.<br />Обратите внимание, что данная таблица содержит 3 подтаблицы (видно по первому и второму столбцам). Т.е. в данном случае в скрипте будет использоваться 3 цикла (что также должно быть отражено в массиве данных)<br />Цель скрипта автоматизировать работу некой Главной Программы, методом иммитации нажатия клавиш и подстановки данных из указанной таблицы.</p><p>Скрипт должен запускаться следующим образом:<br />1. В Эксель выделяются необходимые строки.<br />2. &quot;Горячими&quot; клавишами запускается скрипт, который производит иммитацию нажатия клавиш CTRL+C и копирует всю таблицу в буфер обмена.</p><p>Далее, либо прямо из буфера обмена, либо скопировав всю таблицу во временный файл, необходимо определить массив с указанными выше столбцами.</p><p>Следует сказать, что скрипт без использования массива уже написан. Ввод данных в нем производится последовательным копираванием элементов второго столбца. В данном случае: первого, третьего и седьмого элементов (3345632, 3345639 3345742). Для выхода из цикла ввода данных, в буфер обмена копируется любое не семизначное число из таблицы.<br />Массив arr4() пока не используется. <br />Недостатком написанного скрипта является минимальное количество необходимых данных.</p><br /><div class="codebox"><pre><code>
Option Explicit

Dim WshShell, oRegExp, sLine, LastLine, WshExec, Number, n7, n4
Dim arr7(): redim arr7(0)
Dim arr4(): redim arr4(0)

&#039; creating link to an object
Set WshShell = WScript.CreateObject(&quot;WScript.Shell&quot;)

&#039; Use a regular expression
set oRegExp = CreateObject(&quot;VBScript.RegExp&quot;)
oRegExp.IgnoreCase = True

n4 = -1
n7 = -1

&#039; Clear Clipboard
CopyToClipBoard &quot;&quot;
LastLine = &quot;&quot;

&#039; Cycle 
Do
    sLine = GetFromClipBoard()
    if (sLine &lt;&gt; LastLine) and (not isMatchInArray(sLine, arr7)) then
        if TestPattern (sLine, &quot;^[0-9]{4,4}$&quot;) then
            n4 = n4 + 1
            redim preserve arr4(n4)
            arr4(n4) = sLine
        elseif TestPattern (sLine, &quot;^[0-9]{7,7}$&quot;) 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 &quot;MainProgram.exe&quot;, 1
WScript.Sleep 6500

for i = 1 to 2 : WshShell.SendKeys &quot;%+&quot;         : Next : WScript.Sleep 100

For each Number in arr7
    CopyToClipBoard Number
    WScript.Sleep 100

Dim i, a, q


&#039;==========
&#039;Program&#039;s body
&#039;==========


Next

Dim s, oShell
for each Number in arr7      
s = s &amp; Number &amp; vbCrLf  
next

set oShell = WScript.CreateObject (&quot;WScript.Shell&quot;)

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(&quot;WScript.Shell&quot;)
    Dim mshta: mshta = oShell.ExpandEnvironmentStrings(&quot;%windir%&quot;) &amp; &quot;\system32\mshta.exe&quot;
    oShell.Run mshta &amp; &quot; &quot;&quot;vbscript:document.parentwindow.clipboardData.SetData(&quot;&quot;text&quot;&quot;,replace(&quot;&quot;&quot; &amp; replace(Data,&quot; &quot;,&quot;$#@!~%&quot;) &amp; &quot;&quot;&quot;,&quot;&quot;$#@!~%&quot;&quot;,chr(32)))&amp;close()&quot;&quot;&quot;,2,true
End Sub

&#039; 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(&quot;htmlfile&quot;).ParentWindow.ClipboardData.GetData(&quot;text&quot;)
End Function    
</code></pre></div><br /><br /><p>Искренне благодарю всех за помощь.</p>]]></description>
			<author><![CDATA[null@example.com (lammv)]]></author>
			<pubDate>Mon, 12 Jan 2015 19:36:52 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=90364#p90364</guid>
		</item>
	</channel>
</rss>
