Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/37: Рейтинг темы: голосов - 37, средняя оценка - 4.70
27 / 2 / 0
Регистрация: 20.02.2013
Сообщений: 126

Запись в ячейку по строке и заголовку

20.02.2013, 11:19. Показов 8092. Ответов 73
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помочь с макросом.

Программа с поддержкой VBA должна открыть фаил Excel и записать своё значение в конкретную ячейку, зная название заголовка (Уголок-1) и название строки (Длина). Пересечение двух названий даёт ячейку куда нужно записать значение. Потом программа генерирует новое название заголовка (Стенка-2) и новое название строки (Ширина) и записывает значение.

Просьба помочь в решении
Миниатюры
Запись в ячейку по строке и заголовку  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.02.2013, 11:19
Ответы с готовыми решениями:

Запись в ячейку по строке и заголовку
Добрый день! Прошу помочь с макросом. Во вложении пример. необходимо с первого листа выбирая из ниспадающего меню выбирать...

Оставить в строке первую ячейку, среди повторяющихся ячеек в строке
Добрый день. Как оставить в строке первую ячейку, среди повторяющихся ячеек в строке (остальные удалить). Текстовая таблица. Столбцов...

Как узнать значение первой ячейки в строке (QTableView) при нажатии на любую ячейку в строке?
Сразу извинюсь за корявость речи. Знатоки, подскажите, как узнать значение первой ячейки в строке (QTableView) при нажатии на любую...

73
27 / 2 / 0
Регистрация: 20.02.2013
Сообщений: 126
13.03.2013, 11:53  [ТС]
Студворк — интернет-сервис помощи студентам
a1(1) = "Длина": b1(1) = "Уголок-1": c1(1) = 15
a1(2) = "Длина": b1(2) = "Стенка-1": c1(2) = 15
a1(3) = "Ширина": b1(3) = "Уголок-1": c1(3) = 16
a1(4) = "Ширина": b1(4) = "Стенка-1": c1(4) = 16
Это получается мне все вбивать надо???... А нельзя чтобы он сам искал количество? Find next

Добавлено через 11 минут
Я хотел переделать функцию Aksima под такой вид:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Sub rtuuuuuuuuuu()
    Dim kol%, i%
    kol = 2
    ReDim a1$(kol), b1$(kol), c1#(kol)
    Dim str&, stlb&
    Dim rez As Range
 
    Dim ws As Worksheet
    Set ws = Worksheets("Ëèñò1")
 
    Dim rn As Range
    Set rn = ws.Range("A1:Z100")
  
    a1(1) = "Äëèíà"
    a1(2) = "Øèðèíà"
 
    b1(1) = "Óãîëîê-1"
    b1(2) = "Ñòåíêà-1"
 
    c1(1) = 15
    c1(2) = 16
 
    For i = 1 To kol
        With ws
            dWrite rn, a1(i), b1(i), c1(i)
         End With
    Next i
End Sub
 
 
Sub dWrite(ByVal rn As Range, ByVal a1 As String, ByVal b1 As String, ByVal c1 As String)
    Dim r As Range
    Dim c As Collection
    Dim i As Long, j As Long
    
    Dim m() As Variant, v1 As Variant, v2 As Variant
    
    Set c = New Collection
    m = rn
    For i = 1 To rn.Rows.Count
        If m(i, j) = a1 Then
            c.Add i
            Exit For
        End If
    Next i
    
    For j = 1 To rn.Columns.Count
        If m(i, j) = b1 Then
            c.Add j
            Exit For
        End If
    Next j
 
   For Each v1 In c
      Set r = Union(r, rn.Cells(v1, 1))
   Next v1
   r.Cells = c1
 
   For Each v2 In c
      Set r = Union(r, rn.Cells(1, v2))
   Next v2
    r.Cells = c1
End Sub
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
13.03.2013, 12:25
Здравствуйте, trvi,
Моя процедура скрытия/показа строк, которая была предназначена для скрытия/показа строк - это не совсем то, что нужно для решения данной задачи. Нужно писать новую процедуру. У меня получилось примерно так:

1. Ваша процедура (слегка измененная).

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
'Процедура заполнения базы данных всеми необходимыми значениями.
Sub rtuuuuuuuuuu()
    Dim ws As Worksheet
    Dim db As Range
 
    Dim i As Long, j As Long, rKol As Long, cKol As Long
    Dim rowSearches As Variant, colSearches As Variant
    Dim appropriateVals() As Double
    
    'Определяем, какие заголовки будем искать в строках и столбцах.
    rowSearches = Array("Уголок-1", "Стенка-1", "Уголок-2", "Стенка-2")
    colSearches = Array("Длина", "Ширина", "Высота")
    
    'Выделяем память для хранения значений, соответствующих заголовкам.
    rKol = UBound(rowSearches): cKol = UBound(colSearches)
    ReDim appropriateVals(rKol, cKol) As Double
    
    'Определяем соответствующие заголовкам значения.
    appropriateVals(0, 0) = 15  'Длина уголка-1 равна 15 ед.
    appropriateVals(0, 1) = 17  'Ширина уголка-1 равна 17 ед.
    appropriateVals(0, 2) = 100 'Высота уголка-1 равна 100 ед.
    appropriateVals(1, 0) = 50  'Длина стенки-1 равна 50 ед.
    appropriateVals(1, 1) = 16  'Ширина стенки-1 равна 16 ед.
    appropriateVals(1, 2) = 25  'Высота стенки-1 равна 25 ед.
    appropriateVals(2, 0) = 66  'и т.д.
    appropriateVals(2, 1) = 77
    appropriateVals(2, 2) = 88
    appropriateVals(3, 0) = 12
    appropriateVals(3, 1) = 23
    appropriateVals(3, 2) = 34
    'Примечание: этот участок кода можно изменить - например, можно заполнять
    'массив appropriateVals() данными из какого-нибудь внешнего источника.
    
    'Определяем диапазон базы данных.
    Set ws = Worksheets("Лист1")
    Set db = ws.Range("A1:Z100")
 
    'Заполняем ячейки базы данных, соответствующие определенным заголовкам.
    For i = 0 To rKol
        For j = 0 To cKol
            dWrite db, appropriateVals(i, j), rowSearches(i), colSearches(j)
        Next j
    Next i
End Sub
.
2. Процедура, в которую вы хотели "переделать" мою процедуру.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
'Процедура заполняет ячейки базы данных Database, находящиеся на пересечении строки, чей первый столбец удовлетворяет условию RowSearch,
'и столбца, чья первая строка удовлетворяет условию ColSearch, значениями ValToIns.
Sub dWrite(ByVal Database As Range, ByVal ValToIns As Variant, ByVal RowSearch As String, ByVal ColSearch As String)
    Dim i As Long, j As Long, rNum As Long, cNum As Long
    Dim m As Variant, rh As Variant, ch As Variant
    With Database
        On Error GoTo ErrH
        rNum = .Rows.Count - 1      'Находим количество строк в базе (за исключением заголовков).
        cNum = .Columns.Count - 1   'Находим количество столбцов в базе (за исключением заголовков).
        m = .Cells(2, 2).Resize(rNum, cNum) 'В массив m() заносим значения базы данных, за исключением заголовков.
        rh = Application.Transpose(.Cells(2, 1).Resize(rNum, 1)) 'В массив rh() заносим заголовки строк.
        ch = Application.Transpose(Application.Transpose(.Cells(1, 2).Resize(1, cNum))) 'В массив ch() заносим заголовки столбцов.
        On Error GoTo 0
    End With
    For i = 1 To rNum   'Проходим циклом по заголовкам строк.
        If CStr(rh(i)) = RowSearch Then 'Если заголовок строки соответствует условию RowSearch, то...
            For j = 1 To cNum   'просматриваем в цикле также заголовки столбцов...
                'и если в заголовках столбцов тоже обнаруживается совпадение (на этот раз с условием ColSearch), то...
                If CStr(ch(j)) = ColSearch Then m(i, j) = ValToIns 'заполняем соответствующие элементы массива значениями ValToIns.
            Next j
        End If
    Next i
    Database.Cells(2, 2).Resize(rNum, cNum) = m 'Выгружаем обработанный массив в диапазон Database.
    Exit Sub
'Обработка ошибок.
ErrH:
    MsgBox "Процедура dWrite сообщает: база пуста - проверьте параметр Database процедуры."
    Err.Clear
End Sub
С уважением,
Aksima
2
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
13.03.2013, 12:57
To Aksima, To trvi Насколько я понимаю задачу/требования (в отношении к AutoCAD), данную задачу проще всего будет можно решить через словари + коллекции + массивы (если уже ну никак нельзя в этом случае без VBA). Но в общем, мое мнение при мне и осталось.
Отвлекитесь немного. Шутка. Не злая!!! Стоит толпа. "А что Вы делаете?". "Да вот двигатель жигулей в Mercedes пихаем." "А зачем?" "Хочем лимит скорости Ferrari превысить"
0
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,455
Записей в блоге: 1
13.03.2013, 13:19
Цитата Сообщение от trvi Посмотреть сообщение
Это получается мне все вбивать надо???... А нельзя чтобы он сам искал количество? Find next
У меня сложилось впечатление, что задача сформулирована неверно и все можно сделать гораздо проще, а Find здесь вообще не нужен.
0
27 / 2 / 0
Регистрация: 20.02.2013
Сообщений: 126
13.03.2013, 13:36  [ТС]
Igor_Tr, Отвлекись немного от ACAD...

Добавлено через 10 минут
KoGG,

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub tr()
...
 
    a1(1) = "Длина" - этих только одно значение
    a1(2) = "Ширина"
 
    b1(1) = "Уголок-1" ' - этих строк на листе может быть несколько... не хотелось бы всех их записывать.
    b1(2) = "Стенка-1" ' - и этих строк на листе может быть несколько... тоже не хотелось бы всех их записывать.
 
    c1(1) = 15 - данные
    c1(2) = 16
 
 ...
End Sub
Я хотел бы получить оптимальный код (по скорости), который позволил бы мне корректно заполнить таблицу. Я буду вводить только c1, с2 и т. д., а программа сама бы искала пересечение строки b1 и столбца a1 и вписывала бы нужное значение:

Найти все пересечения a1 и b1 и заполнить значением c1

Найти все пересечения a2 и b2 и заполнить значением c2

Добавлено через 2 минуты
KoGG,

В этом коде меня все устраивало:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Sub trvi2()
    Dim KolichestvoParUsloviy%, i%
    KolichestvoParUsloviy = 2
    'Is- неудачное имя для переменной, совпадает с оператором Is
    ReDim Iss$(KolichestvoParUsloviy), Si$(KolichestvoParUsloviy), Znachenie#(KolichestvoParUsloviy)
    Dim Stroka&, Stolbec&
    Dim RezPoiska As Range
    Iss(1) = "Длина"
    Iss(2) = "Ширина"
    Si(1) = "Уголок-1"
    Si(2) = "Стенка-1"
    Znachenie(1) = 15  ' Подставляемое значение для 1-ой пары
    Znachenie(2) = 16.9999 ' Подставляемое значение для 2-ой пары
    Application.ScreenUpdating = False ' для скрытности
   Workbooks.Open Filename:="C:\example.xlsx", UpdateLinks:=0, ReadOnly:=False
 For i = 1 To KolichestvoParUsloviy
   With ActiveWorkbook.Worksheets("1")
        Set RezPoiska = Range("A1:D10").Find(What:=Si(i), LookIn:=xlValues, _
            LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False)
        If RezPoiska Is Nothing Then
            MsgBox "Не найдено " & Si(i)
        Else
            Stolbec = RezPoiska.Column
        End If
        Set RezPoiska = Range("A1:D10").Find(What:=Iss(i), LookIn:=xlValues, _
            LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False)
        If RezPoiska Is Nothing Then
            MsgBox "Не найдено " & Iss(i)
        Else
            Stroka = RezPoiska.Row
        End If
        If Stroka > 0 And Stolbec > 0 Then
            Cells(Stroka, Stolbec) = Znachenie(i) ' Свое значение
        End If
    End With
Next i
    Application.ScreenUpdating = True
End Sub
Но... этих параметров:

Visual Basic
1
2
    Si(1) = "Уголок-1"
    Si(2) = "Стенка-1"
может быть несколько...
0
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,455
Записей в блоге: 1
13.03.2013, 13:46
Цитата Сообщение от trvi Посмотреть сообщение
Найти все пересечения a1 и b1 и заполнить значением c1
Найти все пересечения a2 и b2 и заполнить значением c2
противоречит

Цитата Сообщение от trvi Посмотреть сообщение
Как реализовать, чтобы он записывал значение c1 для нескольких названий b1 (количество названий в диапазоне может быть разное)?
Еще я подозреваю, что имена a1,b1,c1, a2,b2,c2 - имеют паразитические, не несущие смысла окончания, а подразумевается a(1),b(1),c(1)
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
13.03.2013, 13:48
To trvi. Поверьте, не из зла. Если взять отдельно, просто как обработку больших таблиц (одной/несколько) - гуляние по ним с помощью тех инструментов, которые Вы используете, только раздует Ваш проект до таких размеров, что ни один Garmin/iGo/Navi Вам не поможет по нему пройти с ясной головой. По-этому и советую. Занесение в базы - это одно. Обработка баз - это другое. И самые эффективные тут будут запросы SQL, комбинация листов Excel c возможностями Acces, использование Dictionary, Collection, Array НА ПОЛНУЮ КАТУШКУ!!! Дело Вам говорю. У самого вся голова была в шишках когда кинулся, не разобравший, с саблей на танки.
0
27 / 2 / 0
Регистрация: 20.02.2013
Сообщений: 126
13.03.2013, 13:51  [ТС]
KoGG,

Прошу прощения, по поводу:
Как реализовать, чтобы он записывал значение c1 для нескольких названий b1 (количество названий в диапазоне может быть разное)?
не корректно, думал будет понятно.

Надо ориентироваться на:
Найти все пересечения a1 и b1 и заполнить значением c1
Найти все пересечения a2 и b2 и заполнить значением c2
Добавлено через 1 минуту
Igor_Tr,

Верю... поверьте, не думал, что это так сложно сделать???
0
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,455
Записей в блоге: 1
13.03.2013, 13:59
Надо отвлечься от всего этого и начать с того в каком виде имеются исходные данные, если их не хочется забивать вручную. Лучше выложить файл Excel.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
13.03.2013, 14:02
Да в принципе не сложно. Сложно это в одиночку копать лопатой котлован 30м * 30м * 4м когда рядом стоит как минимум трьох кубовый Kattepiler, в кабине которого вторую пачку подряд курит скучаючий машинист.

Добавлено через 1 минуту
to KoGG. 100 %. И даже больше!
0
27 / 2 / 0
Регистрация: 20.02.2013
Сообщений: 126
13.03.2013, 14:09  [ТС]
KoGG,

Исходные данные - таблица:
В ней строки и столбы.
В коде VBA я заполню:
Visual Basic
1
2
3
4
5
6
7
8
9
10
a1=Уголок-1
a2=Стенка-1
 
b1=Длина
b2=Ширина
 
с1=12
с2=13
с3=14
с4=15
Задача:
Найти все пересечения Уголок-1 и Длина и заполнить значением c1
Найти все пересечения Уголок-1 и Ширина и заполнить значением c2

Найти все пересечения Стенка-1 и Длина и заполнить значением c3
Найти все пересечения Стенка-1 и Ширина и заполнить значением c4
Вложения
Тип файла: xls Книга9.xls (33.5 Кб, 7 просмотров)
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
13.03.2013, 14:22
to trvi.
комбинация листов Excel c возможностями Acces
Посмотрите здесь:
http://artemyev.biztoolbox.ru/... tched.aspx
Может Вам все остальное и не нужно будет.
0
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,455
Записей в блоге: 1
13.03.2013, 14:23
Это повторение.
Книга9 - с пробелами, я имел ввиду абсолютно полные данные с максимальным списком возможным позиций - изделий и их характеристик, откуда бы брались данные и вставлялись в заполняемые таблицы. Альтернатива - прописывать абсолютно все в макросе.
Заполняемая таблица не является исходными данными, а в случае если является - тогда ничего не нужно искать, а заполнять ячейки со строго определенными координатами.
0
27 / 2 / 0
Регистрация: 20.02.2013
Сообщений: 126
13.03.2013, 14:43  [ТС]
KoGG,

Я делал это через код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Sub Main()
...
    ar = WS.Range("A1:Z100")
 
    With WS
        Dim n As Integer = 15
        Dim b(0 To n) As String
 
        b(1)=10
        b(2)=11
        b(3)=12
        b(4)=13
        b(5)=14
        b(6)=15
        b(7)=16
        b(8)=17
        b(9)=18
        b(10)=19
        b(11)=20
        b(12)=21
        b(13)=22
        b(14)=23
        b(15)=24
 
        For i=1 To n
            ExCel = findAdr(a,b(i),ar)
        Next i
    End With
End Sub 
 
' функция ищет только однозначение
Function findAdr(x As String, y As String, WWS As Object) As Object
    With WWS
    Rez1 = WWS.Find(What:=x)    
    Rez2 = WWS.Find(What:=y)    
    If Rez2 Is Nothing Then
    MsgBox ("Не найдено " + y,0,":(")
    Else
    Strk=Rez1.Row
    Stlb=Rez2.Column
    Dim stroka As String =Strk
    Dim stolbec As String =Stlb
    'Присваеваем значению функции тело искомой ячейки
    findAdr = WWS.Cells(Strk,Stlb)
    'MsgBox ("Строка"+stroka+" Столбец"+stolbec,0,"Нашел!")   
    End If
    End With
End Function
Добавлено через 1 минуту
Aksima,

Почему в моём коде он не заполняет дальше?

Я делал это через код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Sub Main()
...
    ar = WS.Range("A1:Z100")
 
    With WS
        Dim n As Integer = 15
        Dim b(0 To n) As String
 
        b(1)=10
        b(2)=11
        b(3)=12
        b(4)=13
        b(5)=14
        b(6)=15
        b(7)=16
        b(8)=17
        b(9)=18
        b(10)=19
        b(11)=20
        b(12)=21
        b(13)=22
        b(14)=23
        b(15)=24
 
        For i=1 To n
            ExCel = findAdr(a,b(i),ar)
        Next i
    End With
End Sub 
 
' функция ищет только однозначение
Function findAdr(x As String, y As String, WWS As Object) As Object
    With WWS
    Rez1 = WWS.Find(What:=x)    
    Rez2 = WWS.Find(What:=y)    
    If Rez2 Is Nothing Then
    MsgBox ("Не найдено " + y,0,":(")
    Else
    Strk=Rez1.Row
    Stlb=Rez2.Column
    Dim stroka As String =Strk
    Dim stolbec As String =Stlb
    'Присваеваем значению функции тело искомой ячейки
    findAdr = WWS.Cells(Strk,Stlb)
    'MsgBox ("Строка"+stroka+" Столбец"+stolbec,0,"Нашел!")   
    End If
    End With
End Function
0
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,455
Записей в блоге: 1
13.03.2013, 14:46
Очень не наглядный код. Не видно соответствия изделие - характеристика - величина.
0
27 / 2 / 0
Регистрация: 20.02.2013
Сообщений: 126
13.03.2013, 14:56  [ТС]
KoGG,

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Sub Main()
wb = ActiveWorkbook
ws = wb.Sheets("Лист1") 
ar = ws.Range("A1:Z100")
 
    With ws
        Dim n As Integer = 3
        Dim a(0 To n) As String
        Dim b(0 To n) As String
 
        a(1) = "Уголок-1"
        a(2) = "Стенка-1"
        a(3) = "Втулка-1"
 
        b(1)="Длина"
        b(2)="Ширина"
        b(3)="Высота"
 
        For i=1 To n
            ExCel = findAdr(a(i),b(i),ar)
        Next i
    End With
End Sub 
 
Function findAdr(x As String, y As String, WWS As Object) As Object
    With WWS
    Rez1 = WWS.Find(What:=x)    
    Rez2 = WWS.Find(What:=y)    
    If Rez2 Is Nothing Then
    MsgBox ("Не найдено " + y,0,":(")
    Else
    Strk=Rez1.Row
    Stlb=Rez2.Column
    Dim stroka As String =Strk
    Dim stolbec As String =Stlb
    findAdr = WWS.Cells(Strk,Stlb)
    'MsgBox ("Строка"+stroka+" Столбец"+stolbec,0,"Нашел!") 
    End If
    End With
End Function
Он работает только по первому найденному значению.
0
0 / 0 / 0
Регистрация: 20.02.2013
Сообщений: 9
13.03.2013, 15:05
Парни,
Может все гораздо проще и можно:
для каждого ai (например a1= Стенка-1) проверять повторения с помощью

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub ()
s(1) = Cells.Find(What:="Стенка-1").Row
 
For i=2 to n
s(i) = Cells.FindNext(After:=ActiveCell).Row
if s(i)<s(i-1) then
Exit sub
Else
Next i
 
End sub
Тем самым запоминая повторяющиеся строки в отдельный массив, а потом организовать дополнительный цикл прогона по s(i) для записи значений?
0
27 / 2 / 0
Регистрация: 20.02.2013
Сообщений: 126
13.03.2013, 15:19  [ТС]
EgorZa,

Может вариант покажешь. Идея неплохая?!
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
13.03.2013, 15:32
А что-то так?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Sub mIntersect()
 
 Dim rng1 As Range, rng2 As Range, currCell As Range
 Dim i&, j&, r&, c&, a&, b&, count_1&, count_2&
 Dim c1%, c2%, c3%, c4%
 Dim arr1(), arr2()
     
   a = Application.WorksheetFunction. _
                CountIf(Range("A:A"), "Óãîëîê-1")
   b = Application.WorksheetFunction. _
                CountIf(Range("A:A"), "Ñòåíêà-1")
   ReDim arr1(a)
   ReDim arr2(b)
   
   count_1 = 0
   count_2 = 0
   
       For Each currCell In Range("A:A")
            If currCell.Value = "Óãîëîê-1" Then
               count_1 = count_1 + 1
               arr1(count_1) = currCell.Row
            End If
            If currCell.Value = "Ñòåíêà-1" Then
               count_2 = count_2 + 1
              arr2(count_2) = currCell.Row
            End If
        Next
'--Verification---------
'Stop
'    For i = LBound(arr1) To UBound(arr1)
'        Debug.Print arr1(i)
'    Next 'i
'    For i = LBound(arr2) To UBound(arr2)
'        Debug.Print arr2(i)
'    Next 'i
'==End==Ver===========
Stop
    c1 = 15: c2 = 16: c3 = 35: c4 = 46
    For i = LBound(arr1) To UBound(arr1)
       Set currCell = Application.Intersect(Rows(arr1(i)), _
                            Range("b:b"))
            
            currCell = c1
        Set currCell = Application.Intersect(Rows(arr1(i)), _
                            Range("C:C"))
            currCell = c2
    Next 'i
    For i = LBound(arr2) To UBound(arr2)
       Set currCell = Application.Intersect(Rows(arr2(i)), _
                            Range("b:b"))
            currCell = c3
        Set currCell = Application.Intersect(Rows(arr2(i)), _
                            Range("C:C"))
            currCell = c4
    Next 'i
End Sub
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
13.03.2013, 15:36
Мой вариант (другие пока не изучал):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Sub SearchPoz()
    Dim kol%, i%
    kol = 2
    ReDim a1$(1 To kol), b1$(1 To kol), c1#(1 To kol)
    Dim str&, stlb&
 
    Dim ws As Worksheet
    Set ws = Worksheets("Лист1")
 
    Dim rn As Range
    Set rn = ws.Range("A1:Z100")
 
    a1(1) = "Длина"
    a1(2) = "Ширина"
 
    b1(1) = "Уголок-1"
    b1(2) = "Стенка-1"
 
    c1(1) = 15
    c1(2) = 16
 
    For i = 1 To kol
        For Each el In findR(a1(i), b1(i), rn)
            Cells(--Split(el, "|")(0), --Split(el, "|")(1)).Value = c1(i)
        Next
    Next
 
End Sub
 
 
Private Function findR(cc As String, rr As String, rn As Range)
    Dim iCell As Range, crit&, out As New Collection, el, elel
    Dim rDic As Object, cDic As Object
    Set rDic = CreateObject("Scripting.Dictionary")
    Set cDic = CreateObject("Scripting.Dictionary")
 
    Set iCell = rn.Find _
                (What:=cc, LookIn:=xlValues, LookAt:=xlWhole)
 
    If Not iCell Is Nothing Then
        crit = crit + 1
        iAddress$ = iCell.Address
        Do
            Set iCell = rn.FindNext(After:=iCell)
            cDic.Item(iCell.Column) = 0&
        Loop While Not iCell Is Nothing And iCell.Address <> iAddress$
    End If
 
    Set iCell = rn.Find _
                (What:=rr, LookIn:=xlValues, LookAt:=xlWhole)
 
    If Not iCell Is Nothing Then
        crit = crit + 1
        iAddress$ = iCell.Address
        Do
            Set iCell = rn.FindNext(After:=iCell)
            rDic.Item(iCell.Row) = 0&
        Loop While Not iCell Is Nothing And iCell.Address <> iAddress$
    End If
 
    If crit = 2 Then
        For Each el In rDic
            For Each elel In cDic
                out.Add el & "|" & elel
            Next
        Next
    End If
 
    Set findR = out
End Function
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.03.2013, 15:36

Запись в ячейку БД
Возникла такая проблема: надо записать в ячейку текстового формата переменную string при нажатии на кнопку. Напрямую не хочет, пишет...

Запись в ячейку памяти
Даны два целых числа. Необходимо 3аписать их одно за другим без пропуска битов в ячейку памяти размером в два байта . Подскажите...

Запись 0 в ячейку not null
Здравствуйте! Будет ли писать 0 в ячейку not null или где-то ещё у меня косяк, чёт не заносит в базу значение ))) Спасибо.

Запись в ячейку ДБГрида
Здравствуйте, что-то не пойму почему не работает? Хочу добавить в выбранную ячейку значение &quot;5&quot; procedure...

Запись в ячейку памяти
Подскажите пожалуйста, как в avr studio 4 из РОН записать число в ячейку памяти $0068 ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru