Всем доброго времени суток, помогите решить задачу прошелся по ветке www.excelworld.ru/forum/2-890-1 ничего для себя не взял, все не то на моём примере, и по моему шаблону как корректно переносить текст по строкам шаблона в первых двух строках применены формулы, с "ручной" настройкой кол-ва символов (регулятор первой строки) в других строках текст может уходить за границы диапазона объединённых ячеек при перемещении по листбоксу, если сдвинуть форму видно как распределяется текст в первых двух строках и как он не умещается в других как решить эту задачу без формул, а макросами
Всем доброго времени суток, помогите решить задачу прошелся по ветке www.excelworld.ru/forum/2-890-1 ничего для себя не взял, все не то на моём примере, и по моему шаблону как корректно переносить текст по строкам шаблона в первых двух строках применены формулы, с "ручной" настройкой кол-ва символов (регулятор первой строки) в других строках текст может уходить за границы диапазона объединённых ячеек при перемещении по листбоксу, если сдвинуть форму видно как распределяется текст в первых двух строках и как он не умещается в других как решить эту задачу без формул, а макросамиcombat
combat, добрый день! Честно, не знаю как полностью граммотно решить Вашу задачу. Но вы как минимум могли бы использовать те же формулы, что у Вас есть, просто записав их в коде ВБА, например:
Значение, которое у Вас в BC3 запишите в одну переменную, например Namess, а длину, которую вы пишите в ячейке BB15 можно записать в другую переменную или явно указывать в коде: [vba]
Код
if len(Namess)<45 then Name=Namess else Name=Left(Namess,Find(" ", Namess,45)-1)) end if
[/vba] Гдe Name - переменная, получаемое значение которой Вы будете записывать в ячейку M15 Для ячейки A17 можно по аналогии формулу записать в коде ВБА.
combat, добрый день! Честно, не знаю как полностью граммотно решить Вашу задачу. Но вы как минимум могли бы использовать те же формулы, что у Вас есть, просто записав их в коде ВБА, например:
Значение, которое у Вас в BC3 запишите в одну переменную, например Namess, а длину, которую вы пишите в ячейке BB15 можно записать в другую переменную или явно указывать в коде: [vba]
Код
if len(Namess)<45 then Name=Namess else Name=Left(Namess,Find(" ", Namess,45)-1)) end if
[/vba] Гдe Name - переменная, получаемое значение которой Вы будете записывать в ячейку M15 Для ячейки A17 можно по аналогии формулу записать в коде ВБА.Roman777
Имхо всё не так страшно: Самое главное определиться с размером и шрифтом чтобы влазил в ячейку и задать конечное колличество символов (ограничение) для показа в первой ячейке. Пример берёт колличество символов из ячейки BB15 и разбрасывает по строкам. В Вашем примере надо заменить в Private Sub ListBox1_Change(): [vba]
Код
Worksheets("РСИ").Cells(3, 55) = Lbl.Caption
[/vba] На: [vba]
Код
numb = Worksheets("РСИ").Cells(15, 54)' Считаем колличество символов к отображению Worksheets("РСИ").Cells(15, 13).FormulaR1C1 = Left(Lbl.Caption, numb)' Записываем numb символов с лева в первую ячейку Worksheets("РСИ").Cells(17, 1) = Right(Lbl.Caption, Len(Lbl.Caption) - numb)' Забираем оставшиеся символы во вторую ячейку
[/vba]
Имхо всё не так страшно: Самое главное определиться с размером и шрифтом чтобы влазил в ячейку и задать конечное колличество символов (ограничение) для показа в первой ячейке. Пример берёт колличество символов из ячейки BB15 и разбрасывает по строкам. В Вашем примере надо заменить в Private Sub ListBox1_Change(): [vba]
Код
Worksheets("РСИ").Cells(3, 55) = Lbl.Caption
[/vba] На: [vba]
Код
numb = Worksheets("РСИ").Cells(15, 54)' Считаем колличество символов к отображению Worksheets("РСИ").Cells(15, 13).FormulaR1C1 = Left(Lbl.Caption, numb)' Записываем numb символов с лева в первую ячейку Worksheets("РСИ").Cells(17, 1) = Right(Lbl.Caption, Len(Lbl.Caption) - numb)' Забираем оставшиеся символы во вторую ячейку
Я пошел совсем по другому пути, объединил строки нарисовал линии и вставил label (подстрочный текст под эти линии) вставляемый текст из ячеек распределяется в соответствии со свойствами "переносить по словам" в коде ...
[vba]
Код
Worksheets("РСИ").Cells(15, 1) = "Средство измерения " & Lbl.Caption
[/vba]
вообщем все оказалось очень просто, и без заморочек, правда пришлось подбирать шрифт, необходимо было большое межстрочное пространство, у вас его может не быть и будет не корректно показывать, подобрал шрифт Ebrima
далее, следующая для меня проблема, вроде должно все работать, но не срабатывает код в форме ComboBox1 иComboBox2 [vba]
Код
Private Sub UserForm_Initialize()
ListBox1.ColumnCount = 2 ' ListBox1.ColumnWidths = "0;" CommandButton2.Enabled = False '........................................... Set SRng = Sheets("БазаСИ").Range("B1") ' '........................................... Set SRng = Range(SRng, SRng.End(xlDown)) N = SRng.Rows.Count Vs = SRng.Value ReDim SArr(1 To N) ReDim Arrr(N - 1) For R = 1 To N Sentence = Vs(R, 1) SArr(R) = " " & Replace(Sentence, """", "") ListBox1.AddItem R ListBox1.List(R - 1, 1) = Sentence Arrr(R - 1) = R Next
Lbl_SI.Caption = "Всего СИ в базе " & " " & N & " ед." 'ComboBox1.List = Worksheets("Специалисты").Range("A1", Cells(Rows.Count, "A").End(xlUp)).Value 'ComboBox2.List = Worksheets("Специалисты").Range("B1", Cells(Rows.Count, "B").End(xlUp)).Value End Sub
[/vba]
тот код который отключен, в самом конце
Я пошел совсем по другому пути, объединил строки нарисовал линии и вставил label (подстрочный текст под эти линии) вставляемый текст из ячеек распределяется в соответствии со свойствами "переносить по словам" в коде ...
[vba]
Код
Worksheets("РСИ").Cells(15, 1) = "Средство измерения " & Lbl.Caption
[/vba]
вообщем все оказалось очень просто, и без заморочек, правда пришлось подбирать шрифт, необходимо было большое межстрочное пространство, у вас его может не быть и будет не корректно показывать, подобрал шрифт Ebrima
далее, следующая для меня проблема, вроде должно все работать, но не срабатывает код в форме ComboBox1 иComboBox2 [vba]
Код
Private Sub UserForm_Initialize()
ListBox1.ColumnCount = 2 ' ListBox1.ColumnWidths = "0;" CommandButton2.Enabled = False '........................................... Set SRng = Sheets("БазаСИ").Range("B1") ' '........................................... Set SRng = Range(SRng, SRng.End(xlDown)) N = SRng.Rows.Count Vs = SRng.Value ReDim SArr(1 To N) ReDim Arrr(N - 1) For R = 1 To N Sentence = Vs(R, 1) SArr(R) = " " & Replace(Sentence, """", "") ListBox1.AddItem R ListBox1.List(R - 1, 1) = Sentence Arrr(R - 1) = R Next
Lbl_SI.Caption = "Всего СИ в базе " & " " & N & " ед." 'ComboBox1.List = Worksheets("Специалисты").Range("A1", Cells(Rows.Count, "A").End(xlUp)).Value 'ComboBox2.List = Worksheets("Специалисты").Range("B1", Cells(Rows.Count, "B").End(xlUp)).Value End Sub
Как заставить работать ComboBox на форме, беря данные с листа в книге, а форма привязана к др. листу, у меня по чему то не работает пребывал по всякому, работает только если активен лист с которого берутся данные, все указано в сообщении 4, там же и файл
если активен лист "РСИ" не работает, если лист "Специалисты" работает, в общем надо, что бы работало при активном листе "РСИ"
Как заставить работать ComboBox на форме, беря данные с листа в книге, а форма привязана к др. листу, у меня по чему то не работает пребывал по всякому, работает только если активен лист с которого берутся данные, все указано в сообщении 4, там же и файл
Я обычно добавляю данные так (сразу не заметил что у Вас Рендж):
[vba]
Код
Private Sub UserForm_Initialize() For i = 1 To Worksheets("Специалисты").Cells(Rows.Count, "A").End(xlUp).Row ComboBox1.AddItem Worksheets("Специалисты").Cells(i, "A").Value Next i End Sub
[/vba] Честно говоря, точно сам не знаю почему Ваш способ не работает, сам сталкивался... это связано именно, что Вы пытаетесь вставить данные через Range, но Range, который на другом, неактивном листе.
combat, Добрый день! Я не знаю что вы пытаетесь сделать когда пишите:
Я обычно добавляю данные так (сразу не заметил что у Вас Рендж):
[vba]
Код
Private Sub UserForm_Initialize() For i = 1 To Worksheets("Специалисты").Cells(Rows.Count, "A").End(xlUp).Row ComboBox1.AddItem Worksheets("Специалисты").Cells(i, "A").Value Next i End Sub
[/vba] Честно говоря, точно сам не знаю почему Ваш способ не работает, сам сталкивался... это связано именно, что Вы пытаетесь вставить данные через Range, но Range, который на другом, неактивном листе.Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Четверг, 15.10.2015, 22:56
Роман, я не сомневался, что Вы мне очередной раз поможете, и еще раз вам большое спасибо работает только первый вариант, при втором дает ошибку на запуск формы 2
[vba]
Код
Dim i As Variant For i = 1 To Worksheets("Специалисты").Cells(Rows.Count, "A").End(xlUp).Row ComboBox1.AddItem Worksheets("Специалисты").Cells(i, "A").Value Next i For i = 1 To Worksheets("Специалисты").Cells(Rows.Count, "B").End(xlUp).Row ComboBox2.AddItem Worksheets("Специалисты").Cells(i, "B").Value Next i
[/vba]
т.к. у меня выбор из двух списков, код сделал вот так...
Роман, я не сомневался, что Вы мне очередной раз поможете, и еще раз вам большое спасибо работает только первый вариант, при втором дает ошибку на запуск формы 2
[vba]
Код
Dim i As Variant For i = 1 To Worksheets("Специалисты").Cells(Rows.Count, "A").End(xlUp).Row ComboBox1.AddItem Worksheets("Специалисты").Cells(i, "A").Value Next i For i = 1 To Worksheets("Специалисты").Cells(Rows.Count, "B").End(xlUp).Row ComboBox2.AddItem Worksheets("Специалисты").Cells(i, "B").Value Next i
[/vba]
т.к. у меня выбор из двух списков, код сделал вот так...combat
combat, я думаю что второй мб опять где-то неправильно был применён... сразу замечу, что если у Вас данные в одинаковых строках в столбце "А" и "B", можно было бы обойтись и одним циклом. И вообще [vba]
[/vba] - просто определяет последнюю из заполненных строк для столбца "А" и думаю, что лучше всего не пересчитывать его на каждом шаге цикла, а запихнуть в переменную (предварительно посчитав 1 раз) и потом уже использовать из памяти, так что сам себя поправлю: [vba]
Код
Dim i as long Dim i_n as long i_n = Worksheets("Специалисты").Cells(Rows.Count, "A").End(xlUp).Row For i=1 to i_n ComboBox1.AddItem Worksheets("Специалисты").Cells(i, "A").Value ComboBox2.AddItem Worksheets("Специалисты").Cells(i, "B").Value ' если для столбцов "А" и "B" данные лежат в одних и тех же строках, иначе надо делать второй цикл, как вы делали выше. Next i
[/vba]
combat, я думаю что второй мб опять где-то неправильно был применён... сразу замечу, что если у Вас данные в одинаковых строках в столбце "А" и "B", можно было бы обойтись и одним циклом. И вообще [vba]
[/vba] - просто определяет последнюю из заполненных строк для столбца "А" и думаю, что лучше всего не пересчитывать его на каждом шаге цикла, а запихнуть в переменную (предварительно посчитав 1 раз) и потом уже использовать из памяти, так что сам себя поправлю: [vba]
Код
Dim i as long Dim i_n as long i_n = Worksheets("Специалисты").Cells(Rows.Count, "A").End(xlUp).Row For i=1 to i_n ComboBox1.AddItem Worksheets("Специалисты").Cells(i, "A").Value ComboBox2.AddItem Worksheets("Специалисты").Cells(i, "B").Value ' если для столбцов "А" и "B" данные лежат в одних и тех же строках, иначе надо делать второй цикл, как вы делали выше. Next i
With Worksheets("Специалисты") ComboBox1.List = .Range(.Cells(1,"A"), .Cells(.Rows.Count, "A").End(xlUp)).Value ComboBox2.List = .Range(.Cells(1, 2), .Cells(.Rows.Count, 2).End(xlUp)).Value End With
[/vba]
Мууученики! [vba]
Код
With Worksheets("Специалисты") ComboBox1.List = .Range(.Cells(1,"A"), .Cells(.Rows.Count, "A").End(xlUp)).Value ComboBox2.List = .Range(.Cells(1, 2), .Cells(.Rows.Count, 2).End(xlUp)).Value End With
RAN, Вы правы...) Почему-то сразу в глаза не бросилось) combat, Советую всё-таки, вопросы, не относящиеся к самой теме создавать в отдельной теме. Ибо правила... А по вопросу, я бы на Вашем месте поставил название отдела напротив каждого работника... А потом уже по условию, при выборе начальника (или любого работника отдела), сверять его отдел с отделами всех остальных, и только те, где отделы совпадают, добавлять в комбобокс)))
RAN, Вы правы...) Почему-то сразу в глаза не бросилось) combat, Советую всё-таки, вопросы, не относящиеся к самой теме создавать в отдельной теме. Ибо правила... А по вопросу, я бы на Вашем месте поставил название отдела напротив каждого работника... А потом уже по условию, при выборе начальника (или любого работника отдела), сверять его отдел с отделами всех остальных, и только те, где отделы совпадают, добавлять в комбобокс)))Roman777
Dim i As Variant For i = 1 To Worksheets("Специалисты").Cells(Rows.Count, "A").End(xlUp).Row ComboBox1.AddItem Worksheets("Специалисты").Cells(i, "A").Value Next i For i = 1 To Worksheets("Специалисты").Cells(Rows.Count, "B").End(xlUp).Row ComboBox2.AddItem Worksheets("Специалисты").Cells(i, "B").Value Next i
[/vba]
думаю связать так: при выборе из ComboBox1 первой строки, назначить второй столбец ComboBox2, при выборе ComboBox1 второй строки, назначить третий столбец ComboBox2 и так далее и как сделать не пойму...
Где-то рядом, но пока решение не нашел
[vba]
Код
Dim i As Variant For i = 1 To Worksheets("Специалисты").Cells(Rows.Count, "A").End(xlUp).Row ComboBox1.AddItem Worksheets("Специалисты").Cells(i, "A").Value Next i For i = 1 To Worksheets("Специалисты").Cells(Rows.Count, "B").End(xlUp).Row ComboBox2.AddItem Worksheets("Специалисты").Cells(i, "B").Value Next i
[/vba]
думаю связать так: при выборе из ComboBox1 первой строки, назначить второй столбец ComboBox2, при выборе ComboBox1 второй строки, назначить третий столбец ComboBox2 и так далее и как сделать не пойму...combat