автоматически выполните макрос Excel на изменении ячеек

Команда, подготовленная PDO, вызывает ошибку в предложении LIMIT

. Для целей совместимости PDO будет только emulate подготовленным операциям, заменив заполнители фактическими данными вместо их отправки на сервер отдельно, если не указано иное. И с «ленивой» привязкой (используя массив в execute ()), PDO будет обрабатывать каждый параметр как строку. В результате подготовленный LIMIT ?,? запрос становится LIMIT '10', '10', который является недопустимым синтаксисом, который вызывает запрос.

Эта проблема может быть решена либо

  • , путем включения эмуляции mode (так как MySQL может сортировать все заполнители должным образом):
    $conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
    
  • путем привязки и установки правильного типа (PDO :: PARAM_INT) явно:
    $stm = $pdo->prepare('SELECT * FROM table LIMIT ?, ?');
    $stm->bindValue(1, $limit_from,PDO::PARAM_INT);
    $stm->bindValue(2, $per_page,PDO::PARAM_INT);
    $stm->execute();
    $data = $stm->fetchAll();
    
89
задан vba_user111 11 July 2019 в 14:11
поделиться

4 ответа

Ваш код выглядит довольно хорошим.

Быть осторожным, однако, для Вашего вызова к Range("H5") команда ярлыка к Application.Range("H5"), который эквивалентен Application.ActiveSheet.Range("H5"). Это могло быть прекрасным, если единственные изменения являются пользовательскими изменениями - который является самым типичным - но для значений ячеек рабочего листа возможно измениться, когда это не активный лист через программируемые изменения, например, VBA.

Принимая это во внимание, я использовал бы Target.Worksheet.Range("H5"):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
End Sub

Или можно использовать Me.Range("H5"), если обработчик событий находится на кодовой странице для рассматриваемого рабочего листа (это обычно):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub

Hope это помогает...

106
ответ дан Liam 24 November 2019 в 07:20
поделиться

Обработайте Worksheet_Change событие или Workbook_SheetChange событие.

обработчики событий берут аргумент "Цель В качестве Диапазона", таким образом, можно проверить, включает ли диапазон, который это изменяет, ячейку, Вы интересуетесь.

7
ответ дан Liam 24 November 2019 в 07:20
поделиться

Я предпочитаю этот путь, не используя ячейку, но диапазон

    Dim cell_to_test As Range, cells_changed As Range

    Set cells_changed = Target(1, 1)
    Set cell_to_test = Range( RANGE_OF_CELLS_TO_DETECT )

    If Not Intersect(cells_changed, cell_to_test) Is Nothing Then 
       Macro
    End If
3
ответ дан Javier Torón 24 November 2019 в 07:20
поделиться

У меня есть ячейка, которая связана с онлайн-базой данных акций и часто обновляется. Я хочу запускать макрос всякий раз, когда обновляется значение ячейки.

Я считаю, что это похоже на изменение значения ячейки программой или любое обновление внешних данных, но приведенные выше примеры почему-то не работают для меня. Я думаю, проблема в том, что внутренние события excel не запускаются, но это мое предположение.

Я сделал следующее:

Private Sub Worksheet_Change(ByVal Target As Range) 
  If Not Intersect(Target, Target.Worksheets("Symbols").Range("$C$3")) Is Nothing Then
   'Run Macro
End Sub
0
ответ дан 24 November 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: