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

» Excel VBA (часть 3)

Автор: InSe0F
Дата сообщения: 16.06.2011 12:52
отбой нашел глюк

так кстати с диапазонами и указанием другого листа как нить получится сделать или нет?
Автор: aidomars
Дата сообщения: 16.06.2011 13:51
InSe0F
Держи
Function Find2(Table As Range, SearchColumnNum As Integer, SearchValue As Variant, Delimiter As String, ResultColumnNum As Integer)
Dim i As Integer
For i = 1 To Table.Rows.Count
If Table.Cells(i, SearchColumnNum) = SearchValue Then
Find2 = Find2 & Delimiter & Table.Cells(i, ResultColumnNum)
End If
Next i
Find2 = Replace(Find2, Delimiter, "", 1, 1)
End Function
Автор: InSe0F
Дата сообщения: 17.06.2011 22:54
aidomars
Спасибо!
правда мне еще помогли модифицировать в диапазоны, так как то удобнее да и привычнее...
Автор: black_dron
Дата сообщения: 25.06.2011 08:38
Здравствуйте, помогите пжл сделать задачу, вот скрин как должна выглядеть сама форма:
http://imageshack.us/photo/my-images/190/74701460.jpg

При нажатие кнопки выбираешь файл и в поля: имя файла и директория должны вводится имя файла и путь к папке
Автор: Plexus1981
Дата сообщения: 28.06.2011 10:45
Доброго времени суток! Помогите решить проблему пожалуйста. В книге есть две таблицы ( к примеру одна в колонке A, другая в колонке B).Размеры таблиц разные. Надо сравнить эти две таблицы. То есть берется строка А1 и проверяется есть ли это значение в колонке B, если есть, то в С1 ставится "есть", если нет, то "нет". Далее A2 итд, ну то есть циклом. Написал бы сам, но к сожалению в VBA - ноль.
Заранее спасибо! =)
Автор: KF121
Дата сообщения: 28.06.2011 11:06
VBA тут не нужен, здесь одной вормулой можно обойтись.

Вставляете ее в клонку С

=ЕСЛИОШИБКА(ВПР(A1;B:B;1;ЛОЖЬ);"нет")

она выведет само значение если есть и если не нашла то выведен нет.
Автор: Plexus1981
Дата сообщения: 28.06.2011 11:22
KF121, ОГРОМНОЕ Вам спасибо! Все заработало! =)
Автор: aidomars
Дата сообщения: 28.06.2011 17:49
Что быстрее будет работать?

Код: if n=1 then
if m=1 then
i=i+1
end if
end if
Автор: asbo
Дата сообщения: 28.06.2011 18:58
aidomars
Прежде всего это зависит от частоты вхождений n=1 и m=1. Ведь есть и третий вариант, с первой проверкой m.

Если предположить, что примерно равно, то все равно однозначности нет. На глазок - второй быстрее. Надо мерять на конкретных данных. А это ведь только концептуальный пример, я понимаю?

Я бы вообще написал:
i = i - (n=1 and m=1)
Или с явным преобразованием. Смотря, что быстрее :)

И потом - насколько быстрее? Быстрее - это, имо, ощутимо быстрее. На порядок, к примеру.
Автор: aidomars
Дата сообщения: 28.06.2011 19:16
asbo
Сравниваю два массива (первый (n) ~25000 и второй (m) ~120000)
Если n(1,1)=m(1,1) т.е. регионы и n(1,2)=m(1.2) и фио совпадают, то присваиваем остальную инфу из m() в n().
Вот и думаю что быстрее, сразу сравнить оба параметра (регион и фио) или сначала регион и если не совпадет то переход к следующей строке. Вот...
Автор: asbo
Дата сообщения: 28.06.2011 20:28
И все-таки, что чаще совпадает - фамилии или регионы?

Ладно, считаем, что неизвестно. Полагаем, что регионов на порядок (если не на два-три) меньше, чем фамилий, значит проверяем первыми фамилии.

Вообще-то, задача чисто для Access.
Автор: aidomars
Дата сообщения: 28.06.2011 21:51
Регионов столько же сколько и фио, если считать построчно. А уникальных конечно меньше, точнее 15. Т.е. имеем в каждом регионе штук 10000 фио. После нахождения в массиве m Региона и ФИО, выдергиваю из m в n нужную инфу, завершаю цикл сканирования m по Exit for и ищу следующую n. Занимает около 15 минут.
Access хотелось бы изучить...
Автор: ZDik
Дата сообщения: 05.07.2011 13:25
Есть файл звонков от АТС
Хотелось бы автоматизировать процесс получения статистики в разрезе: рабочее время; деление по часам, не рабочее время и прочее (исх. абонент, время1 (ожидание), время2(разговора), направление; среднее, сумма, тут я уже думаю автофильтром справлюсь)

Код: 2011/06/24 16:36:47,00:00:15,6,106,O,119,119,,1,6,0,E106,Bychina,E119,Konovalov,0,0, ,


2011/06/24 16:37:17,00:00:00,11,106,O,704,704,,0,7,0,E106,Bychina,T9801,Eeie9.1,0,0, ,


2011/06/24 16:36:29,00:02:24,0,121,O,89028089xxx,989028089xxx,,0,5,0,E121,Zinkina T,T9082,Eeie3.2,0,0, ,

2011/06/24 16:40:01,00:00:26,2,118,O,210289x,9210289x,,0,8,0,E118,Modem,T9081,Eeie3.1,0,0, ,
Автор: AndreyTNT
Дата сообщения: 05.07.2011 13:38
Подскажите пожалуйста, можно как то в Excel сделать так что бы можно было добавлять новые ячейки, но изменять при этом уже существующие нельзя? То есть, имеется лист, в нем несколько таблиц и строк, скажем A2 и B2 пустые, я туда добавляю информацию, сохраняю документ и закрываю его. Если я еще раз запущу документ, то смогу только добавить в А3, Б3, а в А2, Б2 уже не смогу отредактировать, возможно такое реализовать?

Автор: asbo
Дата сообщения: 05.07.2011 14:45
AndreyTNT
Вот рыба модуля (без проверок и фулпруфа). Сдвиг вниз окна редактирования при каждом открытии книги. Строчки Demo - иллюстративные, закомментировать. Вызов sb_ShiftUnlock поместить в событие книги Workbook_Open().

Код:
Option Explicit
Private rWindow As Range, rRow As Range

Private Sub sb_ShiftUnlock_Ini() ' range set
Set rWindow = Range("A:B")
End Sub

Public Sub sb_ShiftUnlock() ' main procedure
Call sb_ShiftUnlock_Ini
For Each rRow In rWindow.Rows
With rRow
If Not .Locked Then
.Value = "Locked" ' Demo
.Locked = True
With .Offset(1, 0)
.Value = "Unlocked" ' Demo
.Locked = False
End With
Exit For
End If
End With
Next
End Sub

Private Sub sb_ShiftUnlock_Reset() ' reset to first row
Call sb_ShiftUnlock_Ini
With rWindow
.Locked = True
.Rows(1).Locked = False
End With
End Sub
Автор: ariva755
Дата сообщения: 08.07.2011 10:27
подскажите пожалуйста, в листе при изменении значений в определённых ячейках, срабатывает событие, которое увеличивает значение ячейки а10 на 1. Всё работало замечательно , до того пока я на изменяемые ячейки не поставил проверку значения. и теперь если ввозу значение, которое есть в списке всё работет, а если значение не из списка - ексель ругнулся (мол не то) я ввожу правльное значение, он его принимает, но событие как - бы срабатывает два раза подряд. как от этого избавится?





Private Sub Worksheet_Change(ByVal Target As Excel.Range) '
Dim iCell As Range

Set itarget = Intersect(Me.Range("c1:d19"), Target) '

If Not itarget Is Nothing Then
If Not Me.ProtectContents Then

Range("A10").Value = Range("A10").Value + 1
Else
MsgBox "Для создания примечаний снимите защиту листа", , ""
End If
End If

End Sub
Автор: vlth
Дата сообщения: 08.07.2011 14:01
ariva755

Цитата:
как от этого избавится?


Создать, например, свою процедуру проверки значений, вводимых пользователем.
Автор: KorolCOOL
Дата сообщения: 10.07.2011 10:04
Имеется файл Exel в котором используются VBA-скрипты для заполнения данными, полученными из удаленного источника. Одними из получаемых данных являются XML данные. Короче говоря есть переменная ReportData в которой хранится XML-строка (табличный отчет). Все впринципе отлично, но вот только как эту строку распределить в табличной виде по листу Exel я ума не приложу.

В Exel уже есть какой-то XML парсер, но информацию как он работает я найти не смог. В гугле пишут о каком-то MSXML парсере. В общем кто-нибудь знает как это делается по умному?

Вот пример строки:

Код: <report lang="ru" name="Контроль" tz="39600">
    <stats/>
    <tables>
        <table cols="3" flags="0" id="unit_zones_visit" name="Геозоны" rows="13">
            <header>
                <col name="Геозона"/>
                <col name="Время входа"/>
                <col name="Время выхода"/>
            </header>
            <row>
                <col txt="Рынок" val="0" vt="0"/>
                <col txt="2011-07-10 13:44:42" val="1310262282" vt="30"/>
                <col txt="2011-07-10 13:49:21" val="1310262561" vt="30"/>
            </row>
Автор: xvasekx
Дата сообщения: 11.07.2011 10:31
День добрый есть строчка
Range("B7").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=
как добавить диапазон ячеек в Formula1:= через переменую и желательно через Cells
Автор: KF121
Дата сообщения: 11.07.2011 10:36
Formula1:="=" & Cells(r, c).Address & ": & Cells(r1, c1).Address
Автор: xvasekx
Дата сообщения: 11.07.2011 11:02
чет все равно ошибку выдает
"Application-defined or object-defined error"
Автор: KF121
Дата сообщения: 11.07.2011 11:50
ну так надо же родителя Cells указать. ActiveSheet или ActiveWorkbook.Sheets(name).Cells
Автор: xvasekx
Дата сообщения: 11.07.2011 12:52
ну это само собой, конечно указываю и все равно такая ошибка(
Автор: KF121
Дата сообщения: 11.07.2011 15:09
вот полностью рабочий код


Код: Option Explicit

Sub macro1()
Dim formula

Range("B1").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=" & ActiveSheet.Cells(1, 1).Address & ":" & ActiveSheet.Cells(10, 1).Address
End With
Range("N19").Select
End Sub
Автор: xvasekx
Дата сообщения: 11.07.2011 15:18
все заработало спасибо
Автор: KorolCOOL
Дата сообщения: 11.07.2011 15:28
Подскажите пожалуйста как сопоставить известному номеру столбца соответсвующую букву.
Т.е. мне нужно объединить Х ячеек в одной строке. Например 5 ячеек в первой строке (А1:E1). Как мне определить букву столбца конечной ячейки по известному Х?
Автор: KF121
Дата сообщения: 11.07.2011 15:39
KorolCOOL
Чем не подходит функция ВПР (VLOOKUP)?

=ВПР(A1;B:B;1;ЛОЖЬ). Выведет само значение если есть в столбце Б, либо #Н/Д если не нашел.
Автор: SAS888
Дата сообщения: 12.07.2011 04:34
KorolCOOL

Код: Dim x As Integer: x = 5
[A1].Resize(, x).Merge
Автор: KorolCOOL
Дата сообщения: 12.07.2011 05:54

Цитата:
KorolCOOL
Чем не подходит функция ВПР (VLOOKUP)?

=ВПР(A1;B:B;1;ЛОЖЬ). Выведет само значение если есть в столбце Б, либо #Н/Д если не нашел.


Вы немного не поняли, что мне нужно. Мне нужно определить букву столбца под номером Х. Короче мне нужно для таблицы их N столбцов сделать шапку, слив N ячеек первой строки в 1. Я знаю один способ:

Sheets(4).Range("A1:*1").Select
Selection.Merge

Но как определить букву, которую следует подставить вместо * , (исходя из того, что известен номер N столбца, соответствующего этой букве) я не знаю. Конечно можно сделать цикл который будет по порядку весь алфавит проходить, но я подозреваю, что можно как-то иначе.
Автор: asbo
Дата сообщения: 12.07.2011 06:58
KorolCOOL
Если для диапазона, то разобрать сзаду строку Range("А1:E1").Address с помощью InStrRev на предмет содержимого между первым и вторым вхождением "$"

Если ужЕ известен номер столбца, то просто содержимое, до первого вхождения "$"
Mid(Columns(5).Address, 1 + InStrRev(Columns(5).Address, "$"))

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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