Страницы: 1
RSS
Цикл для формирования ширины столбцов из массива
 
Здравствуйте, уважаемые форумчане, нуждаюсь в вашей помощи. Создал цикл для приема значений в массив. А дальше принятые значения должны формировать значения ширины столбцев. Пример в масиив отправленны значения 1,10,15. Ширина столбцев активного листа дол
Код
Public n, i, b, Int_Array() As Integer
Sub AutoShirina()
n = InputBox("Введите количество столбцев")
ReDim Int_Array(n)
'Dim str_msg As String
For i = 0 To n
Int_Array(i) = InputBox("Введите значение ширины " & i & " столбца ", "Ввод значений массива")

Next i

For j = 1 To 
'Здесь ошибка
 'Columns(n).ColumnWidth.Value = Application.Transpose(Int_Array)
'!!!
'Вывод значений в таблицу проходит заккоментировал ниже
'Cells(1, 1).Resize(n).Value = Application.Transpose(Int_Array)
Next j

End Sub

Как задать значениями массива ширину столбцев ?
Если можно то пример код.
 
Цитата
Knopix написал: Как задать значениями массива ширину столбцев ?
Никак. Точнее тем же циклом
Код
For i = 1 To n
    Columns(i).Width = InputBox("Введите значение ширины " & i & " столбца ", "Ввод значений массива")
Next i

или после цикла вставьте строку
Код
Cells.EntireColumn.AutoFit
Изменено: Sanja - 31.01.2019 12:25:18
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:
или после цикла вставьте строкуКод ? 1Cells.EntireColumn.AutoFit
Самый оптимальный вариант. :D
"Все гениальное просто, а все простое гениально!!!"
 
Спасибо, хотя это не решило проблему, данный макрос будет вызваться другим макросом для пакетной обработки файлов, потому и необходимо сперва получить значения, а другим макросом передавать полученные значения для всех открывающихся файлов.
что то типа того
Код
sub m1()
'здесь код получения значений в публичный массив
end Sub
sub m2()
'здесь код принимающий значения из публичного массива и передающий данные значения в параметр количества столбцев и ширины столбцев, перебирая значения циклом.

Возможно, есть иной путь, я вижу решение таким, но проблема только в передачи значений из массива в значения для ширины столбцев. В ячейки в таблице, данные значения ведь передаются
Может можно сделать промежуточную переменную(ные), которая(ые) будет(ут) принимать значение(я) из ячеек в ширину для столбцев. После обработки отчищать значения в ячейках. Но я не знаю как это сделать правильно, да и код будет повесомей.
 
Немного не понял, чем не устраивает этот вариант
Код
Cells.EntireColumn.AutoFit

или столбцы должны быть ка в файле первоисточнике?
"Все гениальное просто, а все простое гениально!!!"
 
Для того, чтобы из массива можно было что-то взять, нужно туда это положить.
Помещайте в массив ширину столбцов (любым удобным для вас способом), а после считывайте ее оттуда, и применяйте.
И заполнение массива, и считывание - циклом.
 
Немного не понял, чем не устраивает этот вариант?
Код
Cells.EntireColumn.AutoFit

Проблем в том, что данный макрос будет вызыватся другим макросом для обработки большого количества однотипных файлов, скажем есть 100 файлов, в которых нужно изменить ширину столбец n1-n5, в других 100 файлов тоже самое, но n1-n6(количество столбцев). Так вот autofit, может серьезно роменять внешний вид файлов, так как столбцы заполнены по разному. Потом любой человек зайдет для печати документа и у него на бумаге будут пустые поля либо внешее отличие в общем виде документо( в документе1 1 столбец 20, в документе 2 уже 100)
 
В любом случае, так, как хотите это (изменение ширины столбцов) сделать Вы не выйдет. Можете собирать нужные значения для ширины столбцов в массив, но кроме как циклом, Вы не сможете их применить к соответствующим столбцам.
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Knopix написал: в документе1 1 столбец 20, в документе 2 уже 100)
И вы собираетесь ширину каждого  столбца каждого файла вводить вручную? в чем фишка автоматизации данного процесса? Или я чего то не понимаю. Да проще ничего не менять , а потом открыть файлы по очереди и раздвинуть столбики вручную. Мне кажется это будет быстрей гораздо.
"Все гениальное просто, а все простое гениально!!!"
 
И вы собираетесь ширину каждого  столбца каждого файла вводить вручную? в чем фишка автоматизации данного процесса? Или я чего то не понимаю. Да проще ничего не менять , а потом открыть файлы по очереди и раздвинуть столбики вручную. Мне кажется это будет быстрей гораздо.
Я написал ответ по автофиту. идея в том что параметр нужно задать один раз, и передать его в публичный массив (список чисел получиться). А вот обработку файлов уже выполняет другой макрос, он и будет вносить полученные ранее значения для всех файлов.
Вопрос в том как выглядит код где принимаются значения в массив и передаются в параметры для ширины столбца  из этого массива. А все остальное, менее важно.
 
Может быть так ?
Код
Option Explicit

Public shirina()

Sub AutoShirina_kak_mashina()
    Dim otvet, indks%, i%
    otvet = Application.InputBox("Vvedite chisla shirin stolbtsov", "Shiriny stolbtsov", "4;4;5;5;6;6;7;7", , , , , 2)
    otvet = Application.Trim(otvet)
    If otvet = "" Then Exit Sub
    otvet = Split(otvet, ";", -1, 1)
    indks = UBound(otvet)
    For i = 0 To indks
        If Not IsNumeric(otvet(i)) Then MsgBox "Oy, chto zh vy tut napisali ?" & vbCrLf & "Pa pa !": Exit Sub
    Next
    ReDim shirina(1 To indks + 1, 1 To 1)
    For i = 0 To indks
        shirina(i + 1, 1) = Round(Abs(CSng(otvet(i))), 2)
    Next
    'Potom naprimer:
    Call peredatchik
End Sub

Sub peredatchik()
    Dim i%, indks%
    indks = UBound(shirina, 1)
    For i = 1 To indks
        Columns(i).ColumnWidth = shirina(i, 1)
    Next
End Sub
 
Цитата
ocet p написал:
Может быть так?
Код
Option Explicit
 
Public shirina()
 
Sub AutoShirina_kak_mashina()
    Dim otvet, indks%, i%
    otvet = Application.InputBox("Vvedite chisla shirin stolbtsov", "Shiriny stolbtsov", "4;4;5;5;6;6;7;7", , , , , 2)
    otvet = Application.Trim(otvet)
    If otvet = "" Then Exit Sub
    otvet = Split(otvet, ";", -1, 1)
    indks = UBound(otvet)
    For i = 0 To indks
        If Not IsNumeric(otvet(i)) Then MsgBox "Oy, chto zh vy tut napisali ?" & vbCrLf & "Pa pa !": Exit Sub
    Next
    ReDim shirina(1 To indks + 1, 1 To 1)
    For i = 0 To indks
        shirina(i + 1, 1) = Round(Abs(CSng(otvet(i))), 2)
    Next
    'Potom naprimer:
    Call peredatchik
End Sub
 
Sub peredatchik()
    Dim i%, indks%
    indks = UBound(shirina, 1)
    For i = 1 To indks
        Columns(i).ColumnWidth = shirina(i, 1)
    Next
End Sub
Спасибо, пока нет возможности проверить, но очень похоже на то, что нужно(я в действительности не все в вашем коде понимаю, но это другой вопрос совершенно). Буду пробовать и заодно получу новые знания, мне предстоит разобраться с каждой строчкой кода.
Изменено: Knopix - 03.02.2019 20:48:28
 
Knopix, вкрнитесь, приведите сообщение в нормальный вид. Цитата - не бездумная копия.
Страницы: 1
Наверх