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

» Excel VBA (часть 3)

Автор: Lovec
Дата сообщения: 22.10.2010 10:16
Можно ли как то в VBA не просто акивировать лист и нужную ячейку, типа


Код:
Worksheets(1).Activate
Range("BU54").Select
Автор: SAS888
Дата сообщения: 22.10.2010 10:54
Lovec
Очень просто можно сделать активную ячейку верхней левой в окне. Например так:

Код: Application.Goto Reference:=Sheets(1).[BU54], scroll:=True
Автор: Flex_Dj
Дата сообщения: 22.10.2010 10:59
Доброго дня!

Помогите пожалуйста! Есть выгруженная в xml файл база данных, колличество записей в ней больше 65536, мне необходимо загрузить данные из этого xml в любую базу данных, например в dbase3.
Проблема с чтением xml файла.
С DOMDocument никак не могу разобраться, не удается найти подходящиего примера...
Пробовал читать из xml как из обычного текстового файла, но сдесь засада - в некоторых записях есть кавычки, которые при записи в базу данных выглядят так "
Пожалуйста, ткните меня носом )

файл xml типа:
==========================
<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' xmlns:rs='urn:schemas-microsoft-com:rowset' xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly' rs:updatable='true'>
<s:AttributeType name='IDPLAT' rs:number='1' rs:nullable='true' rs:writeunknown='true'>
<s:datatype dt:type='string' dt:maxLength='20' rs:dbtype='str' />
</s:AttributeType>
<s:extends type='rs:rowbase' />
</s:ElementType>
</s:Schema>
<rs:data>
<z:row IDPLAT='310262528800034' />
</rs:data>
</xml>
============================
Автор: DANYA198
Дата сообщения: 23.10.2010 05:52
smirnvlad
Большое спасибо!

Ещё небольшой вопрос:

Как можно записать: если в активной книге есть лист с названием "1", - удалить лист. Если нет, - ничего не делать. ?

Автор: smirnvlad
Дата сообщения: 23.10.2010 06:15
DANYA198
лист не удалится если он единственный в книге

Код:
Application.DisplayAlerts = False
On Error Resume Next
ActiveWorkbook.Sheets("1").Delete
On Error GoTo 0
Application.DisplayAlerts = True
Автор: DANYA198
Дата сообщения: 23.10.2010 06:41
smirnvlad
Большущее спасибо!
Автор: Kiljes
Дата сообщения: 23.10.2010 10:08
AndVGri

Цитата:
Kiljes
Где-то так
Подробнее...

Что то не помогает. Виснет.
Автор: AndVGri
Дата сообщения: 23.10.2010 15:54
Kiljes
Виснет на чём, где? Пройдись пошагово
Автор: smirnvlad
Дата сообщения: 24.10.2010 12:46
Flex_Dj
В Excel 2010 и Excel 2007 размер листа составляет 16 384 столбца на 1 048 576 строк
или через Access
Автор: yls
Дата сообщения: 24.10.2010 15:53
В ячейку вставлен элемент ActiveX "Поле со списком". Если скрыть столбец с этой ячейкой, а затем сохранить документ, то после его открытия и восстаносления видимости скрытого столбца "Поле со списком" исчезает. Это происходит в Excel 2010. В версиях 2007 и более ранних такой проблемы не наблюдается - элементы ActiveX прекрасно сохраняются в скрытых столбцах. Как заставить Excel 2010 сохранять элементы ActiveX в скрытых столбцах?
Автор: DANYA198
Дата сообщения: 24.10.2010 20:09
Доброго времени суток!
Вопрос у меня следующий:

Есть столбец с ФИО. Некоторые из ФИО могут повторяться с некоторыми различиями: т.к. столбец делают несколько людей, то один человек может занести, например, "Андрияшкин О.А." а другой человек - "Андрияшкин О." Моя задача - найти такие различия, и исправить их, чтобы одинаковые ФИО совпадали. Т.е. в приведённом выше примере надо исправить с "Андрияшкин О." на "Андрияшкин О.А."

Сейчас я сортирую список по алфавиту, и похожие ФИО выстраиваются рядом. Я пробегаюсь по списку глазками и правлю всё ручками. Как можно автоматизировать данный процесс? Хотя бы автоматически выявлять похожие ФИО? Пускай исправлять буду ручками.

На сайте planetaexcel.ru нашёл код функции (http://planetaexcel.ru/tip.php?aid=177), которая проделывает похожую операцию, но там проблема в том, что если искомое значение присутсутвует в области поиска, то функция его и выводит. Т.е. если есть точь-в-точь такие же ФИО, то эта функция отдаст приоритет этому слову, а не тому, что незначительно отличается.

Автор: Frantishek
Дата сообщения: 24.10.2010 21:46
Парни, а можно такое под 2007 перевести -

http://spreadsheetpage.com/index.php/tip/creating_custom_menus/

Добавлено:
И попутный вопрос, есть у кого нибудь развернутый реестр FaceID чтобы сразу можно было увидеть все и отметить необходимое (приметить на будущее, классифицировать), т.е. как то обозначив словами, а еще лучше чтобы прямо в Эксель книге - индекс + иконка, а то так перебирать замучаешься.
Автор: SAS888
Дата сообщения: 25.10.2010 06:17
Frantishek

Цитата:
...есть у кого нибудь развернутый реестр FaceID...

Скопируйте следующий код в пустую книгу Excel и запустите макрос "ShFace".

Код: Sub ShFace()
Dim x As CommandBar, y As CommandBarButton, z As CommandBarComboBox, i As Integer
On Error Resume Next: Application.CommandBars("FaceIds").Delete: On Error GoTo 0
Set x = Application.CommandBars.Add(Name:="FaceIds", temporary:=True)
x.Visible = True: ButtonGroup = 1
For i = 1 To 200: Set y = x.Controls.Add(Type:=msoControlButton, ID:=2950): Next
Set z = x.Controls.Add(Type:=msoControlDropdown)
For i = 1 To 51: z.AddItem "Набор " & i: Next i
z.ListIndex = ButtonGroup: z.Caption = "Button Set Number": z.OnAction = "NewBut"
x.Width = 400: Call NewBut
End Sub
Private Sub NewBut()
Dim i As Long, bgr As Long
bgr = CommandBars("FaceIds").Controls("Button Set Number").ListIndex
For i = 1 To 200
With CommandBars("FaceIds").Controls(i)
.FaceId = (bgr - 1) * 200 + i
.Caption = "FaceID = " & (bgr - 1) * 200 + i
.OnAction = "EmptySub"
End With
Next
End Sub
Автор: Flex_Dj
Дата сообщения: 25.10.2010 06:58
smirnvlad
Спасибо... но это не подойдет. Пользователи должны сами обновлять данные в базе и при том у них стоит excel 2003.
У меня ни с чем не возникает проблем, кроме корректного чтения xml.
Если есть что-нибудь о работе с DOM Document, плиз, выложите!
Автор: DANYA198
Дата сообщения: 25.10.2010 08:07
SAS888

Ничего не делать, т.к. "Андрияшкин О.?." может в равной степени оказаться любым из двух сотрудиков: с отчеством Б., или с отчеством А. В этом случае самое лучшее - поставить в соседнем со спорными ФИО столбце какой-нибудь знак, например, "1".

Возможные варианты записей:

С пробелами:
Пробел (или два, три) перед ФИО - " Андрияшкин О.А."
Пробел (два, три) после фамилии но перед Именем - "Андрияшкин О.А."
Пробел (или два, три) после Имени но перед Отчеством - "Андрияшкин О. А."

Стандарт в пробелах, к котрому я привожу все ФИО, - один пробел, разделяющий Ф от ИО - "Андрияшкин О.А."

С точками:

Точки могут отсутствовать - "Андрияшкин ОА"
Точка может присутствовать только после Имени - "Андрияшкин О.А"
Точка может присутствовать только после Отчества - "Андрияшкин ОА."

Стадарт в точках - по одной после Ф и О - "Андрияшкин О.А."

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

Автор: Ogeris
Дата сообщения: 25.10.2010 08:49
Вопрос: как нижеприведённый макрос изменить таким образом, что бы он "проходился" по зачениям не по столбцу вниз, а по строке вправо по столбцам?

Макрос следующий:


Цитата:
Range("A1").Select
lRow = ActiveCell.Row
lCol = ActiveCell.Column
For l1 = lRow + 1 To 1000
If Cells(l1, lRow) = "" Then
Cells(l1, lRow) = Cells(l1 - 1, lCol)
End If
Next l1
End Sub


Пытался заменить lRow на lCol, и строку "Cells(l1, lRow) = Cells(l1 - 1, lCol)" изменить на "Cells(l1, lRow) = Cells(lRow, l1 - 1)", но получилась какая-то хрень ((((
Автор: Flex_Dj
Дата сообщения: 25.10.2010 09:22
Всё, вопрос снимается, нашел информацию.
Вот, если кому-нибудь понадобится:
http://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/Mixture/XML/387.mspx
Автор: SAS888
Дата сообщения: 25.10.2010 10:11
Ogeris
Судя по всему, Вам нужно следующее:

Код: Dim i As Long, j As Long
Application.ScreenUpdating = False: i = [A1].Row
For j = [A1].Column + 1 To 256 ' До номера требуемого столбца
If Cells(i, j) = "" Then Cells(i, j) = Cells(i, j - 1)
Next
Автор: Ogeris
Дата сообщения: 25.10.2010 10:51
SAS888
СПАСИБО!

Добавлено:
Во время составления крупных отчётов во многих несущественных ячейках выскакивает ошибка #ЗНАЧ!. Всегда справлялся с этой проблемой след. образом: заменял формулы на значения, и заменял все "#ЗНАЧ!" на пустоту. Решил автоматизировать сей процесс, но столкнулся с проблемой: записанный макрос почему-то не реагриует на "#ЗНАЧ!", хотя с легкостью заменяет, например, числа. Возможно, проблема в символах # и !. Кто-нибудь знает, как можно это обойти?

Код записанного макроса:

Цитата:
Cells.Replace What:="#ЗНАЧ!", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False

Автор: Drazhar
Дата сообщения: 25.10.2010 11:59
Ogeris
Я решил через перебор ячеек и потом

Код: If IsError(ActiveSheet.Cells(k, i).Value) Then
ActiveSheet.Cells(k, i).Value = 0
End If
Автор: Ogeris
Дата сообщения: 25.10.2010 13:14
У меня сегодня день вопросов

Как нижеприведённый макрос приспособить так, чтобы он выполнял свою работу не только по первому столбцу, но по любому, который я хочу указать?

Код всё тот же:


Цитата:
Range("A1").Select
lRow = ActiveCell.Row
lCol = ActiveCell.Column
For l1 = lRow + 1 To 1000
If Cells(l1, lRow) = "" Then
Cells(l1, lRow) = Cells(l1 - 1, lCol)
End If
Next l1
End Sub


Даже когда я меняю наим. ячейки (что в первой строке), макрос всё равно вставляет данные в первый столбец.
Автор: Lovec
Дата сообщения: 25.10.2010 14:53
Ogeris
Зачем выделять ячейку, а потом получать ее строку и столбец? Если и так понятно что это строка 1 и столбец 1...
Если вы хотите запускать цикл по произвольному столбцу, то оформите этот цикл в виде подпрограммы и передавайте ей параметры, например так

Код: Sub xxx(lRow As Integer, lCol As Integer)
Автор: Drazhar
Дата сообщения: 25.10.2010 15:20
Lovec
Не подскажу, но у меня(WinXP+IE7) пашет
Автор: SAS888
Дата сообщения: 25.10.2010 15:32
Можно использовать WinAPI:

Код: Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Sub OpenWebPage()
URL = "http://www.yandex.ru"
ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus
End Sub
Автор: Ogeris
Дата сообщения: 26.10.2010 05:11

Цитата:
Зачем выделять ячейку, а потом получать ее строку и столбец? Если и так понятно что это строка 1 и столбец 1...
Если вы хотите запускать цикл по произвольному столбцу, то оформите этот цикл в виде подпрограммы и передавайте ей параметры "Sub xxx(lRow As Integer, lCol As Integer)"

донт андерстенд. Можно чуть-чуть подробнее?
Автор: SAS888
Дата сообщения: 26.10.2010 07:58
Ogeris

Цитата:
Даже когда я меняю наим. ячейки (что в первой строке), макрос всё равно вставляет данные в первый столбец.

1. В VBA синтаксис такой: Cells(x, y), где x - номер строки, y - номер столбца. У Вас же в коде все перепутано. Объясните, что Вы хотите? перебрать все строки от указанной ячейки до строки 1000 в этом столбце? Или перебрать все столбцы от указанной ячейки до столбца 1000 (???) в этой строке?
2. Если эта процедура встречается неоднократно, тогда есть смысл сделать ее подпрограммой. А если нет, то лучше этого не делать. Пример:

Код: Sub ОсновнаяПрограмма()
Подпрограмма [D10]
End Sub

Sub Подпрограмма(cell As Range)
Dim i As Long, j As Long
Application.ScreenUpdating = False: j = cell.Column
For i = cell.Row + 1 To 1000
If Cells(i, j) = "" Then Cells(i, j) = Cells(i - 1, j)
Next
End Sub
Автор: Ogeris
Дата сообщения: 26.10.2010 09:13
SAS888
Большое спасибо за подробное объяснение!

Цитата:
Объясните, что Вы хотите? перебрать все строки от указанной ячейки до строки 1000 в этом столбце?
Да

Цитата:
Или перебрать все столбцы от указанной ячейки до столбца 1000 (???) в этой строке?
И это тоже, для формирования отчёта на одном этапе времени надо пройтись по столбцам, на другом - пройтись по строкам.

Цитата:
3. Чем Вас не устраивает предложенный вариант без каких либо циклов?

Полностью устраивает, его я взял на вооружение на этапе со столбцами. Но вот на этапе со строками у меня возникли проблемы, т.к. 1) иногда бывает так, что в 1 строке нужного столбца нет данных. В этом случае во всём столбце "проставляется" #ССЫЛКА!
2) макрос останавливается на последнем встретившемся числе, надо же, что бы он дошёл до конца (т.е. протянул значение последнего встретевшегося числа до конца указанного диапазона, или вообще до конца таблицы экселя - не имеет значения).


Автор: SAS888
Дата сообщения: 27.10.2010 05:58
DANYA198
Предлагаю такой вариант.
Макрос пронормирует все записи в столбце "A" и добавит недостающие инициалы в том сдучае, если найдется такая же фамилия с полными инициалами. В столбце "B", напротив исправленной ячейки будет выведено исходное значение исправленной записи. Это и будет меткой для визуального контроля.

Добавлено:
Ogeris
Предлагаю такой вариант: Пишем подпрограмму, в которую передаем 3 параметра:
1 - Начальная ячейка
2 - Конечная строка (столбец)
3 - Идентификатор заполнения. Если "Строка" - то по строке. Если "Столбец" - то по столбцу.
Подпрограмма не использует циклов. Посмотрите пример.:

Код: Sub Пример1()
Подпрограмма [D10], 1000, "Строка"
End Sub

Sub Пример2()
Подпрограмма [D10], 100, "Столбец"
End Sub

Sub Подпрограмма(Ячейка As Range, Предел As Long, Идентификатор As String)
Dim x As Range, y As Range, i As Long, j As Long: Application.ScreenUpdating = False
i = Ячейка.Row: j = Ячейка.Column: On Error Resume Next
Select Case Идентификатор
Case "Строка"
Set x = Range(Ячейка.Offset(, 1), Cells(i, Предел)): Set y = x.SpecialCells(xlCellTypeBlanks)
y.FormulaR1C1 = "=RC[-1]": x.Value = x.Value
Case "Столбец"
Set x = Range(Ячейка.Offset(1), Cells(Предел, j)): Set y = x.SpecialCells(xlCellTypeBlanks)
y.FormulaR1C1 = "=R[-1]C": x.Value = x.Value
End Select
End Sub
Автор: ViktorGil
Дата сообщения: 28.10.2010 15:42
Требуется помощь.
Имеется книга с несколькими листами: Файл
Нужен макрос, который бы проверял совпадение человека с листа1 в списке на листе2. Если человек найден, то добавить в определенную ячейку на листе2, а если не найден то выводить стоку на лист3.
Т.е. должны проверяться несколько ячеек одновременно с первого листа со всем списком на втором листе (вроде бы примерно так).
Автор: TXP
Дата сообщения: 29.10.2010 08:10
Доброго времени суток.
Имеется следующие:
В книге на листе "Расчет" вводятся данные для расчета, на листе "Аннуитет" и листе "По сумме" находятся таблицы для расчета данных. Так же на листе "Расчет" находится элемент управления "Кнопка" который должен выполнить следующие действие, на листах "Аннуитет" и "По сумме":

Код: Range("Q4").GoalSeek Goal:=0, ChangingCell:=Range("Q9")

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


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