Страницы: 1 2 След.
RSS
Как привязать форму к конкретной ячейке
 
Здравствуйте.
Помогите с макросом, который запускает форму.

Есть простой макрос, запускающий форму.
Но форма все время открывается, в каком-то одном месте.

Как изменить макрос, чтобы форма открывалась, не где-нибудь а в районе ячейки, адрес которой указан в F3 ?
То есть форма откроется так, что ее верхний левый угол - будет совпадать с левым верхнем углом ячейки, чей адрес указан в F3 (это ячейка J7)
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
Цитата
Красноглазый Пиркаф написал:
а в районе ячейки
а точнее?
Ох не совсем простое это занятие, нужно учитывать и положене окна и видимую область и масштаб
В закромах валялось, но не помню уже, работало ли :-) ActiveCell - это относительно какой ячейки позиционируем форму.
Код
'With Application
'    Me.Top = (((.Height - .UsableHeight) + (.ActiveCell.Top - .ActiveWindow.VisibleRange.Top) + .ActiveCell.Height - 2) * .ActiveWindow.Zoom / 100) + .ActiveWindow.Top + .Top
'    Me.Left = (((.Width - .UsableWidth) + (.ActiveCell.Left - .ActiveWindow.VisibleRange.Left) + .ActiveCell.MergeArea.Width + 17) * .ActiveWindow.Zoom / 100) + .ActiveWindow.Left + .Left
'End With
По вопросам из тем форума, личку не читаю.
 
БМВ, почему-то данная система не работает. Выдает ошибку:
Цитата
"Compile error: Invalid use of Me keyword"
А сам макрос выглядит так:
Код
Sub Form_Show11()
    UserForm1.Show
With Application
    Me.Top = (((.Height - .UsableHeight) + (.ActiveCell.Top - .ActiveWindow.VisibleRange.Top) + .ActiveCell.Height - 2) * .ActiveWindow.Zoom / 100) + .ActiveWindow.Top + .Top
    Me.Left = (((.Width - .UsableWidth) + (.ActiveCell.Left - .ActiveWindow.VisibleRange.Left) + .ActiveCell.MergeArea.Width + 17) * .ActiveWindow.Zoom / 100) + .ActiveWindow.Left + .Left
End With
End Sub
Как вы считаете, чем может быть вызвана эта ошибка ?
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
Естесвенно, это надо  в Private Sub UserForm_Activate()
По вопросам из тем форума, личку не читаю.
 
БМВ, ясно, исправил.
Но все равно что-то не то.

Жму на кнопку запуска - форма появляется и моментально исчезает
Жму второй раз - форма появляется, но не там, где находится активная ячейка.
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
ну при масштабе 100 все ок, но не при других :-(
По вопросам из тем форума, личку не читаю.
 
БМВ, так у меня 100% масштаб и стоит.
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
Добрый день, с праздником!

У Владимира (ZVI) есть известное решение.
Владимир
 
sokol92,  вас тоже поздравляю с праздником.

Открываю файл, на который вы ссылаетесь - но макрос в нем, к сожалению - не работает.
Выдает ошибку:
Цитата
Could not load an object because it is not available on this machine
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
.
Изменено: Ivan.kh - 09.05.2019 18:33:52
 
Ivan.kh, не работает.
При двойном щелчке на ячейке - выдает ошибку:
Цитата
Run-time error 429: ActiveX component cant create object.
И еще выдает ошибку:
Цитата
Compile error: Type mismatch
Изменено: Красноглазый Пиркаф - 09.05.2019 18:44:21
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
на 2-х разных компьютерах проверил. все работает ...
 
Ivan.kh, проверил этот файл еще раз.

Он работает только на Excel2008 а на Excel2013 - уже не работает.
(Выдает ошибку и подсвечивает в коде - слово "FindWindow"

Как изменить этот макрос, чтобы он и на excel2013 - тоже стал работать ?
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
Цитата
Красноглазый Пиркаф написал:
на Excel2008
точно не сработает :-)
По вопросам из тем форума, личку не читаю.
 
БМВ, я говорю - что запустил этот макрос на эксель2008 - и там он работал.
И вопрос в том - что изменить в макросе, чтобы он заработал и на экселе2013.
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
Попробуйте такую редакцию (#If Win64->VBA7, тип hwnd->Variant).
Владимир
 
Цитата
Красноглазый Пиркаф написал:
эксель2008
Excel 2007, 2010, Server 2008? Excel 2008 for MAC - знаю , Excel 2008  под Win - не знаю.
По вопросам из тем форума, личку не читаю.
 
Цитата
Красноглазый Пиркаф написал:
Он работает только на Excel2008 а на Excel2013 - уже не работает.
ЭЭЭЭ... Вы, как-бы, ничего не путаете? Ибо данный код предназначен для нормального Excel, к коим относится 2013, ибо использует API Windows, но никак не 2008, предназначенный для огрызка, которому сии нюансы неведомы.
Изменено: RAN - 09.05.2019 20:16:59
 
Красноглазый Пиркаф, Для Excel на Mac есть отдельная ветка на форуме...
 
sokol92, спасибо.
Теперь все намного лучше и макрос работает в Excel2013.

Скажите, а как назначить привязку этой формы к одной единственной ячейке J7 ?
Потому что сейчас эта форма привязывается вообще к любой ячейке по которой щелкнули.
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
Код
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  If Not Intersect(Target, Range("J7")) Is Nothing Then
    With Target(1)
      If .HasFormula Then Exit Sub
      If IsDate(.Value) Or IsEmpty(.Value) Then
        UserForm1.Show vbModeless
        Cancel = True
      End If
    End With
  End If
End Sub 
Красноглазый Пиркаф,  а Вы УМЫШЛЕННО для всей книги делаете?
 
Юрий М, добавил этот код.
А как этот код к кнопке подключить ?

Я вот так записал, но выдает ошибку :
Код
Sub Макрос1()
  If Not Intersect(Target, Range("J7")) Is Nothing Then
    With Target(1)
      If .HasFormula Then Exit Sub
      If IsDate(.Value) Or IsEmpty(.Value) Then
        UserForm1.Show vbModeless
        Cancel = True
      End If
    End With
  End If
End Sub
Я имел ввиду - не двойной щелчок по ячейке J7, а запуск с кнопки.
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
Убираем событие, указываем ячейку.
Код
Sub Macro1()
    With Range("J7")
      If .HasFormula Then Exit Sub
      If IsDate(.Value) Or IsEmpty(.Value) Then UserForm1.Show vbModeless
    End With
End Sub
 
В Вашем примере событийный макрос, который сработает на двойной клик в любом листе. А Ваш вариант в #22 не сработает - нет Target в данном случае ))
Точно нужно на кнопку? И требуется уточнение - нажатие на кнопку должно отобразить форму, только если активна ячейка J7?
 
vikttur, ясно.
Теперь форма открывается, но не там где нужно.
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
Код
Sub Macro1()
  If ActiveCell.Address = "$J$7" Then
    With ActiveCell
      If .HasFormula Then Exit Sub
      If IsDate(.Value) Or IsEmpty(.Value) Then
        UserForm1.Show vbModeless
      End If
    End With
  End If
End Sub
 
Цитата
Юрий М написал:
В Вашем примере событийный макрос
Я знаю. Но это не мой пример, мне его дали.
Поэтому я и спрашиваю как его на кнопку навесить.
Цитата
Юрий М написал:
Точно нужно на кнопку? И требуется уточнение - нажатие на кнопку должно отобразить форму, только если активна ячейка J7?
Да - точно нужно на кнопку.
Нажатие на кнопку - должно отобразить форму у ячейки J7, вне зависимости от того - какая ячейка активна.
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
Цитата
Красноглазый Пиркаф написал:
вне зависимости от того - какая ячейка активна.
А сразу (СРАЗУ!) нельзя было об этом сказать?
 
Юрий М, так вроде бы я в первом сообщении сразу и написал свой вопрос.
Если люди не научатся помогать друг другу, то род человеческий исчезнет с лица земли.
Вальтер Скотт
 
Найдите в коде фрагмент и исправьте так:
Код
    ' Определить колонку и столбец ячейки под курсором мышки
'    With .RangeFromPoint(Pt.x, Pt.y).MergeArea.Cells
'      a = .Address
      a = "$J$7"
'    End With

Страницы: 1 2 След.
Читают тему
Наверх