Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 2)

Автор: AndVGri
Дата сообщения: 01.12.2007 13:28
kalinakrasnay
Попробуй вот это
Set dial = Dialogs(wdDialogFileOpen)
поменять на вот это
Set dial = wd.Dialogs(wdDialogFileOpen)
Dialogs есть и у Excel.
Автор: kalinakrasnay
Дата сообщения: 01.12.2007 14:12
AndVGri

Цитата:
поменять на вот это
Set dial = wd.Dialogs(wdDialogFileOpen)
Dialogs есть и у Excel.


О, а вот это сработало (в купе с очисткой переменных)! проблема решена! спасибочки большое AndVGri и Troitsky!!!!!


Автор: TONADOOM
Дата сообщения: 01.12.2007 15:43
Помогите!
EXCEL работает с XML файлами, но есть такая засада что он воспинимает XML файлы исключительно в кодировке ЮНИКОД ... а ко мне они поступают в ANSI (через SOAP).
как ни искал не нашел ничего, что из кода на VBA перекодирует из ANSI в юникод файл на диске.
Буду признателен за любые советы как перекодировать файл (он может быть и .txt)
Автор: CEMEH
Дата сообщения: 01.12.2007 16:37
ВОПРОС

После переустановки винды макрос не работает. В чем может быть проблемма? Может какие еще надо было файлы сохранить или в реестре что подредактировать.

Если создать новую книгу и в не тупо скопировать листы код и формы из "нерабочей" то все работает нормально.
Автор: AndVGri
Дата сообщения: 01.12.2007 16:40
TONADOOM
Можешь сконвертировать хотя бы таким кодом в unicod. Или несколькими страницами назад были варианты чтения через API

Код:
Public Sub Convert()
Dim fso As New Scripting.FileSystemObject
Dim fStream As Scripting.TextStream
Dim Content As String

Set fStream = fso.OpenTextFile("d:\2.xml", ForReading)
Content = fStream.ReadAll
fStream.Close
Set fStream = fso.CreateTextFile("d:\2unicode.xml", True, True)
fStream.Write (Content)
fStream.Close
End Sub
Автор: TONADOOM
Дата сообщения: 01.12.2007 17:12
AndVGri
Спаcибо, но у меня не запускается ...
а где находится
Цитата:
Scripting
,
т.е. что подключить через tools/references в VBA

Автор: AndVGri
Дата сообщения: 01.12.2007 17:28
TONADOOM
Microsoft Scripting Runtime
Автор: TONADOOM
Дата сообщения: 01.12.2007 17:33
AndVGri
Спасибо, помогло - то что надо!
Автор: CEMEH
Дата сообщения: 02.12.2007 12:24
ВОПРОС

Dim word_ As Word.Application
Set word_ = New Word.Application
word_.Documents.Add ' создаем новый документ Word
word_.Visible = True ' делаем документ Word видимым
word_.Selection.TypeText Text:="абвгд"'печатаем текст
word_.ChangeFileOpenDirectory "C:\EXPL\ПАПКА\"'ВЫБИРАЕМ ПУТЬ
word_.ActiveDocument.SaveAs Filename:=NAME & ".doc"'СОХРАНЯЕМ С ИМЕНЕМ
word_.Documents.Close'закрываем

Но вот окно документа Word закрывается, а сам word остается. Т е мне надо совсем закрыть ворд, а не только документ. Макрос создает много таких документов и все они очень сильно грузят память. А мне надо после создания и сохранения закрыть его полностью.
Автор: AndVGri
Дата сообщения: 02.12.2007 13:22
CEMEH
Так сложно посмотреть на предыдущую страницу? Troitsky писал по сему поводу
Автор: CEMEH
Дата сообщения: 02.12.2007 14:32
AndVGri
Упс...

Спасибо!
Автор: Ergistael
Дата сообщения: 03.12.2007 13:13
SAS888

Цитата:
Безусловно, непосредственную задачу от hackman этот метод решит, но все зависит от того, зачем это надо. Предложенный мной макрос, кроме изменения стиля ссылки, легко разделяет строку формулы на источник ссылки и, непосредственно, ячейку. Может это пригодится для решения дальнейшей задачи.


Не соглашусь, поскольку мой вариант универсальнее и быстрее; кроме того, он не требует наличия наименований листов, работает и с текущим, ведь у Вас же ищется разделитель "!" (а восклицательный знак, в свою очередь, может просто присутствовать в виде текстовой строки в формуле и не являться признаком листа)...

PS: я все еще работаю над автоматическим получением массива ссылок из формулы, в т.ч. с различных листов, абсолютных и относительных. Вам спасибо за функцию split, возможно, пригодится...
Автор: SAS888
Дата сообщения: 04.12.2007 04:00
Ergistael
Согласен с Вами. Может подскажешь наиболее рациональный способ, как в ячейке, содержащей ссылку, изменить источник ссылки? Например, вместо "=[AAA]Sheet1!$A$1" нужно "=[BBB]Sheet2!$A$1", или в общем виде: вместо X!Address получить Y!Address, с учетом того, что X и Y могут содержать символ "!".
Автор: abasov
Дата сообщения: 04.12.2007 09:41
В ячейке: Иванов Иван Иванович
Как преобразовать каждое слово в отдельный столбец?
Автор: SAS888
Дата сообщения: 04.12.2007 10:10
abasov
С помощью метода TextToColunms.
Автор: abasov
Дата сообщения: 04.12.2007 10:31
SAS888
Можно примерчик небольшой?
Автор: SAS888
Дата сообщения: 04.12.2007 10:41
abasov
Например, пусть нужно слова в строке из ячейки A1, разделенные пробелами (Иванов Иван Иванович) разделить по столбцам в ячейках A1, B1, C1. Тогда так:
Range("A1").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, ConsecutiveDelimiter:=True, Space:=True
Автор: abasov
Дата сообщения: 04.12.2007 10:44
SAS888
Спасибо огромное!
Автор: Anastasya
Дата сообщения: 04.12.2007 15:23
Мне нужно подсчитать число ячеек, в которых текст выделен жирным.

Подскажите, как написать в Excel VBA


Код:
For each cell in Selection {

if (cell.Font.Bold = True) Range("A1").Value=+1

}
Автор: SokolSG
Дата сообщения: 04.12.2007 15:39
Anastasya

For each cell in Selection {

if (cell.Font.Bold = True) Range("A1").Value=Range("A1").Value+1

}
Автор: AndVGri
Дата сообщения: 04.12.2007 15:40
Anastasya
Это ж не С, не Java

Код:
Dim cell As Object
'...
For Each cell In Selection
If cell.Font.Fold Then Range("A1").Value = Range("A1").Value + 1
Next cell
Автор: Ergistael
Дата сообщения: 04.12.2007 17:47
SAS888
Цитата:
Может подскажешь наиболее рациональный способ, как в ячейке, содержащей ссылку, изменить источник ссылки? Например, вместо "=[AAA]Sheet1!$A$1" нужно "=[BBB]Sheet2!$A$1", или в общем виде: вместо X!Address получить Y!Address, с учетом того, что X и Y могут содержать символ "!".

Вопрос, в принципе, понятный, но конкретная постановка задачи может сильно облегчить/затруднить решение. Я так понимаю, что в данном случае к символам "!", "[", "]" можно привязаться? Тогда, ИМХО, алгоритм может быть похож на тот, что ты писал для hackman'a:

1. Ищем в текстовой строке с формулой символ "[", запоминаем позицию
2. Ищем "!", запоминаем позицию
3. Повторяем пп.1-2 (позиция начала каждого поиска - конец предыдущего найденного), пока не нашли всех таких кусочков
4. Меняем с помощью функции REPLACE() части между начальной и конечной позициями в строке, начиная С КОНЦА строки (чтобы позиции символов не поехали).

(Т.е. разбивать ВСЮ строку на кусочки, заменять один и склеивать опять - не нужно).

PS: я вообще не специалист, поэтому не могу претендовать на оптимальное решение, но сам взялся за сложную задачу, т.ч. уже немного поднаторел, а кроме того, решение приходит в процессе обсуждения, т.ч. дополняй, уточняй, в т.ч. по конкретным функциям...

PPS: очень неудобный формат форума для обсуждений. Предпочитаю programmersforum (дот) ру, в соотв. ветке, я там Alkaline.
Автор: dneprcomp
Дата сообщения: 04.12.2007 19:41
Ergistael
Цитата:
ведь у Вас же ищется разделитель "!" (а восклицательный знак, в свою очередь, может просто присутствовать в виде текстовой строки в формуле и не являться признаком листа)...
Может лучше комбинацию !$ искать?
Автор: Ergistael
Дата сообщения: 04.12.2007 23:15
to dneprcomp

Ну-у-у, в принципе, да. Вероятность встретить в формуле "!$" просто так, без ссылок, существенно меньше, чем просто "!". Но, по-хорошему, нужно решить вопрос однозначно. Или предусмотреть обработку ошибок, а это уже зависит от задачи.
Автор: dneprcomp
Дата сообщения: 04.12.2007 23:31
Ergistael

Цитата:
Вероятность встретить в формуле "!$" просто так, без ссылок, существенно меньше, чем просто "!".
Не просто существенно меньше. Такое сочетание однозначно трактуется программой как служебная информация, т.е должно быть уникально и не двусмысленно. При использовании !$ не в написании адреса должна выскочить ошибка.
Хотя да, если это часть стринга и стринг, скажем, стоит в if перед адресом... Но это очень уж уникальная ситуация. Можно и не рассматривать.
Автор: SAS888
Дата сообщения: 05.12.2007 03:58
dneprcomp

Цитата:
Может лучше комбинацию !$ искать?

А может проще с помощью "DirectPrecedents" определить адрес, а потом сцепить его с нужной ссылкой? Вроде бы это надежнее.
Автор: Ergistael
Дата сообщения: 05.12.2007 09:40
SAS888

Это, имхо, неоправданно: во-первых, (direct)precedents не затрагивает другие листы. Во-вторых, простейшая формула "=СУММ(G15:G19)*СУММ(H15:H19)" в качестве DirectPrecedents выдает $G$15:$H$19, не говоря уже про вариант с полным вхождением одного диапазона в другой.
Автор: volidol1
Дата сообщения: 05.12.2007 09:43
Народ, помогите!
Ситуация следующая Range("A1:H200").Columns.AutoFit устанавливает на экране "красивые" ширины колонок. Однако, при просмотре перед печатью и в печати некоторые числа заменяются на ####.##. Шрифт ячеек использовал моноширинный: Courier New. Формат ячеек, правда, не простой: _(* # ##0_);_(* (# ##0);_(* "-"??_);_(@_). Как решить эту проблему с помощью VBA?
Автор: SAS888
Дата сообщения: 05.12.2007 10:16
Ergistael

Цитата:
вариант с полным вхождением одного диапазона в другой.

Что именно находится в ячейке легко выяснить. Речь идет о ссылке, а не о формуле. Именно в этом случае DirectPrecedents сработает корректно. т.е. ссылку на лист и книгу мы подставляем сами, а адрес как раз и возвратит DirectPrecedents.

Добавлено:
volidol1

Цитата:
Шрифт ячеек использовал моноширинный

Если кол-во символов в ячейке одинаковое, но в одном случае строка входит в ячейку, а в другом нет, то, по-видимому, причина в том, что сами символы отличаются по ширине друг от друга. При предпросмотре (привязке к принтеру), картинка может не совпадать. Выход - увеличивать ширину столбца, или менять шрифт.
Автор: Ergistael
Дата сообщения: 05.12.2007 11:21
SAS888
Мне как бы все равно, но, так или иначе, не догоняю. Допустим, в ячейке A1 формула =B1+C1+D1. Тогда DIrectPrecedents выдаст диапазон $B$1:$D$1. И чего с ним делать?

Далее, в ячейке A1 листа Лист1 формула "=Лист3!B1+Лист3!C1+Лист3!D1". DIrectPrecedents не выдаст вообще ничего (только ошибку).

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.