<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBA: проблема с сохранением значения в ячейку Excel]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=12848&amp;type=atom" />
	<updated>2017-07-26T18:43:06Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=12848</id>
		<entry>
			<title type="html"><![CDATA[Re: VBA: проблема с сохранением значения в ячейку Excel]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=117608#p117608" />
			<content type="html"><![CDATA[<p><strong>Mik</strong> В Excel&#039;e нет.</p>]]></content>
			<author>
				<name><![CDATA[red2881]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30934</uri>
			</author>
			<updated>2017-07-26T18:43:06Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=117608#p117608</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBA: проблема с сохранением значения в ячейку Excel]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=117605#p117605" />
			<content type="html"><![CDATA[<p><strong>red2881</strong><br />Огромное спасибо! <br />Действительно, всё решается указанием текстового формата (через интерфейс Excel или код VBA).<br />Кстати, нашел еще один способ - добавление апострофа в начале (быть может кому-нибудь пригодится):<br /></p><div class="codebox"><pre><code>rResultCell.Value = &quot;&#039;&quot; &amp; CStr(rLine)</code></pre></div><p>Тогда в ячейке информация тоже будет отображаться в текстовом виде причем без апострофа! Но он будет маячить в строке формул...<br /></p><div class="quotebox"><blockquote><p>Общее количество знаков в ячейке не может превышать 32 767 знаков.</p></blockquote></div><p>Как-нибудь можно обойти данное ограничение?</p>]]></content>
			<author>
				<name><![CDATA[Mik]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=33706</uri>
			</author>
			<updated>2017-07-26T16:19:35Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=117605#p117605</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBA: проблема с сохранением значения в ячейку Excel]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=117600#p117600" />
			<content type="html"><![CDATA[<p>Или костыли.</p><div class="codebox"><pre><code>Sub Extract()
    Set rVals = Range(&quot;A1:A1048576&quot;)
    Set rVals = Intersect(rVals, rVals.Parent.UsedRange)
    avVals = rVals.Value
    Excel.Range(&quot;G2&quot;).NumberFormat = &quot;@&quot;
    Set rResultCell = Range(&quot;G2&quot;)
    ReDim avArr(1 To Rows.Count, 1 To 1)
    With New Collection
        On Error Resume Next
        For Each x In avVals
            If Len(CStr(x)) Then
                .Add x, CStr(x)
                If Err = 0 Then
                    li = li + 1
                    avArr(li, 1) = x
                    rLine = rLine &amp; x &amp; &quot;,&quot;
                   
                Else
                    Err.Clear
                End If
            End If
        Next
    End With
    rLine = Left(rLine, Len(rLine) - Len(&quot;,&quot;))
    If li Then rResultCell.Value = CStr(rLine)
    Excel.Range(&quot;G2&quot;).NumberFormat = &quot;General&quot;
End Sub</code></pre></div><p>Для справки.<br />Общее количество знаков в ячейке не может превышать 32 767 знаков.</p>]]></content>
			<author>
				<name><![CDATA[red2881]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30934</uri>
			</author>
			<updated>2017-07-26T07:46:56Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=117600#p117600</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBA: проблема с сохранением значения в ячейку Excel]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=117599#p117599" />
			<content type="html"><![CDATA[<p>Или есть =СцепитьМного(A2:A100;&quot;, &quot;;ИСТИНА)</p><p>автор Дмитрий Щербаков</p><div class="codebox"><pre><code>Option Explicit
&#039;---------------------------------------------------------------------------------------
&#039; Procedure : СцепитьМного
&#039;             http://www.excel-vba.ru
&#039; Purpose   : Функция сцепляет все указанные ячейки в одну с указанным разделителем.
&#039; Аргументы функции:
&#039; Диапазон    — диапазон ячеек, значения которых необходимо объединить в строку.
&#039; Разделитель — необязательный аргумент.
&#039;               Один или несколько символов, которые будут вставлены между каждым словом.
&#039;               По умолчанию пробел.
&#039; БезПовторов — необязательный аргумент.
&#039;               Если указан как ИСТИНА или 1 — в результирующей строке будут значения без дубликатов.
&#039;               Для английской локализации данный параметр указывается как TRUE и FALSE соответственно.
&#039;---------------------------------------------------------------------------------------
Function СцепитьМного(Диапазон As Range, Optional Разделитель As String = &quot; &quot;, Optional БезПовторов As Boolean = False)
    Dim avData, lr As Long, lc As Long, sRes As String
    avData = Диапазон.Value
    If Not IsArray(avData) Then
        СцепитьМного = avData
        Exit Function
    End If
 
    For lc = 1 To UBound(avData, 2)
        For lr = 1 To UBound(avData, 1)
            If Len(avData(lr, lc)) Then
                sRes = sRes &amp; Разделитель &amp; avData(lr, lc)
            End If
        Next lr
    Next lc
    If Len(sRes) Then
        sRes = Mid(sRes, Len(Разделитель) + 1)
    End If
    
    If БезПовторов Then
        Dim oDict As Object, sTmpStr
        Set oDict = CreateObject(&quot;Scripting.Dictionary&quot;)
        sTmpStr = Split(sRes, Разделитель)
        On Error Resume Next
        For lr = LBound(sTmpStr) To UBound(sTmpStr)
            oDict.Add sTmpStr(lr), sTmpStr(lr)
        Next lr
        sRes = &quot;&quot;
        sTmpStr = oDict.keys
        For lr = LBound(sTmpStr) To UBound(sTmpStr)
            sRes = sRes &amp; IIf(sRes &lt;&gt; &quot;&quot;, Разделитель, &quot;&quot;) &amp; sTmpStr(lr)
        Next lr
    End If
    СцепитьМного = sRes
End Function</code></pre></div>]]></content>
			<author>
				<name><![CDATA[red2881]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30934</uri>
			</author>
			<updated>2017-07-26T07:44:34Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=117599#p117599</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBA: проблема с сохранением значения в ячейку Excel]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=117598#p117598" />
			<content type="html"><![CDATA[<p><strong>Mik</strong><br />Попробуй указать текстовый формат ячейки для вывода.</p>]]></content>
			<author>
				<name><![CDATA[red2881]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=30934</uri>
			</author>
			<updated>2017-07-26T07:37:41Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=117598#p117598</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBA: проблема с сохранением значения в ячейку Excel]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=117590#p117590" />
			<content type="html"><![CDATA[<p>Всем доброго вечера!<br />Сначала опишу решаемую задачу. Есть столбец (допустим &quot;А&quot;) на листе Excel с форматом ячеек &quot;общий&quot;. В каждой ячейке есть формула, которая вычисляет нужное значение. Значение по своей сути получается числовым (например, 123456789). <br />Нужно выбирать только не повторяющиеся значения и записывать их в другую ячейку <span class="bbu">через запятую, причем перед первым и после последнего значения запятой быть не должно</span> (<strong>обязательное условие</strong>!).<br />Для решения данной задачи есть макрос, который был взят с простор Интернета и немного видоизменен под конкретную задачу.<br />И всё прекрасно работало до недавнего времени: когда заполненных ячеек в столбце &quot;А&quot; было более тысячи. Но тут возникла задача делать всё тоже самое, только заполненных ячеек около 20...<br />В общем, происходит следующее: в ячейку записывается не перечень уникальных значений через запятую, а, как я понимаю, &quot;длинное целое&quot; (например, 1,23456789123456E+305), причем формат ячейки &quot;общий&quot; при этом изменяется на &quot;числовой&quot;!<br />Уже потратил целую неделю на поиск решения в Интернете, но похоже, что такая проблема только у меня, либо с ней никто не сталкивался... Проверял на Excel 2007 и 2010 - результат одинаковый.<br />Опытным путем выявил следующее: <br />- если значений много (примерно, около 1000) всё работает нормально.<br />- если значение состоит из 9 цифр (99,9% случаев), то корректная работа начинается при заполнении 35 и более строк.<br />- если значение состоит из 2-х цифр, всё работает корректно, но если значение состоит из 3 и более цифр, то начинается проблема.<br />- если последнюю запятую не отсекать или заменить ее например, на &quot;/&quot;, то тоже всё работает корректно (но сделать этого не могу, т.к. перечень значений потом используется для другого отбора в другом ПО, которое воспринимает только запятую в качестве разделителя значений - можно, конечно, &quot;руками&quot; удалять последнюю запятую, но хочется всё же не выполнять лишних действий).<br />Код макроса (если нужно, могу приложить файл Excel):<br /></p><div class="codebox"><pre><code>Sub Extract()
    Set rVals = Range(&quot;A1:A1048576&quot;)
    Set rVals = Intersect(rVals, rVals.Parent.UsedRange)
    avVals = rVals.Value
    Set rResultCell = Range(&quot;G2&quot;)
    ReDim avArr(1 To Rows.Count, 1 To 1)
    With New Collection
        On Error Resume Next
        For Each x In avVals
            If Len(CStr(x)) Then
                .Add x, CStr(x)
                If Err = 0 Then
                    li = li + 1
                    avArr(li, 1) = x
                    rLine = rLine &amp; x &amp; &quot;,&quot;
                Else
                    Err.Clear
                End If
            End If
        Next
    End With
    rLine = Left(rLine, Len(rLine) - Len(&quot;,&quot;))
    If li Then rResultCell.Value = CStr(rLine)
End Sub
</code></pre></div><p>Уже всю голову себе сломал - не пойму в чем проблема (в Excel или у меня в голове)...<br />Прошу помощи знающих людей!</p>]]></content>
			<author>
				<name><![CDATA[Mik]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=33706</uri>
			</author>
			<updated>2017-07-25T18:06:57Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=117590#p117590</id>
		</entry>
</feed>
