Я думаю слишком замарочный алгоритм получается для разпознования каждой строки сначала по строке переноса, потом анализ подстроки, что там есть какой-то текст и потом уже делать какие-то выводы. Поэтому лучшим решением пока нашли, обернуть сами категории в какие-то символы, которые и не видны и по ним можно искать.
написал: у неразрывного пробела такая же ширина как и у обычного, код этого символа 160 и Excel, в отличие от пользователя, замечательно его видит) как латинская а "эй" и кириллическая а "а" ничем не отличаются на вид, так и неразрывный и обычный пробел на вид не отличимы, только это знаки с разными кодами
Я возможно не так выразился. Неразрывный пробел - это все таки пробел и он виден. А есть нерарывный пробел с нулевой шириной (https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B0%D0%B7%D1%80%D1%8B%D0%B2%D0%BD%D1%8B%D0%B9_%D0...) Он никак не выдает себя и найти его уже Excel не может, так как его код 8288. Откуда я выгружаю эти данные я могу такой символ в юникоде поставить, но Excel его не знает, либо за ним закреплено какоем-то другое название, которое я не знаю.
написал: 1. откажитесь от табуляторов, усложните написание макроса или 2. замените директора на такого, которого не раздражают табуляторы в тексте или 3. вместо табуляторов поставьте неразрывные пробелы, переделайте чуть макрос и не говорите о пробелах директору
Использование табуляторов оправдано тем, что пока не щелкнешь на ячейку, то все выглядит корректно. Только при щелчке на ячейку ты видишь эти отступы. Неразрывный пробел с нулевой шириной поставить могу, но Excel не видит его (у него нет такого кода в таблице). А Неразрывный пробел визуально все равно показывает их. Но за наводку спасибо.
Добрый день всем. Суть задачи: выгружается список категорий и подкатегорий в одну ячейку. Нужно Категории выделить жирным шрифтом, подкатегории обычным. Пример: Категория 1 подкатегория 1 подкатегория 2 подкатегория 3
Сами данный выгружаются в таком же виде, только без выделения. Были добавлены символы табуляции вокруг Категорий для облегчения написания макроса. Макрос срабатывает каждый раз, когда мы переключаемся на страницу, когда активизируем.
Текст макроса:
Код
Public Sub boldFontTargets()
Dim actSheet As Worksheet
Dim startPos, endPos, countSymbol As Integer
Dim flag, flagBold As Boolean
Dim searchStr, newValue As String
Set actSheet = ThisWorkbook.ActiveSheet
flag = True
endPos = 0
startPos = 0
flagBold = True
searchStr = vbTab
While flag
If (startPos = 0) Then
startPos = InStr(1, actSheet.Cells(5, 3), searchStr)
End If
endPos = InStr(startPos + 1, actSheet.Cells(5, 3), searchStr)
If (endPos = 0) Then
countSymbol = Len(actSheet.Cells(5, 3)) - startPos
Else
countSymbol = endPos - startPos
End If
If (IsNumeric(startPos) And IsNumeric(endPos) And startPos > 0 And endPos > 0) Then
With actSheet.Cells(5, 3).Characters(startPos, countSymbol).Font
.Bold = flagBold
End With
startPos = endPos
flagBold = Not flagBold
Else
flag = False
End If
Wend
End Sub
Хотя табуляторы и не видно, но когда переключаешься на ячейку, то директору не понравилось. Так вот, когда я в макросе пишу заменить табуляторы на пустышку, то весь текст в ячейке становится просто жирным. Пытался записать ручным макросом - тоже самое. Такое чувство, что при замене все оформление сбивается. Подскажите и дайте совет.
Отформатировать данные для дальнейшей печати (автоматизация вычисления области печати), Необходимо сформировать таблицу с шапкой и подписями для печати на нескольких страницах
Ребята, скажите как Вам в карму добавить +100 очков? ))) Очень выручили намеками как в дальнейшемм все это докрутить. Я почему-то думал, что будут какие-то стандартные методы, но не нашел, увы. Еще раз спасибо
Отформатировать данные для дальнейшей печати (автоматизация вычисления области печати), Необходимо сформировать таблицу с шапкой и подписями для печати на нескольких страницах
Добрый день всем. Проблема в следующем: Имеется таблица с 100 строками. У таблицы есть название и наименование столбцов. А также под таблицей пишется номер страницы и логотип фирмы.
Я могу установить сквозные строки для страниц и на печать будет выводиться и шапка, и "подвал". Но нужно сформировать эти данные на самом листе, так как пользователи копируют эту информацию в какие-то отчеты.
На листе "Как есть" - отображена информация, которая сейчас выгружается из системы в таком виде. На листе "Как должно быть" - показано как она должна быть сформирована на самом листе и выводиться на печать, соответственно. Область печати задается, так чтобы все столбцы влезли. Вся проблема со строками. Наведите на мысль, как это можно сделать: как вычислить последнюю строку на первой странице, подсчитать сколько строк выводится на печать и прочее. Подсчитать количество выводимых на печать страниц в исходном варианте я могу, что сделать дальше нужно, чтобы информация вмешалась на лист.
БМВ, Пытливый, спасибо за помощь. Я теперь знаю куда копать.
Одна только проблема - так как Excel не позволяет вложенность больше 8, то надо будет разобраться с ячейками, которые внутри списка появляются не сгнруппированные. В примере это "ВК черный".
P.S.: скажите, где Вы все это находите? Внутренний помощник не подсказывает такие функции, а литературы толковой я не нашел (((
Есть такая задача: есть лист Excel, где сгруппированны строки до максимального уровня. Причем у некоторых позиций уровень вложенности меньше. Каким образом мне узнать, что данная строка является "родителем" группы, чтобы обработать нужные строки?
Пример файла прикладываю. Заранее благодарен за ответы.
Здравствуйте. Подскажите, как осуществить следующее: 1. на форме есть первая группа OptionButtion и связанный с ними TextBox1. При выборе первой радиокнопки и двойном клике на TextBox1 я получаю форму открытия файла, при выборе второй радиокнопки и двойном клике в TextBox1 я получаю форму выбора директории. 2. Затем есть 2 группа радиокнопок и свой TextBox2. При выборе 1 радиокнопки TextBox2 скрывается (будет происходить перезапись файлов), при выборе второй радиокнопки появляется TextBox2 и при двойном клике в нем вызывается окно выбора каталога (сохранения в другую директорию файлов). 3. Написана процедура, по выбору каталога
Код
Private Sub ChoiceCatalog()
Dim oDir As FileDialog
Dim DirCatalog, SaveFileName
Set oDir = Application.FileDialog(msoFileDialogFolderPicker)
With oDir
.Title = "Выбрать каталог"
.ButtonName = "выбрать каталог"
.Filters.Clear
.InitialView = msoFileDialogViewLargeIcons
If oDir.Show = 0 Then Exit Sub
DirCatalog = .SelectedItems(1)
fMain.tbPath.Value = DirCatalog
End With
End Sub
Я хочу использовать ее для двух TextBox. Но в значения этих TextBox должны попадать свои пути.
Как передать в качестве параметра саму форму или элемент, который вызвал эту процедуру, чтобы уже в этот элемент и записать значение? В коде это строчка перед End With
DeniSlav написал: На другом форуме мне вывели формулу через MathCad, но там проблема, то, что при значениях y ниже 0,59 под корнем получается отрицательное значение, в результате чего вылетает ошибка.
1. ну так сделайте проверку на положительность полученных корней. 2. а как выбрать корень, если их 2, попадающих в этот диапазон? см. сообщение 9 с графиком для Y=0.59 3. Может есть какие-то дополнительные условия ?
Если ты в элемент загоняешь массив, то и обращаться потом придется по индексу. Делая так:
Код
myArr(1, 0, 5)= {1,2,3,4,5,6,7,8}
ты получишь, что у тебя в элементе (1,0,5) будет храниться массив и чтобы достать нужное значение, надо пробежаться внутри него. VBA не будет за тебя расширять диапазон массива. Это надо отдельно прописывать.
Цитата
Ливиан написал: Думал, в Excel раз можно в формулах на рабочем листе такое использовать
Ливиан написал: я так уже делал, хотел именно многомерный присвоить, но без предварительного его создания... Судя по всему, единственный вариант сначала создать а потом присвоить
Если вы не создали массив, то как ему можно что-то присвоить? а где и как должна выглядеть многомерность ?
Андрей VG написал: В файле Y=4x(1-x)^2, то есть функция всегда одна, а вот для различных y нужно найти неизвестные x.
Вот в файле как раз этот столбец и вычисляется видимо где-то по этой функции. И там столбец этих значений. И по ним нужно решить обратную задачу, найти Х которые удовлетворяют.
Андрей VG написал: Зачем же для данного уравнения так глубоко?
Ну это справедливо для нулевого свободного члена. А у него он меняется. А значит и корни пляшут. Вот скрины для нулевого значения свободного члена увы... удалены: превышение допустимого размера вложения [МОДЕРАТОР] , и для следующего в столбце. Там уже 2 корня попадают в его диапазон. И по какому принципу их отделять - не знаю
Попробуйте в Вашем файле сделать дополнительные столбцы и посчитать в них параметры. Либо все это можете делать макросом )
Конкретно в вашем случае, по тем данным что Вы предоставили - везде дискриминант будет 0, а значит у вас будет 2 корня ТОЧНО совпадут, а другой отличный от них, либо может быть равен им. Вот тут написано решение, через замену http://ateist.spb.ru/mw/kardano.htm
The_Prist написал: Так а зачем Вы после создания объекта вызываете Call UpdateCmBxes?
Это я уже от отчаяния понять, почему не работает, решил просто вызвать туже процедуру, что запускается при старте книги. Ни с ней, ни без нее не получается все равно получить результат, что при добавлении CB сразу становился членом класса. Файл не могу прикрепить, он больше предельного размера, разрешенного правилами. Да и информация все-таки есть личная. Сократить его на скорую руку не могу. Попробую завтра написать пример коротенький со всеми процедурами, что описал выше. Насколько я читал по форуму, такой проблемы нет, если эти элементы добавлять на форму.
Public Sub UpdateCmBxes()
Dim sh_tmp As Worksheet
Dim elem As OLEObject, cb As Object
Dim nom&
ReDim aoCmbBxes(1 To 1)
nom = 1
For Each sh_tmp In ThisWorkbook.Worksheets
For Each elem In sh_tmp.OLEObjects
Set cb = elem.Object
If TypeName(cb) = "ComboBox" Then
ReDim Preserve aoCmbBxes(1 To nom)
Set aoCmbBxes(UBound(aoCmbBxes)).oCmbBx = elem.Object
nom = nom + 1
End If
Next elem
Next sh_tmp
End Sub
добавление CB
Код
sName = "tut moye nazvanie"
nom = UBound(aoCmbBxes) + 1
ReDim Preserve aoCmbBxes(1 To nom)
Set obj = sh_now.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=lCB, Top:=tCB, Width:=wCB, _
Height:=hCB)
obj.Name = sName
Set aoCmbBxes(UBound(aoCmbBxes)).oCmbBx = obj
Call UpdateCmBxes
класс
Код
Option Explicit
Public WithEvents oCmbBx As MSForms.ComboBox
Private Sub oCmbBx_Change()
'delau 4to-to
End Sub
Результат тот же самый - при добавлении никак не реагирует, а при перезапуске книги, все обновляет.
На листе программно, по нажатию кнопки добавляются ComboBox. При открытии книги все ComboBox присваиваются классу (у которого прописано одно событие Change), и во всех них обновляются списки данных:
Код
Public aoCmbBxes As clsmCmbBxes
Public clCmBxes As New Collection
For Each sh_tmp In ThisWorkbook.Worksheets
For Each elem In sh_tmp.OLEObjects
Set cb = elem.Object
If TypeName(cb) = "ComboBox" Then
Set aoCmbBxes = New clsmCmbBxes
Set aoCmbBxes.oCmbBx = cb
clCmBxes.Add aoCmbBxes
End If
Next elem
Next sh_tmp
Вся эта конструкция хорошо отрабатывает для обновления списков, но при открытии книги. Когда же в программе я создаю новый комбобокс, то он никак не хочет попадать в класс, чтобы для него отрабатывалось событие ((( Пробовал разные варианты:
1.добавление нового элемента класса и присваивание ему нового CB
Код
Set aoCmbBxes = New clsmCmbBxes
Set aoCmbBxes.oCmbBx = list.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=lCB, Top:=tCB, Width:=wCB, _
Height:=hCB).Name = sName
2.Добавление CB на лист, и обновление всех CB на листах, как в процедуре выше
Но этот новосозданный комбобокс никак не хочет попадать в класс ((( и соответственно не отрабатывает событие. Только после перезапуска книги. Продебагить по шагам не могу, так как в этот момент видимо включается Конструктор где-то и выскакивает сообщение " can't break mode at this time"
Sanja написал: Какой вопрос - такой ответ. Если-бы сразу спросили то, что Вам нужно, а не то как Вы это пытаетесь решить, получили-бы соответствующий ответ
Прошу прощения за неполное описание проблемы. Все работает и в Вашем примере, но большое спасибо за ссылку. Понятно теперь куда копать. Вопрос закрыт )