Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Прошу помочь разобраться в макросе с Target и Intersect - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Прошу помочь разобраться в макросе с Target и Intersect (Новое детище.. ну хорошо, не детище, так, детеныш ))
Прошу помочь разобраться в макросе с Target и Intersect
Alex_ST Дата: Пятница, 27.04.2012, 20:06 | Сообщение № 21
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Quote (RAN)
Target.Cells.Count > 1 работает точно так-же, как и Target.Count > 1
ну, это-то понятно...
А вот почему работает Target(1, 5) вместо правильного Target.Offset(0, 4) ? Фигня какая-то...



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Quote (RAN)
Target.Cells.Count > 1 работает точно так-же, как и Target.Count > 1
ну, это-то понятно...
А вот почему работает Target(1, 5) вместо правильного Target.Offset(0, 4) ? Фигня какая-то...

Автор - Alex_ST
Дата добавления - 27.04.2012 в 20:06
RAN Дата: Пятница, 27.04.2012, 20:08 | Сообщение № 22
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Quote (RAN)
Цитата, Alex_ST писал(а):
Target(1, 6) когда Target - одна ячейка, это уж как-то не очень корректно

Это еще мягко сказано.

biggrin


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
Quote (RAN)
Цитата, Alex_ST писал(а):
Target(1, 6) когда Target - одна ячейка, это уж как-то не очень корректно

Это еще мягко сказано.

biggrin

Автор - RAN
Дата добавления - 27.04.2012 в 20:08
Alex_ST Дата: Пятница, 27.04.2012, 20:11 | Сообщение № 23
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Вот о том-то и спич! Не должно работать, ибо сие есть некорректно! Но ведь работает, зараза!



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеВот о том-то и спич! Не должно работать, ибо сие есть некорректно! Но ведь работает, зараза!

Автор - Alex_ST
Дата добавления - 27.04.2012 в 20:11
RAN Дата: Пятница, 27.04.2012, 20:16 | Сообщение № 24
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Это из серии
[vba]
Code
Cells(1, 1).Item(6).Select
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеЭто из серии
[vba]
Code
Cells(1, 1).Item(6).Select
[/vba]

Автор - RAN
Дата добавления - 27.04.2012 в 20:16
Alex_ST Дата: Пятница, 27.04.2012, 20:23 | Сообщение № 25
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Quote (RAN)
Cells(1, 1).Item(6).Select
biggrin biggrin biggrin Класс! А интересно попробовать: вдруг и такую чушь Ёксель проглотит?



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Quote (RAN)
Cells(1, 1).Item(6).Select
biggrin biggrin biggrin Класс! А интересно попробовать: вдруг и такую чушь Ёксель проглотит?

Автор - Alex_ST
Дата добавления - 27.04.2012 в 20:23
Alex_ST Дата: Пятница, 27.04.2012, 20:30 | Сообщение № 26
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Блин! Сглотнул! И выделил Cells(6,1) т.е. А6
Я офигеваю.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеБлин! Сглотнул! И выделил Cells(6,1) т.е. А6
Я офигеваю.

Автор - Alex_ST
Дата добавления - 27.04.2012 в 20:30
light26 Дата: Пятница, 27.04.2012, 22:08 | Сообщение № 27
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Quote (Alex_ST)
Блин! Сглотнул! И выделил Cells(6,1) т.е. А6
Я офигеваю.

Так, может, не так уж все и плохо с Таргетом (1,5) )))))))


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Quote (Alex_ST)
Блин! Сглотнул! И выделил Cells(6,1) т.е. А6
Я офигеваю.

Так, может, не так уж все и плохо с Таргетом (1,5) )))))))

Автор - light26
Дата добавления - 27.04.2012 в 22:08
Саня Дата: Пятница, 27.04.2012, 22:49 | Сообщение № 28
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
эта строка
[vba]
Code
Range("F4")(2,3)
[/vba]
≡[vba]
Code
Range("F4").Item(2,3)
[/vba]
есть ячейка со 2-ой строкой и 3-м столбцом, НО при условии, что вместо первой ячейки "A1", ячейка "F4", т.е.
здесь Range("F4") - это начало новой системы координат.

пример:
[vba]
Code
Range("F10").Range("B4").Select
[/vba]

с рэнджем (сэллсом) вообще все не тривиально...

мне кажется с концепции событий изучать язык не совсем правильно - это Вадим тебе.

чтобы прочувствовать ситуацию, вставь этот обработчик и измени какую-нибудь ячейку (подальше от A1):
[vba]
Code
Option Explicit
Dim bNotFirst As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
     If Not bNotFirst Then
         Application.EnableEvents = False
         Cells.Clear
         Application.EnableEvents = True
         bNotFirst = True
     End If

     If Target.Count > 1 Then Exit Sub

     Static n As Integer

     n = n + 1
     Application.Wait Now + TimeSerial(0, 0, 1)
     Application.StatusBar = "Событие инициировано " & n & "-ый раз"
     'If n = 100 Then End

     On Error GoTo errHandle
     Randomize
     Dim r As Integer, c As Integer
     r = CInt(Rnd * 10 - 5)
     c = CInt(Rnd * 10 - 5)

     Dim col As Integer: col = 256 - 3 * n
     If col < 0 Then End
     Target.Interior.Color = RGB(col, col, col)
      
     With Target.Item(r, c)
         .Select
         .Value = n & " (" & r & ", " & c & ")"
     End With

errHandle:
     MsgBox "Попытка прыгнуть из ячейки " & Target.Address(0, 0) & _
            " в ячейку (" & r & ", " & c & ")"
     End
End Sub
[/vba]
 
Ответить
Сообщениеэта строка
[vba]
Code
Range("F4")(2,3)
[/vba]
≡[vba]
Code
Range("F4").Item(2,3)
[/vba]
есть ячейка со 2-ой строкой и 3-м столбцом, НО при условии, что вместо первой ячейки "A1", ячейка "F4", т.е.
здесь Range("F4") - это начало новой системы координат.

пример:
[vba]
Code
Range("F10").Range("B4").Select
[/vba]

с рэнджем (сэллсом) вообще все не тривиально...

мне кажется с концепции событий изучать язык не совсем правильно - это Вадим тебе.

чтобы прочувствовать ситуацию, вставь этот обработчик и измени какую-нибудь ячейку (подальше от A1):
[vba]
Code
Option Explicit
Dim bNotFirst As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
     If Not bNotFirst Then
         Application.EnableEvents = False
         Cells.Clear
         Application.EnableEvents = True
         bNotFirst = True
     End If

     If Target.Count > 1 Then Exit Sub

     Static n As Integer

     n = n + 1
     Application.Wait Now + TimeSerial(0, 0, 1)
     Application.StatusBar = "Событие инициировано " & n & "-ый раз"
     'If n = 100 Then End

     On Error GoTo errHandle
     Randomize
     Dim r As Integer, c As Integer
     r = CInt(Rnd * 10 - 5)
     c = CInt(Rnd * 10 - 5)

     Dim col As Integer: col = 256 - 3 * n
     If col < 0 Then End
     Target.Interior.Color = RGB(col, col, col)
      
     With Target.Item(r, c)
         .Select
         .Value = n & " (" & r & ", " & c & ")"
     End With

errHandle:
     MsgBox "Попытка прыгнуть из ячейки " & Target.Address(0, 0) & _
            " в ячейку (" & r & ", " & c & ")"
     End
End Sub
[/vba]

Автор - Саня
Дата добавления - 27.04.2012 в 22:49
light26 Дата: Пятница, 27.04.2012, 23:45 | Сообщение № 29
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Quote (Саня)
мне кажется с концепции событий изучать язык не совсем правильно

Саш, да я не изучаю. Просто я понял, что используя макрорекордер проще вникнуть или дописать макрос
Например, тот код, с которого я начал эту тему изначально выглядел так:
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range)                  
     If Target.Cells.Count > 1 Then Exit Sub                    
         If Not Intersect(Target, Range("A1:A100")) Is Nothing Then        
             With Target(1, 5)                    
                 .Value = Now                    
                 .EntireColumn.AutoFit  
             End With
         End If
      End Sub
[/vba]
Я чуток поковырялся и налепил своих хотелок.
А про те строки, что мне были не понятны, решил получить разъяснения тут.
Пусть со скрипом, но что-то уже начало проясняться. За это всем спасибо smile


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Quote (Саня)
мне кажется с концепции событий изучать язык не совсем правильно

Саш, да я не изучаю. Просто я понял, что используя макрорекордер проще вникнуть или дописать макрос
Например, тот код, с которого я начал эту тему изначально выглядел так:
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range)                  
     If Target.Cells.Count > 1 Then Exit Sub                    
         If Not Intersect(Target, Range("A1:A100")) Is Nothing Then        
             With Target(1, 5)                    
                 .Value = Now                    
                 .EntireColumn.AutoFit  
             End With
         End If
      End Sub
[/vba]
Я чуток поковырялся и налепил своих хотелок.
А про те строки, что мне были не понятны, решил получить разъяснения тут.
Пусть со скрипом, но что-то уже начало проясняться. За это всем спасибо smile

Автор - light26
Дата добавления - 27.04.2012 в 23:45
light26 Дата: Пятница, 27.04.2012, 23:48 | Сообщение № 30
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Quote (Саня)
чтобы прочувствовать ситуацию

очень смутно представил себе принцип работы этого кода. некоторые строки отлично понял как работают, некоторые не понял совсем. но что самое хреновое - не понял смысла этого кода sad


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Quote (Саня)
чтобы прочувствовать ситуацию

очень смутно представил себе принцип работы этого кода. некоторые строки отлично понял как работают, некоторые не понял совсем. но что самое хреновое - не понял смысла этого кода sad

Автор - light26
Дата добавления - 27.04.2012 в 23:48
light26 Дата: Пятница, 27.04.2012, 23:51 | Сообщение № 31
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Тут один из моих постов без ответа остался. Видать затерялся в куче сообщений smile
Quote (light26)
Цитата, shanemac51 писал(а):
'Columns("f:f") '''не нужна

то-есть строка With Target(1, 6) подразумевает, что все записи ниже будут относиться к шестому столбцу, то-есть к столбцу F. до тех пор, пока выполнение процедуры не дойдет до End With. А каждая новая строка должна начинаться с точки. Я правильно понял?


Я не волшебник. Я только учусь
 
Ответить
СообщениеТут один из моих постов без ответа остался. Видать затерялся в куче сообщений smile
Quote (light26)
Цитата, shanemac51 писал(а):
'Columns("f:f") '''не нужна

то-есть строка With Target(1, 6) подразумевает, что все записи ниже будут относиться к шестому столбцу, то-есть к столбцу F. до тех пор, пока выполнение процедуры не дойдет до End With. А каждая новая строка должна начинаться с точки. Я правильно понял?

Автор - light26
Дата добавления - 27.04.2012 в 23:51
Саня Дата: Пятница, 27.04.2012, 23:54 | Сообщение № 32
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
смысл в том, что изменение одной ячейки приводит к потоку событий - часть кода обработчика события инициирует самое (вроде это слово так пишется biggrin ) себя, получается бесконечный цикл
 
Ответить
Сообщениесмысл в том, что изменение одной ячейки приводит к потоку событий - часть кода обработчика события инициирует самое (вроде это слово так пишется biggrin ) себя, получается бесконечный цикл

Автор - Саня
Дата добавления - 27.04.2012 в 23:54
light26 Дата: Суббота, 28.04.2012, 00:03 | Сообщение № 33
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Quote (Саня)
получается бесконечный цикл

Ну, не бесконечный... )))
Quote (Саня)
изменение одной ячейки приводит к потоку событий - часть кода обработчика события инициирует самое (вроде это слово так пишется biggrin ) себя

Это ты про Application.EnableEvents = False , да?


Я не волшебник. Я только учусь
 
Ответить
Сообщение
Quote (Саня)
получается бесконечный цикл

Ну, не бесконечный... )))
Quote (Саня)
изменение одной ячейки приводит к потоку событий - часть кода обработчика события инициирует самое (вроде это слово так пишется biggrin ) себя

Это ты про Application.EnableEvents = False , да?

Автор - light26
Дата добавления - 28.04.2012 в 00:03
Саня Дата: Суббота, 28.04.2012, 00:05 | Сообщение № 34
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
Quote (light26)
Тут один из моих постов без ответа остался. Видать затерялся в куче сообщений smile
Цитата, light26 писал(а):
Цитата, shanemac51 писал(а):
'Columns("f:f") '''не нужна

то-есть строка With Target(1, 6) подразумевает, что все записи ниже будут относиться к шестому столбцу, то-есть к столбцу F. до тех пор, пока выполнение процедуры не дойдет до End With. А каждая новая строка должна начинаться с точки. Я правильно понял?

[vba]
Code
with a
    .metod1
    .metod2
    .metod3
    b=.svoystvo1
end with
[/vba]
равно
[vba]
Code

    a.metod1
    a.metod2
    a.metod3
    b=a.svoystvo1
[/vba]

ничего более
 
Ответить
Сообщение
Quote (light26)
Тут один из моих постов без ответа остался. Видать затерялся в куче сообщений smile
Цитата, light26 писал(а):
Цитата, shanemac51 писал(а):
'Columns("f:f") '''не нужна

то-есть строка With Target(1, 6) подразумевает, что все записи ниже будут относиться к шестому столбцу, то-есть к столбцу F. до тех пор, пока выполнение процедуры не дойдет до End With. А каждая новая строка должна начинаться с точки. Я правильно понял?

[vba]
Code
with a
    .metod1
    .metod2
    .metod3
    b=.svoystvo1
end with
[/vba]
равно
[vba]
Code

    a.metod1
    a.metod2
    a.metod3
    b=a.svoystvo1
[/vba]

ничего более

Автор - Саня
Дата добавления - 28.04.2012 в 00:05
light26 Дата: Суббота, 28.04.2012, 00:07 | Сообщение № 35
Группа: Друзья
Ранг: Старожил
Сообщений: 1350
Репутация: 91 ±
Замечаний: 0% ±

2007, 2010, 2013
Саня, значит усе верно. Это уже радует smile
Ну, на сегодня хватит...


Я не волшебник. Я только учусь
 
Ответить
СообщениеСаня, значит усе верно. Это уже радует smile
Ну, на сегодня хватит...

Автор - light26
Дата добавления - 28.04.2012 в 00:07
Саня Дата: Суббота, 28.04.2012, 00:08 | Сообщение № 36
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
Quote (light26)
Это ты про Application.EnableEvents = False , да?

если ты это поставишь в начале процедуры-обработчика, а в конце включишь "вменяемость", то процедура не влетит в бесконечный "блудняк".
 
Ответить
Сообщение
Quote (light26)
Это ты про Application.EnableEvents = False , да?

если ты это поставишь в начале процедуры-обработчика, а в конце включишь "вменяемость", то процедура не влетит в бесконечный "блудняк".

Автор - Саня
Дата добавления - 28.04.2012 в 00:08
Alex_ST Дата: Суббота, 28.04.2012, 08:37 | Сообщение № 37
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Quote (Саня)
[vba]
Code
Range("F4").Item(2,3)
[/vba]есть ячейка со 2-ой строкой и 3-м столбцом, НО при условии, что … Range("F4") - это начало новой системы координат.
Саня, ты где такой мудрости набрался? Нигде не встречал... Но ведь и в правду работает!



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Суббота, 28.04.2012, 08:40
 
Ответить
Сообщение
Quote (Саня)
[vba]
Code
Range("F4").Item(2,3)
[/vba]есть ячейка со 2-ой строкой и 3-м столбцом, НО при условии, что … Range("F4") - это начало новой системы координат.
Саня, ты где такой мудрости набрался? Нигде не встречал... Но ведь и в правду работает!

Автор - Alex_ST
Дата добавления - 28.04.2012 в 08:37
RAN Дата: Суббота, 28.04.2012, 08:48 | Сообщение № 38
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Погляди еще эти строчки
[vba]
Code
Range("F10").Range("D4").Select
Range("F10").Cells(-3, -2).Select
[/vba]
Это аналогично
[vba]
Code
Selection.Range("D4").Select
Selection.Cells(-3, -2).Select
[/vba]
при выделении F10.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПогляди еще эти строчки
[vba]
Code
Range("F10").Range("D4").Select
Range("F10").Cells(-3, -2).Select
[/vba]
Это аналогично
[vba]
Code
Selection.Range("D4").Select
Selection.Cells(-3, -2).Select
[/vba]
при выделении F10.

Автор - RAN
Дата добавления - 28.04.2012 в 08:48
Саня Дата: Суббота, 28.04.2012, 10:49 | Сообщение № 39
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
Quote (Alex_ST)
Саня, ты где такой мудрости набрался? Нигде не встречал... Но ведь и в правду работает!

Лёх, это ж в справке есть - у рэнджа есть свойство(метод) Item, он(о) по-умолчанию, поэтому не обязательное к написанию...

посмотри вот так:
[vba]
Code
Option Explicit

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub t()
     Cells.Interior.Color = xlNone
      
     Dim r As Range
     Set r = Range("A1:D10")
'    Set r = Range("A1:D10,F12:G20")
      
     r.Interior.Color = vbRed
      
     Dim i As Integer
      
     For i = 1 To 70
         r.Item(i).Select ' или r(i).Select
         Sleep 100
     Next i
End Sub
[/vba]
 
Ответить
Сообщение
Quote (Alex_ST)
Саня, ты где такой мудрости набрался? Нигде не встречал... Но ведь и в правду работает!

Лёх, это ж в справке есть - у рэнджа есть свойство(метод) Item, он(о) по-умолчанию, поэтому не обязательное к написанию...

посмотри вот так:
[vba]
Code
Option Explicit

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub t()
     Cells.Interior.Color = xlNone
      
     Dim r As Range
     Set r = Range("A1:D10")
'    Set r = Range("A1:D10,F12:G20")
      
     r.Interior.Color = vbRed
      
     Dim i As Integer
      
     For i = 1 To 70
         r.Item(i).Select ' или r(i).Select
         Sleep 100
     Next i
End Sub
[/vba]

Автор - Саня
Дата добавления - 28.04.2012 в 10:49
Alex_ST Дата: Суббота, 28.04.2012, 11:00 | Сообщение № 40
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Саш, у массива/словаря/коллекции тоже есть свойства Item
А попробуй-ка ты обратись к Item, номер которого больше чем есть в объекте? Ошибочка будет! Что в общем-то вполне логично.
Вот и с диапазоном, я был уверен и даже проверять не стал пока здесь не наткнулся... Если задаётся Range("A1:B2"), то это должно быть как массив 2х2 ячейки. И обращение к элементу за пределами объекта должно было вызвать ошибку!



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеСаш, у массива/словаря/коллекции тоже есть свойства Item
А попробуй-ка ты обратись к Item, номер которого больше чем есть в объекте? Ошибочка будет! Что в общем-то вполне логично.
Вот и с диапазоном, я был уверен и даже проверять не стал пока здесь не наткнулся... Если задаётся Range("A1:B2"), то это должно быть как массив 2х2 ячейки. И обращение к элементу за пределами объекта должно было вызвать ошибку!

Автор - Alex_ST
Дата добавления - 28.04.2012 в 11:00
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Прошу помочь разобраться в макросе с Target и Intersect (Новое детище.. ну хорошо, не детище, так, детеныш ))
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!