Уважаемые форумчане! На дружеском сайте решение по проблеме не найдено, поэтому дублирую здесь ссылку на тему. Если кто сможет найти решение по данной проблеме буду благодарен. http://www.planetaexcel.ru/forum....shirine
Проблема в следующем: при использовании макроса [vba]
Код
Sub WrapDown() Dim c As Range, myRa As Range Dim s As String Dim arr As Variant Dim i As Integer Dim d As Variant Application.ScreenUpdating = False
Set myRa = Selection myC = myRa.Column myE = myRa.Row - 1 myR = myRa.Row myEC = myC + 1 Columns(myEC).EntireColumn.Clear For Each r In myRa.Rows myE = myE + 1 d = Cells(r.Row, myC).ColumnWidth * 1.05 'ширина первоначальной ячейки (несколько увеличена) arr = Split(Cells(r.Row, myC), " ") s = "" For i = 0 To UBound(arr) s = s & arr(i) & " "
Cells(myE, myEC) = s
Cells(myE, myEC).EntireColumn.AutoFit
If Cells(myE, myEC).ColumnWidth > d Then Cells(myE, myEC).ColumnWidth = d Cells(myE, myEC).Value = Left(s, Len(s) - (Len(arr(i)) + 1)) 'без последнего слова i = i - 1 'т.к. слово выкинули
'---- переход в другую ячейку ---- myE = myE + 1 s = "" End If Next i Next myRa.Delete Shift:=xlUp Range(Cells(myR, myEC), Cells(myE, myEC)).Copy Cells(myR, myC).Insert Shift:=xlDown Columns(myEC).EntireColumn.Clear Application.ScreenUpdating = True End Sub
[/vba] ячейки разбиваются только для отдельного столбца, поэтому если в соседних столбцах есть какие-либо заполненные ячейки, они остаются на том же самом месте и целостность таблицы нарушается. Нужно оптимизировать этот код так, чтобы строки переносились целиком, а не только для отдельного столбца. Или найти какой-то другой способ решения данной проблемы. [moder]Коды надо оформлять спецтегами (кнопка #), а не прятать под спойлер[/moder]
Уважаемые форумчане! На дружеском сайте решение по проблеме не найдено, поэтому дублирую здесь ссылку на тему. Если кто сможет найти решение по данной проблеме буду благодарен. http://www.planetaexcel.ru/forum....shirine
Проблема в следующем: при использовании макроса [vba]
Код
Sub WrapDown() Dim c As Range, myRa As Range Dim s As String Dim arr As Variant Dim i As Integer Dim d As Variant Application.ScreenUpdating = False
Set myRa = Selection myC = myRa.Column myE = myRa.Row - 1 myR = myRa.Row myEC = myC + 1 Columns(myEC).EntireColumn.Clear For Each r In myRa.Rows myE = myE + 1 d = Cells(r.Row, myC).ColumnWidth * 1.05 'ширина первоначальной ячейки (несколько увеличена) arr = Split(Cells(r.Row, myC), " ") s = "" For i = 0 To UBound(arr) s = s & arr(i) & " "
Cells(myE, myEC) = s
Cells(myE, myEC).EntireColumn.AutoFit
If Cells(myE, myEC).ColumnWidth > d Then Cells(myE, myEC).ColumnWidth = d Cells(myE, myEC).Value = Left(s, Len(s) - (Len(arr(i)) + 1)) 'без последнего слова i = i - 1 'т.к. слово выкинули
'---- переход в другую ячейку ---- myE = myE + 1 s = "" End If Next i Next myRa.Delete Shift:=xlUp Range(Cells(myR, myEC), Cells(myE, myEC)).Copy Cells(myR, myC).Insert Shift:=xlDown Columns(myEC).EntireColumn.Clear Application.ScreenUpdating = True End Sub
[/vba] ячейки разбиваются только для отдельного столбца, поэтому если в соседних столбцах есть какие-либо заполненные ячейки, они остаются на том же самом месте и целостность таблицы нарушается. Нужно оптимизировать этот код так, чтобы строки переносились целиком, а не только для отдельного столбца. Или найти какой-то другой способ решения данной проблемы. [moder]Коды надо оформлять спецтегами (кнопка #), а не прятать под спойлер[/moder]dyhes
Здравствуйте!Схожую проблему недавно решали тыц http://www.excelworld.ru/forum/2-22545-1 Там переносили по 55 символов, но думаю разберётесь как переносить на сколько надо.
dima_dan2012, спасибо, но вариант с определенным количеством символов не подходит. Хотелось бы допились существующий код, где уже переноситься по ширине ячейки
dima_dan2012, спасибо, но вариант с определенным количеством символов не подходит. Хотелось бы допились существующий код, где уже переноситься по ширине ячейкиdyhes
Попробуйте такой вариант - меняете ширину в итоговой таблице(страница 2) под неё будет подстраиваться перенос .Ячейки должны отформатированы без переноса по словам. [vba]
Код
Sub WrapDown_full() Dim c As Range, myRa As Range Dim s As String Dim arr As Variant Dim arr1 As Variant Dim i As Integer Dim d As Variant Application.ScreenUpdating = False iRow = Sheets(1).Columns("A").CurrentRegion.Rows.Count iCol = Sheets(1).Rows(1).CurrentRegion.Columns.Count yGlobal = 2 yMem = 2 Set this_1 = ThisWorkbook.Sheets(1) Set this_2 = ThisWorkbook.Sheets(2) Set MEM = ThisWorkbook.Sheets(2).Cells(1, 655) this_2.[A1].CurrentRegion.Offset(1).ClearContents ReDim arr1(iCol - 1) 'ìàññèâ øèðèí ñòîëáöîâ For i = 0 To UBound(arr1) arr1(i) = this_2.Cells(1, i + 1).ColumnWidth Next i For x = 2 To iRow yLocal = yGlobal For Z = 1 To iCol ' .Range("c" & y).Value = r.Offset(, 1) yLocal = yGlobal arr = Split(this_1.Cells(x, Z), " ") s = "" For i = 0 To UBound(arr) s = s & arr(i) & " " this_2.Cells(1, 655) = s this_2.Cells(1, 655).EntireColumn.AutoFit 'On Error GoTo ad: If this_2.Cells(1, 655).ColumnWidth > arr1(Z - 1) Then If Len(s) <> Len(arr(i)) + 1 Then this_2.Cells(1, 655) = Left(s, Len(s) - Len(arr(i)) - 1) 'áåç ïîñëåäíåãî ñëîâà this_2.Cells(yLocal, Z) = this_2.Cells(1, 655)
s = "" yLocal = yLocal + 1 i = i - 1 Else arr1(Z - 1) = this_2.Cells(1, 655).ColumnWidth this_2.Cells(yLocal, Z) = Left(s, Len(this_2.Cells(1, 655)) - 1) s = "" yLocal = yLocal + 1 End If End If If this_2.Cells(1, 655).ColumnWidth < arr1(Z - 1) And i = UBound(arr) Then this_2.Cells(yLocal, Z) = this_2.Cells(1, 655) yLocal = yLocal + 1 Exit For ElseIf this_2.Cells(1, 655).ColumnWidth > arr1(Z - 1) And i = UBound(arr) Then arr1(Z - 1) = this_2.Cells(1, 655).ColumnWidth this_2.Cells(yLocal, Z) = this_2.Cells(1, 655) yLocal = yLocal + 1 Exit For End If ad: Next i If yLocal > yMem Then yMem = yLocal End If Next Z yGlobal = yMem Next x Application.ScreenUpdating = True End Sub
[/vba]
Попробуйте такой вариант - меняете ширину в итоговой таблице(страница 2) под неё будет подстраиваться перенос .Ячейки должны отформатированы без переноса по словам. [vba]
Код
Sub WrapDown_full() Dim c As Range, myRa As Range Dim s As String Dim arr As Variant Dim arr1 As Variant Dim i As Integer Dim d As Variant Application.ScreenUpdating = False iRow = Sheets(1).Columns("A").CurrentRegion.Rows.Count iCol = Sheets(1).Rows(1).CurrentRegion.Columns.Count yGlobal = 2 yMem = 2 Set this_1 = ThisWorkbook.Sheets(1) Set this_2 = ThisWorkbook.Sheets(2) Set MEM = ThisWorkbook.Sheets(2).Cells(1, 655) this_2.[A1].CurrentRegion.Offset(1).ClearContents ReDim arr1(iCol - 1) 'ìàññèâ øèðèí ñòîëáöîâ For i = 0 To UBound(arr1) arr1(i) = this_2.Cells(1, i + 1).ColumnWidth Next i For x = 2 To iRow yLocal = yGlobal For Z = 1 To iCol ' .Range("c" & y).Value = r.Offset(, 1) yLocal = yGlobal arr = Split(this_1.Cells(x, Z), " ") s = "" For i = 0 To UBound(arr) s = s & arr(i) & " " this_2.Cells(1, 655) = s this_2.Cells(1, 655).EntireColumn.AutoFit 'On Error GoTo ad: If this_2.Cells(1, 655).ColumnWidth > arr1(Z - 1) Then If Len(s) <> Len(arr(i)) + 1 Then this_2.Cells(1, 655) = Left(s, Len(s) - Len(arr(i)) - 1) 'áåç ïîñëåäíåãî ñëîâà this_2.Cells(yLocal, Z) = this_2.Cells(1, 655)
s = "" yLocal = yLocal + 1 i = i - 1 Else arr1(Z - 1) = this_2.Cells(1, 655).ColumnWidth this_2.Cells(yLocal, Z) = Left(s, Len(this_2.Cells(1, 655)) - 1) s = "" yLocal = yLocal + 1 End If End If If this_2.Cells(1, 655).ColumnWidth < arr1(Z - 1) And i = UBound(arr) Then this_2.Cells(yLocal, Z) = this_2.Cells(1, 655) yLocal = yLocal + 1 Exit For ElseIf this_2.Cells(1, 655).ColumnWidth > arr1(Z - 1) And i = UBound(arr) Then arr1(Z - 1) = this_2.Cells(1, 655).ColumnWidth this_2.Cells(yLocal, Z) = this_2.Cells(1, 655) yLocal = yLocal + 1 Exit For End If ad: Next i If yLocal > yMem Then yMem = yLocal End If Next Z yGlobal = yMem Next x Application.ScreenUpdating = True End Sub
Sub ertert() Dim x, i& With Range("A1:C" & Cells(Rows.Count, 1).End(xlUp).Row) x = .Value: .Offset(1).ClearContents End With Application.DisplayAlerts = False For i = 2 To UBound(x) With Cells(Rows.Count, 2).End(xlUp)(2, 1) .Offset(, -1).Resize(, UBound(x, 2)).Value = Array(x(i, 1), x(i, 2), x(i, 3)) .Justify End With Next i Application.DisplayAlerts = True End Sub
[/vba] Только предварительно умную таблицу нужно будет преобразовать в обычный диапазон
dyhes, привет попробуйте так: [vba]
Код
Sub ertert() Dim x, i& With Range("A1:C" & Cells(Rows.Count, 1).End(xlUp).Row) x = .Value: .Offset(1).ClearContents End With Application.DisplayAlerts = False For i = 2 To UBound(x) With Cells(Rows.Count, 2).End(xlUp)(2, 1) .Offset(, -1).Resize(, UBound(x, 2)).Value = Array(x(i, 1), x(i, 2), x(i, 3)) .Justify End With Next i Application.DisplayAlerts = True End Sub
[/vba] Только предварительно умную таблицу нужно будет преобразовать в обычный диапазонnilem
Здравствуйте уважаемые форумчане! Я - автор данной темы на Планете))[moder] Подождите, а это dyhes тогда кто?[/moder] Не фанат кроссов, но на планете пока глухо, а решение очень необходимо в работе. Решение от dima_dan2012, на данный момент больше всего подходит под решение проблемы. Небольшие проблемы связаны с тем, что работа данного макроса подразумевает использование шаблона (можно, конечно и без него, но для этого нужно держать в голове, что существует привязка ко ВТОРОМУ листу книги, а там могут быть данные и ВТОРЫМ листом может быть тот, с которого запускается макрос), а в шаблон необходимо перед запуском макроса перенести форматирование активного листа (интересуют только ширины столбцов). Интересное дело: если на ВТОРОМ листе книги (на котором будет находится результат переноса) находится "умная" таблица целиком, то макрос, по сути, создаст в ней аналог исходника, безо всякого переноса по строкам))) Никак не могу понять (оно и понятно, т.к. я в VBA полный пень), почему просто не переносить строки целиком в выделенном диапазоне, как в данном макросе (переносит вниз по разделителю "перенос строки"
[vba]
Код
Sub TOCInRange_vbNewLine()
'Ограниченная версия макроса с заданным разделителем "перенос строки" 'Автор: webley 'Редактор: JayBhagavan 'Сайт: http://planetaexcel.ru
Dim cl As Range, rng As Range, rngTmp As Range Dim strDelim$, strTmp$ Dim arr() As String Dim i&, n&, j&, k&
strDelim = Chr(10)
If TypeName(Selection) = "Range" Then Set rng = Selection n = rng.Rows.Count For i = n To 1 Step -1 With rng(i, 1) strTmp = .Value & strDelim arr = Split(strTmp, strDelim) j = UBound(arr, 1) - 1 If j > 0 Then .Offset(1).Resize(j).EntireRow.Insert Shift:=xlDown ', CopyOrigin:=xlFormatFromLeftOrAbove Set rngTmp = .Resize(j + 1) For k = 0 To j rngTmp(k + 1, 1).Value = arr(k) Next k End If End With Next i End If End Sub
[/vba]
Здравствуйте уважаемые форумчане! Я - автор данной темы на Планете))[moder] Подождите, а это dyhes тогда кто?[/moder] Не фанат кроссов, но на планете пока глухо, а решение очень необходимо в работе. Решение от dima_dan2012, на данный момент больше всего подходит под решение проблемы. Небольшие проблемы связаны с тем, что работа данного макроса подразумевает использование шаблона (можно, конечно и без него, но для этого нужно держать в голове, что существует привязка ко ВТОРОМУ листу книги, а там могут быть данные и ВТОРЫМ листом может быть тот, с которого запускается макрос), а в шаблон необходимо перед запуском макроса перенести форматирование активного листа (интересуют только ширины столбцов). Интересное дело: если на ВТОРОМ листе книги (на котором будет находится результат переноса) находится "умная" таблица целиком, то макрос, по сути, создаст в ней аналог исходника, безо всякого переноса по строкам))) Никак не могу понять (оно и понятно, т.к. я в VBA полный пень), почему просто не переносить строки целиком в выделенном диапазоне, как в данном макросе (переносит вниз по разделителю "перенос строки"
[vba]
Код
Sub TOCInRange_vbNewLine()
'Ограниченная версия макроса с заданным разделителем "перенос строки" 'Автор: webley 'Редактор: JayBhagavan 'Сайт: http://planetaexcel.ru
Dim cl As Range, rng As Range, rngTmp As Range Dim strDelim$, strTmp$ Dim arr() As String Dim i&, n&, j&, k&
strDelim = Chr(10)
If TypeName(Selection) = "Range" Then Set rng = Selection n = rng.Rows.Count For i = n To 1 Step -1 With rng(i, 1) strTmp = .Value & strDelim arr = Split(strTmp, strDelim) j = UBound(arr, 1) - 1 If j > 0 Then .Offset(1).Resize(j).EntireRow.Insert Shift:=xlDown ', CopyOrigin:=xlFormatFromLeftOrAbove Set rngTmp = .Resize(j + 1) For k = 0 To j rngTmp(k + 1, 1).Value = arr(k) Next k End If End With Next i End If End Sub
nilem, очень близко ))) только макрос по-прежнему привязан...на этот раз к конкретным столбцам. И зачем-то вставляет пустые строки сверху))) Можно ли, чтобы он работал в ВЫДЕЛЕННОМ ДИАПАЗОНЕ?
nilem, очень близко ))) только макрос по-прежнему привязан...на этот раз к конкретным столбцам. И зачем-то вставляет пустые строки сверху))) Можно ли, чтобы он работал в ВЫДЕЛЕННОМ ДИАПАЗОНЕ?Jack_Famous_007
Ответ модератору: dyhes - коллега по работе))) я заинтересован в этом макросе для коллекции) Среди прочих найденных решении этого вопроса данный вариант будет самым универсальным и подходящим для максимального количества задач [moder]И вы работаете с одного компьютера? что-то слабо верится.
Ответ модератору: dyhes - коллега по работе))) я заинтересован в этом макросе для коллекции) Среди прочих найденных решении этого вопроса данный вариант будет самым универсальным и подходящим для максимального количества задач [moder]И вы работаете с одного компьютера? что-то слабо верится.Jack_Famous_007
Сообщение отредактировал _Boroda_ - Четверг, 07.04.2016, 11:51
да нет...не с одного)) с чего вы взяли? Просто макрос нужен обоим. Мной когда-то был найден вариант этого макроса, который подошёл для выполнения конкретной задачи. Ему СЕЙЧАС нужен для немного других условий. А зачем плодить СПЕЦИФИЧЕСКИЕ макросы, если может быть ОДИН УНИВЕРСАЛЬНЫЙ?... Мне бы тоже было куда удобнее работать прямо в выделенном диапазоне без доп. листов, столбцов и т.д. а уже дальнейшие действия - кому-как надо...хочешь, копируй, хочешь переноси... [moder]С того, что у вас IP одинаковый.
да нет...не с одного)) с чего вы взяли? Просто макрос нужен обоим. Мной когда-то был найден вариант этого макроса, который подошёл для выполнения конкретной задачи. Ему СЕЙЧАС нужен для немного других условий. А зачем плодить СПЕЦИФИЧЕСКИЕ макросы, если может быть ОДИН УНИВЕРСАЛЬНЫЙ?... Мне бы тоже было куда удобнее работать прямо в выделенном диапазоне без доп. листов, столбцов и т.д. а уже дальнейшие действия - кому-как надо...хочешь, копируй, хочешь переноси... [moder]С того, что у вас IP одинаковый.Jack_Famous_007
Сообщение отредактировал _Boroda_ - Четверг, 07.04.2016, 12:15
ну ХЗ...из-за общего роутера такое бывает?)) или вы думаете, что мы как в 90х у друга с Денди дома собрались и ждём своей очереди? )))) [moder]Шутить я тоже умею. Вам продемонстрировать?
ну ХЗ...из-за общего роутера такое бывает?)) или вы думаете, что мы как в 90х у друга с Денди дома собрались и ждём своей очереди? )))) [moder]Шутить я тоже умею. Вам продемонстрировать?Jack_Famous_007
Сообщение отредактировал Jack_Famous_007 - Четверг, 07.04.2016, 12:29
Модератору: угрожать своими "шутками" - не стоит - у модераторов они, как правило, являются банами (так себе шутка, на мой взгляд) В любом случае, шутка была НЕ над вами и НЕ про вас. конфликтовать с администрацией сайта мне меньше всего улыбается. Вы спросили - я ответил.
Модератору: угрожать своими "шутками" - не стоит - у модераторов они, как правило, являются банами (так себе шутка, на мой взгляд) В любом случае, шутка была НЕ над вами и НЕ про вас. конфликтовать с администрацией сайта мне меньше всего улыбается. Вы спросили - я ответил.Jack_Famous_007
dima_dan2012, не работает на текущем листе. Нужно сделать так, чтобы макрос работал на одном активном листе , не привязывался к названию листа и не зависел от других, в том числе не создавал временные листы и пр.
dima_dan2012, не работает на текущем листе. Нужно сделать так, чтобы макрос работал на одном активном листе , не привязывался к названию листа и не зависел от других, в том числе не создавал временные листы и пр. dyhes
Ребят, ещё раз опишу мысль. В посте №7 есть рабочий макрос, который разделяет текст по заданному критерию (в данном случае "перенос строки") каждой ячейки в выделенном диапазоне вниз со сдвигом строк целиком. И ему не важно, сколько столбцов слева или справа заполнено, т.к. значения в них сдвигаются вместе с ним (сдвига строк целиком). Я не знаю, каким именно образом в ваших макросах определяется, когда переносить в следующую строку при заполнении по ширине, но если этот признак/критерий/условие передать в макрос поста №7 и он сможет переносить по нему, то это будет то, что нужно
Ребят, ещё раз опишу мысль. В посте №7 есть рабочий макрос, который разделяет текст по заданному критерию (в данном случае "перенос строки") каждой ячейки в выделенном диапазоне вниз со сдвигом строк целиком. И ему не важно, сколько столбцов слева или справа заполнено, т.к. значения в них сдвигаются вместе с ним (сдвига строк целиком). Я не знаю, каким именно образом в ваших макросах определяется, когда переносить в следующую строку при заполнении по ширине, но если этот признак/критерий/условие передать в макрос поста №7 и он сможет переносить по нему, то это будет то, что нужно Jack_Famous_007
Этот вариант переносит как надо, но работает только с 1 ячейкой (активной) ((( Ну и требует задать ширину, что не критично... Можно ли как-то изменить его для цикла по ячейкам в выделенном диапазоне?... p.S.: НЕ про вариант dima_dan2012 [moder] Jack_Famous_007, не захламляйте тему. Есть автор, есть предложение решения его вопроса. Вы, как сами утверждаете, не являетесь автором темы, поэтому не надо задавать свои вопросы в чужой теме (Правила форума)[/moder]
Этот вариант переносит как надо, но работает только с 1 ячейкой (активной) ((( Ну и требует задать ширину, что не критично... Можно ли как-то изменить его для цикла по ячейкам в выделенном диапазоне?... p.S.: НЕ про вариант dima_dan2012 [moder] Jack_Famous_007, не захламляйте тему. Есть автор, есть предложение решения его вопроса. Вы, как сами утверждаете, не являетесь автором темы, поэтому не надо задавать свои вопросы в чужой теме (Правила форума)[/moder]Jack_Famous_007
dima_dan2012, данный код привязан к данной текущей таблице. Если , например, в таблице добавить столбцы, то макрос начинает работать некорректно. Может быть, все же, найдется такое решение, чтобы ячейки разбивались в независимости от относительного их расположения. В идеале - выделил диапазон - и каждая объеденная ячейка, входящая в этот диапазон разбивалась построчно с сохранением ширины ячейки...
Модератор, пускай человек задает вопросы, чем он мешает - то если все по теме?
dima_dan2012, данный код привязан к данной текущей таблице. Если , например, в таблице добавить столбцы, то макрос начинает работать некорректно. Может быть, все же, найдется такое решение, чтобы ячейки разбивались в независимости от относительного их расположения. В идеале - выделил диапазон - и каждая объеденная ячейка, входящая в этот диапазон разбивалась построчно с сохранением ширины ячейки...
Модератор, пускай человек задает вопросы, чем он мешает - то если все по теме?dyhes
Сообщение отредактировал dyhes - Четверг, 07.04.2016, 14:45
Модератору: мы же с автором темы заодно... Нам (а в случае решения проблемы и многим другим) нужно одно и то же, просто, пока он тестит, я пробую варианты и ищу в интернете (и наоборот). [moder]Замечание Вам за нарушение Правил форума[/moder]
Модератору: мы же с автором темы заодно... Нам (а в случае решения проблемы и многим другим) нужно одно и то же, просто, пока он тестит, я пробую варианты и ищу в интернете (и наоборот). [moder]Замечание Вам за нарушение Правил форума[/moder]Jack_Famous_007
Добавлял столбцы - вроде работает но не очень корректно переносит. Надо тестить ,главное чтобы формат ячейки был без переноса строки. Кстати а зачем такие мучения? Разве стандартными средствами нельзя организовать нормальный перенос на следующую строку?
Добавлял столбцы - вроде работает но не очень корректно переносит. Надо тестить ,главное чтобы формат ячейки был без переноса строки. Кстати а зачем такие мучения? Разве стандартными средствами нельзя организовать нормальный перенос на следующую строку?dima_dan2012
WM :Z116994103939
Сообщение отредактировал dima_dan2012 - Пятница, 08.04.2016, 10:43