|
|
|
Железный канал: «Office» |
|
|
Alex A. Florov
970 EGP
     Рейтинг канала: 5(187) Репутация: 220 Сообщения: 5663 Откуда: [Харьков,UA] Зарегистрирован: 24.03.2003
 |
|
файлы случаем не разролись до двух гигов?
_________________ -= Errare humanum est... =- |
|
|
Dymon
1179 EGP
   Рейтинг канала: 3(25) Репутация: 238 Сообщения: 5296 Откуда: точка Зарегистрирован: 14.10.2004
 |
|
ZIP : |
Вот тут вроде описывается решение:
|
Спасибо, помогло.
_________________ Геолух-газовик, нефтяник и ретроГад Лебедев.
А ещё - злобный тупой дурак. :) |
|
|
Снуч
941 EGP
   Рейтинг канала: 5(100) Репутация: 232 Сообщения: 2696 Откуда: Ракслатенон Зарегистрирован: 09.08.2005
 |
|
что-то не пойму, почему Exel игнорит закрытие цикла For.. Next
Код: |
Private Sub Workbook_Open()
Dim newa, i, k, index As Integer
Dim switch As Boolean
Dim wordTofind As String, listName As String, lLastrow As Integer
listName = ThisWorkbook.ActiveSheet.Name
lLastrow = Cells(Rows.Count, 1).End(xlUp).Row
For index = 2 To lLastrow
Cells.Find(What:="value", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
k = ActiveCell.Row
Dim Strr As String
Strr = ActiveCell.Value
Strr = Replace(Strr, "<value>", "")
Strr = Replace(Strr, "</value>", "")
Cells(k, 2).Value = Val(Strr)
Next
End Sub |
гоняет по кругу и не парится, что цикл закончился. может где в настройках чего не то?
p.s. на работе всё нормально завершает. на домашнем компе - крутит счётчик.
Последний раз редактировалось: Снуч (20:11 18-02-2012), всего редактировалось 3 раз(а) |
|
|
Криптон
1011 EGP
       Рейтинг канала: 5(116) Репутация: 164 Сообщения: 2667 Откуда: Москва Зарегистрирован: 05.04.2008
 |
|
А если исправить
Next
на
Next index
?
|
|
|
Снуч
941 EGP
   Рейтинг канала: 5(100) Репутация: 232 Сообщения: 2696 Откуда: Ракслатенон Зарегистрирован: 09.08.2005
 |
|
всё гениальное просто.
но, в двойном цикле такое не прокатывает
Код: |
Private Sub Workbook_Open()
Dim newa, i, k, index As Integer
Dim switch As Boolean
Dim wordTofind As String, listName As String, lLastrow As Integer
listName = ThisWorkbook.ActiveSheet.Name
' çàïîìèíàåì íîìåð ïîñëåäíåé çàïîëíåííîé ÿ÷åéêè â ñòîëáöå À
lLastrow = Cells(Rows.Count, 1).End(xlUp).Row
For index = 2 To lLastrow
Cells.Find(What:="measuringchannel", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
For i = 1 To 145
Cells.Find(What:="value", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
' îáðàáàòûâàåì ñòðî÷íîå çíà÷åíèå òàê, ÷òîáû îñòàëîñü ëèøü ÷èñëî
k = ActiveCell.Row
Dim Strr As String
Strr = ActiveCell.Value
Strr = Replace(Strr, "<value>", "")
Strr = Replace(Strr, "</value>", "")
Cells(k, 2).Value = Val(Strr)
Next i
Next index
End Sub |
добавлено спустя 7 минут:
п.с. дело в том, что считывается содержимое ХМЛ документа в А столбец построчно, строки примерно такие:
Код: |
<measuringchannel example for>
<trampampam>
<value>1111</value> |
p.s. пока что влом писать/искать ХМЛ-парсер, но если придется то ладно..
Последний раз редактировалось: Снуч (20:52 18-02-2012), всего редактировалось 3 раз(а) |
|
|
Криптон
1011 EGP
       Рейтинг канала: 5(116) Репутация: 164 Сообщения: 2667 Откуда: Москва Зарегистрирован: 05.04.2008
 |
|
[режим занудствования включён]
Не хватает описания:
1)Что ожидалось получить
2)Что наблюдается в реале
"такое не прокатывает" - слишком расплывчато
Последний раз редактировалось: Криптон (21:07 18-02-2012), всего редактировалось 1 раз |
|
|
Снуч
941 EGP
   Рейтинг канала: 5(100) Репутация: 232 Сообщения: 2696 Откуда: Ракслатенон Зарегистрирован: 09.08.2005
 |
|
ожидалось: чтобы оба цикла выполнились и случился End Sub
наблюдается: после открытия файла, основной цикл повторяется до бесконечности, то есть index доходит до lLastrow и заново.. на работе такое не случалось, но там office2003, а дома 2007. соответственно, exel и vba соответствуют.
|
|
|
Криптон
1011 EGP
       Рейтинг канала: 5(116) Репутация: 164 Сообщения: 2667 Откуда: Москва Зарегистрирован: 05.04.2008
 |
|
Я, видимо, чего-то не понимаю, но смысл макроса представляется мне достаточно загодочным.
Значит, как я вижу ситуацию:
За один проход внешнего цикла мы отыскиваем первую (от текущей активной ячейки) ячейку, содержащую "measuringchannel".
Далее мы находим 145 следующих ячеек, содержащих "value". Если ячеек с "value" не хватает, то поиск начинается с первой строки листа.
И всю эту бодягу мы повторяем (<кол-во заполненных строк> -1) раз, что как минимум в 145 раз больше необходимого.
Не удивительно, что курсор мечется по таблице сверху вниз раз за разом.
Но, возможно, я и в самом деле нифига не понимаю. Сколько строк в файле? Сколько раз там повторяется measuringchannel? Верно ли, что между всеми measuringchannel ровно 145 value?
добавлено спустя 5 минут:
На тестовом файле из 20 строк 2755 прогонов внутреннего цикла
Последний раз редактировалось: Криптон (21:52 18-02-2012), всего редактировалось 2 раз(а) |
|
|
Снуч
941 EGP
   Рейтинг канала: 5(100) Репутация: 232 Сообщения: 2696 Откуда: Ракслатенон Зарегистрирован: 09.08.2005
 |
|
Криптон : |
За один проход внешнего цикла мы отыскиваем первую (от текущей активной ячейки) ячейку, содержащую "measuringchannel".
Далее мы находим 145 следующих ячеек, содержащих "value". Если ячеек с "value" не хватает, то поиск начинается с первой строки листа.
|
нашли указатель, один из двух (А+ и Р+), далее считали значения и преобразовали текст к цифровому значению. далее следует хитрость с true-false, и снова мы на на указателе, после которого считывается 146 ячеек, треть из которых с тегами value, и так далее до последней строки в столбце А. но вот ведь, после прохода по всем ячекам цикл запускается заново... может вначале макроса указать, чтобы стопился по признаку какому? а то первый цикл он заканчивает, а потом заново его начинает..
|
|
|
Криптон
1011 EGP
       Рейтинг канала: 5(116) Репутация: 164 Сообщения: 2667 Откуда: Москва Зарегистрирован: 05.04.2008
 |
|
Но мы же не перебираем все ячейки. Мы всё время ищем соответствующие критериям.
Я бы предложил такой вариант, с заменой For...next на do...loop until:
Код: |
Private Sub Workbook_Open()
Dim newa, i, k, index,MRow As Integer
Dim switch As Boolean
Dim wordTofind As String, listName As String, lLastrow As Integer
listName = ThisWorkbook.ActiveSheet.Name
' caiiieiaai iiia? iineaaiae caiieiaiiie y?aeee a noieaoa A
lLastrow = Cells(Rows.Count, 1).End(xlUp).Row
MRow = 0
Do
Cells.Find(What:="measuringchannel", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
i = 1
if ActiveCell.Row>MRow then
MRow = ActiveCell.Row
End If
Do
Cells.Find(What:="value", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
' ia?aaaouaaai no?i?iia cia?aiea oae, ?oiau inoaeinu eeou ?enei
k = ActiveCell.Row
Dim Strr As String
Strr = ActiveCell.Value
Strr = Replace(Strr, "<value>", "")
Strr = Replace(Strr, "</value>", "")
Cells(k, 2).Value = Val(Strr)
i = i + 1
Loop Until (i > 145) Or (ActiveCell.Row >= lLastrow) Or (ActiveCell.Row < MRow)
Loop Until (ActiveCell.Row >= lLastrow) Or (ActiveCell.Row < MRow)
End Sub
|
добавлено спустя 1 минуту:
Конечно, это всё равно не идеальный вариант, но, по-моему, лучше предыдущего.
добавлено позже
внесены исправления
Последний раз редактировалось: Криптон (23:54 18-02-2012), всего редактировалось 3 раз(а) |
|
|
Dimaxx
1016 EGP
      Рейтинг канала: 8(898) Репутация: 204 Сообщения: 5812 Откуда: Северодвинск Зарегистрирован: 26.06.2002
 |
|
Снуч : |
пока что влом писать/искать ХМЛ-парсер
|
А зачем искать, когда в винде есть свой хмл. В редакторе в меню Tools - References. Там отметить галочкой "Microsoft XML, v3.0". Далее пишем нечто подобное (делал для парсинга цен на миники в EVE):
Код: |
Private Sub Workbook_Open()
Dim XMLDoc As DOMDocument
Dim ObjectNodeList As IXMLDOMNodeList
Dim ObjectNode As IXMLDOMElement
Dim PropertyNode As IXMLDOMElement
Dim S1, S2 As String
Dim I
Set XMLDoc = New DOMDocument
XMLDoc.Load "http://api.eve-central.com/api/evemon/"
I = Timer
Do While Timer < I + 3
DoEvents ' обеспечивает параллельное выполнение других процессов
Loop
Set ObjectNodeList = XMLDoc.documentElement.selectNodes("mineral")
If ObjectNodeList.Length > 0 Then
For Each ObjectNode In ObjectNodeList
For Each PropertyNode In _
ObjectNode.selectNodes("name")
S1 = LCase(PropertyNode.Text)
Next
For Each PropertyNode In _
ObjectNode.selectNodes("price")
S2 = PropertyNode.Text
Next
If S1 = "tritanium" Then
ThisWorkbook.Worksheets("Data").Range("C50").Value = S2
End If
If S1 = "pyerite" Then
ThisWorkbook.Worksheets("Data").Range("D50").Value = S2
End If
If S1 = "mexallon" Then
ThisWorkbook.Worksheets("Data").Range("E50").Value = S2
End If
If S1 = "isogen" Then
ThisWorkbook.Worksheets("Data").Range("F50").Value = S2
End If
If S1 = "nocxium" Then
ThisWorkbook.Worksheets("Data").Range("G50").Value = S2
End If
If S1 = "zydrine" Then
ThisWorkbook.Worksheets("Data").Range("H50").Value = S2
End If
If S1 = "megacyte" Then
ThisWorkbook.Worksheets("Data").Range("I50").Value = S2
End If
If S1 = "morphite" Then
ThisWorkbook.Worksheets("Data").Range("J50").Value = S2
End If
Next
End If
End Sub |
_________________ "Если мы не покончим с войной, война покончит с нами." Г. Г. Уэллс
Последний раз редактировалось: Dimaxx (23:27 18-02-2012), всего редактировалось 1 раз |
|
|
Снуч
941 EGP
   Рейтинг канала: 5(100) Репутация: 232 Сообщения: 2696 Откуда: Ракслатенон Зарегистрирован: 09.08.2005
 |
|
референсы не помогают - придётся изучать DOM-модель под VBA.
Последний раз редактировалось: Снуч (15:42 21-02-2012), всего редактировалось 1 раз |
|
|
3d.Maxuz
1032 EGP
    Рейтинг канала: 3(25) Репутация: 47 Сообщения: 6023 Откуда: Краматорск, Донецкая область! Зарегистрирован: 28.09.2004
 |
|
Есть задача - раскидать значения с одного листа в заданные ячейки других листов этой же книги.
Исходные данные.
Столбец А с названиями листов.
Столбец B со значениями для каждого листа.
Нужно значения установить в ячейку А1 на каждом из листов данного списка.
добавлено спустя 34 минуты:
Пытался и вручную записать похожий макрос, но тогда получаются фиксированные указатели на листы, и значения.
Может кто с кодом помочь?
_________________ Гоп-стоп, мы подошли из-за угла,
Гоп-стоп...
Последний раз редактировалось: 3d.Maxuz (14:46 05-09-2014), всего редактировалось 1 раз |
|
|
Voha
942 EGP
          Рейтинг канала: 9(1062) Репутация: 169 Сообщения: 4978 Откуда: Moscow, Russia Зарегистрирован: 15.02.2001
 |
|
Лень меня сподвигает вопросить помощи коллективного разума. А то перлом я могу, а вбс-ом как-то не очень, читать надо всякое За помощь - спасибки, ежопки, пиво-шоколадки (это если меня поймать ) и просто благодарность.
Вводная: есть клетка с произвольным образом представленным телефонным номером. 1234567890 или 123-456-7890 или 8(123)456-78-90 или +7123 456-7890 или 7 123 45 67890 или еще как-то.
Нужно: нажатием комбинации клавиш (типа Ctrl+Ж) превратить ее содержимое в текст вида +7(123)4567890. Т.е. из строки в ячейке выбрать цифры, 7 штук справа поставить подряд, 8-10-ю справа взять в скобки, полученный набор вида (123)4567890 дополнить слева +7 и получившееся +7(123)4567890 поместить в ту же ячейку. Если цифр меньше 10 или больше 11 - хрюкнуть звуковым сигналом и не делать с содержимым ничего. Хрюкать - опционально, можно просто не делать ничего.
Ограничения: использовать чудеса "Формат ячеек -> Дополнительный -> номер телефона" (как и вообще "Формат ячеек") нельзя. Формат должен остаться обычным текстом.
_________________ Time will show... |
|
|
3d.Maxuz
1032 EGP
    Рейтинг канала: 3(25) Репутация: 47 Сообщения: 6023 Откуда: Краматорск, Донецкая область! Зарегистрирован: 28.09.2004
 |
|
Voha : |
а вбс-ом как-то не очень,
|
это решается не вбсом, а формулами. Сейчас у самого времени нет, но на вскидку "заменить" плюс поискпозиции. Поройся в описании текстовых формул. А вобще для начала хорошо бы привести все к единому виду, поубирав тире, скобки, пробелы и плюсы через найти и заменить.
_________________ Гоп-стоп, мы подошли из-за угла,
Гоп-стоп... |
|
|
Voha
942 EGP
          Рейтинг канала: 9(1062) Репутация: 169 Сообщения: 4978 Откуда: Moscow, Russia Зарегистрирован: 15.02.2001
 |
|
3d.Maxuz : |
А вобще для начала хорошо бы привести все к единому виду, поубирав тире, скобки, пробелы и плюсы через найти и заменить.
|
Not a chance. Т.е. так конечно можно, если у тебя стопиццот клеток с телефонами и нужно их все рано или поздно привести к единому формату. Но workflow, где применяется задача - он другой. Необходимо в один момент времени одну клетку модифицировать. Это автоматизация одной, но достаточно часто случайно встречающейся операции - и хочется, чтоб выполнялась она не сложнее вставки текущей даты.
Собственно, по этим же причинам она и формулами не решается. Да и исходник строк чуть шире - в нем может быть текст ("тел. 1234567890" или "81234567890, Сергей")
_________________ Time will show... |
|
|
ratmane2012
284 EGP
  Рейтинг канала: 4(86) Репутация: 29 Сообщения: 774 Откуда: Красная планета Зарегистрирован: 03.07.2012
 |
|
Вопросик такой. У меня есть огромная страница ссылок в Ворде, но они не кликабельны, то есть не гиперссылки. Можно ли их как-то все выделить и какой-нибудь комбинацией клавишь превратить в гиперссылки? Иначе мне приходится ставить курсор после каждой ссылки и нажимать энтер, чтобы она стала гиперссылкой..
|
|
|
Grebomet
1466 EGP
      Рейтинг канала: 8(759) Репутация: 261 Сообщения: 4788 Откуда: Питербурх Зарегистрирован: 06.01.2003
 |
|
ratmane2012 : |
Можно ли их как-то все выделить и какой-нибудь комбинацией клавишь (убил бы!) превратить в гиперссылки?
|
Комбинацией клавиш - нет.
Можно сконвертировать скриптом, но для этого его надо сначала написать.
Вот тут народ под конкретный случай что-то писал, но оно не очень работало: http://stackoverflow.com/questions/17119497/word-macro-to-convert-text-into-hyperlinks
_________________ Классическая ошибка, которую совершают проектировщики абсолютно надежных систем, – недооценка изобретательности клинических идиотов. |
|
|
ratmane2012
284 EGP
  Рейтинг канала: 4(86) Репутация: 29 Сообщения: 774 Откуда: Красная планета Зарегистрирован: 03.07.2012
 |
|
Жалко, спасибо - скрипты я тоже не умею писать..
|
|
|
Dimaxx
1016 EGP
      Рейтинг канала: 8(898) Репутация: 204 Сообщения: 5812 Откуда: Северодвинск Зарегистрирован: 26.06.2002
 |
|
Проще простого (для 2003 офиса). Выделяем весь текст со ссылками. Идем Формат -> Автоформат. Жмем ОК и получаем тучу ссылок.
_________________ "Если мы не покончим с войной, война покончит с нами." Г. Г. Уэллс |
|
|
|
|
|
Железный канал: «Office» |
|