Проверьте, содержит ли ячейка в диапазоне дату - PullRequest
0 голосов
/ 03 января 2019

Я хотел бы определить, содержит ли ячейка в моем диапазоне дату (любую дату) и позволяет ли она выйти из подпрограммы с сообщением.Формат даты выглядит следующим образом: dd-mmm-yy, но генерируется формулой внутри ячейки.

Вот часть моего кода, уже написанного вместе с псевдокодом того, чего я хочу достичь.

Sub RemoveRowButton()
'This Macro deletes a row where the button is clicked.
'Variables
Dim row As Long
Dim varResponse As Variant

Application.ScreenUpdating = False



'Message box confirming user is doing the right thing
varResponse = MsgBox("Delete this row? 'Yes' or 'No'", vbYesNo, "Delete Row")
    If varResponse <> vbYes Then Exit Sub

'Carry on with deleting row.....

Set rng = ActiveSheet.Buttons(Application.Caller).TopLeftCell.EntireRow


*******Pseudo Code *******
'Check if the row to be deleted has a date in the D Column of the range (which is a Row)

'If IsDate **in D column of the Range is ture*** Then
'MsgBox "This Row Contains a Date!"
'End If


'Unprotect sheet
ActiveSheet.Unprotect Password:="***"

'Delete row on button row
rng.Delete

'Protect sheet again
 ActiveSheet.Protect Password:="***"

End Sub

Если бы вы могли также объяснить свой код / ​​ответы, я был бы благодарен, Спасибо.

РЕДАКТИРОВАТЬ:

Спасибо за всю мою помощь, через пробную иошибка создала это, что работает для меня.

 Set rng2 = rng.Cells(, 4)
   If IsDate(rng2.Value) Then 'Check Cell for Date
     MsgBox "Warning: This Row Cannot be deleted!"
   Exit Sub
   End If

Так как я не знаком с VBA, я не знаю, является ли это "ОКАЙ" в смысле лучших практик.Если нет, и вы хотите исправить это, пожалуйста, сделайте это.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

@ J4C3N-14 вы пробовали:

Sub Test_Date()

    Dim strDate As String

    With ThisWorkbook.Worksheets("Sheet1")

        strDate = .Range("A1").Value

        If IsDate(strDate) Then
            'Code
        End If

    End With

End Sub
0 голосов
/ 03 января 2019

Вот идея вашей проблемы. Установите код в листе кода на рабочем листе, на котором вы хотите выполнить действие (не в стандартном модуле, таком как «Модуль1» !!). Обратите внимание, что код реагирует на двойной щелчок в столбце D от строки 2 до строки последняя использованная строка в столбце A . Вы можете настроить это. Следуйте инструкциям в самом коде. Я использую этот метод вместо кнопки, которую вы, кажется, используете в каждой строке вашего листа - вопрос предпочтения, но используемый здесь для демонстрации и во избежание создания кнопок.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    ' 03 Jan 2019

    Dim Rng As Range
    Dim R As Long
    Dim Cell As Range
    Dim i As Integer

    R = Cells(Rows.Count, "A").End(xlUp).Row        ' last used row in column A
    Set Rng = Range(Cells(2, 4), Cells(R, 4))       ' used range in column D

    If Not Application.Intersect(Target, Rng) Is Nothing Then
        ' if a cell in Rng as double-clicked:-
        R = Target.Row
        Set Rng = Range(Cells(R, "A"), Cells(R, "S"))
        For Each Cell In Rng
            With Cell
                If IsDate(.Value) Then
                    For i = 3 To 1 Step -1
                        ' check if the Numberformat contains all of "m", "d" and "y"
                        If InStr(1, .NumberFormat, Mid("dmy", i, 1), vbTextCompare) = 0 Then Exit For
                    Next i
                    If i = 0 Then                   ' all 3 were found
                        If MsgBox("Do you want to delete row " & R & " ?", _
                                  vbQuestion Or vbYesNo, _
                                  "Click ""No"" to keep the row") = vbYes Then
                            Rows(R).Delete
                        End If
                        Exit For
                    End If
                End If
            End With
        Next Cell
        Cancel = True                               ' ends in-cell editing
    End If
End Sub

Код выполняет две проверки в каждой ячейке (A: S). Сначала он проверяет, является ли его значение датой. Затем, предполагая, что это число, он проверяет формат ячейки. Если NumberFormat включает в себя все буквы «m», «d» и «y», это подтверждается как дата и высвобождается для удаления, до которого пользователь может подтвердить свое намерение. Этот метод может потребовать небольшой подстройки. Во-первых, если в ячейке есть текстовая дата, необходимо выполнить другую вторую проверку. Во-вторых, если формат даты состоит только из 2 из 3 критериев, тест на их присутствие в маске должен быть соответственно уменьшен. Любая из этих модификаций или обе могут быть реализованы, когда природа ваших данных будет лучше понята.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...