Сперва почитал, потом на форум обратился. Не всегда получается прочесть документацию от корки до корки. Может кто-нибудь прочёл больше. Буду очень благодарен, если не затруднит поделиться. А за полезный совет, хоть и повторённый, спасибо конечно. Но, думаю, любому читателю было бы интересней посмотреть ответы по существу. Если по теме, только через LoadXML получилось добавить предварительно собранный нод и без создания объекта через оператор with.
написал: Или нужно последовательно собирать нод Row
Спасибо за отклик и совет . Но это понятно. Тут как раз таки последовательно собирается Row, о чём я указал в стартовом сообщении. Нельзя ли как нибудь-будь без семи первых строк обойтись? То есть аля: nodRoot.appendChild MagicMethod("<Row><X>2</X><Y>f</Y><Row>")
написал: Пытаюсь сделать добавление noda таким образом Например имеем xml такого вида <Root><Row><X>1</X><Y>f</Y><Row></Root> Хочу добавить новый Row
Код
[URL=#]?[/URL] 1 2 3 4 5 6 7 8 9 10 11 12 13 Dim xmlDoc As DOMDocument Dim nodRoot As IXMLDOMElement Dim nodChild As IXMLDOMText Set xmlDoc = New DOMDocument xmlDoc.setProperty "SelectionLanguage" , "XPath" xmlDoc.async = False xmlDoc.Load ( "D:\xmlname.xml" ) Set nodRoot = xmlDoc.getElementsByTagName( "Root" ).Item(0) Set nodChild = xmlDoc.createTextNode( "<Row><X>2</X><Y>r</Y>" ) nodRoot.appendChild nodChild
Получаю в результате: <Root><Row><X>1</X><Y>f</Y><Row><Row><X>2</X><Y>f</Y><Row></Root> Прошу подсказать как можно конвертировать строку в нод для корректного добавления. Есть ли такая возможность? Или нужно последовательно собирать нод Row, либо через клонирование и изменение?
Получил желаемый результат, добавив дополнительно объёкт DOMDocument. Загрузил туда текст нода Row с помощью LoadXML и добавил элемент через appendChild. Может быть всё-таки есть другой способ?
Пытаюсь сделать добавление noda таким образом Например имеем xml такого вида <Root><Row><X>1</X><Y>f</Y><Row></Root> Хочу добавить новый Row
Код
Dim xmlDoc As DOMDocument
Dim nodRoot As IXMLDOMElement
Dim nodChild As IXMLDOMText
Set xmlDoc = New DOMDocument
xmlDoc.setProperty "SelectionLanguage", "XPath"
xmlDoc.async = False
xmlDoc.Load ("D:\xmlname.xml")
Set nodRoot = xmlDoc.getElementsByTagName("Root").Item(0)
Set nodChild = xmlDoc.createTextNode("<Row><X>2</X><Y>r</Y>")
nodRoot.appendChild nodChild
Получаю в результате: <Root><Row><X>1</X><Y>f</Y><Row><Row><X>2</X><Y>f</Y><Row></Root> Прошу подсказать как можно конвертировать строку в нод для корректного добавления. Есть ли такая возможность? Или нужно последовательно собирать нод Row, либо через клонирование и изменение?
Собственно сабж. Открываю файл и в итоге вижу в дебагере вызов обработчика открытия книги в открываемом файле. Что мне совсем не нужно. Как-то можно добиться, чтобы макросы не запускались? Получится ли это через GetObject. Использую её, чтобы файл открывался фоново
Собственно сабж. Задача заключается в том, чтобы выяснить входит ли произвольная строка в Combobox. Это можно бы было проверить, определив индекс этой строки в Combobox. Или такового метода в данном компоненте нет и единственный путь - это поиск строки в цикле?
В определённые моменты работы за компьютером текстовые файлы около 60, 90 и 190 МБ при помощи FSO либо читаются, либо не читаются. А именно, вчера вечером читался только файл около 60 МБ, а сегодня после вкл/выкл компьютера прочитался и файл 190 МБ. Чтение в одном приложении осуществлялось таким образом:
Код
With New FileSystemObject
txt=.OpenTextFile(sPath).ReadAll
End With
Быть может в этом причина? Тут память используется, но принудительно не освобождается. Или не на то грешу? Ведь в течение дня я наталкивался на ошибки с процедурами, где использовался тот же FSO, и порой прерывал работу макросов с помощью диспетчера задач. Может быть в этом собака зарылась? Или, например, можно ли делать вот так:
Код
Public Sub ReplaseFileContent(sFPSource$, sFPDestination$)
With New FileSystemObject
.CreateTextFile(sFPDestination, True).Write .OpenTextFile(sFPSource, Forreading).ReadAll
End With
End Sub
Процедура работает нормально, но нет ли тут утечки памяти?
Казанский, благодарю за помощь, но не вышло Проверил на таком примере. Notepad++ запустился и им подряд было выдано два сообщения: 1) --------------------------- Keep non existing file --------------------------- The file "Путь .xlsm"\Новая" doesn't exist anymore. Keep this file in editor? --------------------------- Да Нет --------------------------- 2) --------------------------- Create new file --------------------------- D:\_Tests\имя doesn't exist. Create it? --------------------------- Да Нет ---------------------------
Благодарю за ответы. Казанский, не принципиально куда писать, можно писать во множество разных ячеек указанными путями. Суть в накоплении времени. Ответ вы дали исчерпывающий, благодарю)
Дано: координаты ячейки (r,c), и координаты этой ячейки (x,y) относительно другой ячейки, по которой заведомо инициализирован объект R. Будет ли разница в скорости между операциями: Cells(r,c)=10 и R.offset(x,y)=10? Или сии операции в случае их многократного повторения одинаково затратны по времени?
Прошу прощения, что в начале ввёл в заблуждение, сам заблудился. Но вот от новой проблемы не легче. Как же до файлов, с которыми фунция поработала, добраться?
Sub Test()
'On Error GoTo ErrorHandler
Dim Wb As Workbook
Set Wb = GetObject("D:\Book\2.xlsx")
MsgBox Wb.Worksheets(1).[B1]
Wb.Worksheets(1).[B1] = 333
Wb.Close True
Set Wb = Nothing
End Sub
Проверил GetObject повторно. Берёт книгу из другого приложения и работает с ней, не взирая на недоступность самого экземпляра excel - хозяина книги. При предыдущей проверке макрос завис и был поспешно сделан вывод, вынесенный в данную тему. Однако позже, файлы, с которыми эта функция работала, почему-то не открываются!
Это происходит, если закрыть книгу через объект таким образом: Wb.Close True
Здесь обнаружил полезную функцию. Благодарю за это Игоря). К сожалению, она не работает в обозначенном в названии темы случае. Данный случай возможен, если открыть книгу в новом экземпляре Excel и тогда она недоступна для функции GetObject. Можно ли сделать сабж или единственный выход - прикрутить в макросе сообщение: "книга открыта в другом приложении, для продолжения работы закройте это приложение". Либо выполнить работу за пользователя и снести все открытые эксели, в том числе хозяина макроса?
Без обработки ошибок их источники выделяются. Хотелось бы уже настроить обработчики ошибок в процедурах, но и не лишиться указанной функции, а получать координаты ошибочных участков кода
Для обозначенной в теме цели хорошо подходит ListBox, тем более требуется выбор из заведомо установленного списка. Свойству MatchEntry присваивается 1 (fmMatchEntryComplete). После этого, когда ListBox в фокусе, при вводе данных с клавиатуры в окне ListBox выделяется строка, первые символы которой совпадают с вводимой последовательностью. Один недостаток, выделение появляется внизу видимой части списка. Как добиться, чтобы выделение появлялось в вверху видимой в окне ListBox части списка? Пример во вложении