VBA - изменить числа в диапазоне переменных на отрицательные - PullRequest
0 голосов
/ 16 октября 2018

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

Я получил код по приведенной ниже ссылке, который изменит значения данного диапазона на отрицательные:

https://www.extendoffice.com/documents/excel/677-excel-change-positive-numbers-to-negative.html

Но проблема в том, что для этого потребуется взаимодействие с пользователем.

Код:

Sub ChangeToNegative()
    'Updateby20131113
    Dim rng As Range
    Dim WorkRng As Range

    On Error Resume Next

    xTitleId = "KutoolsforExcel"
    Set WorkRng = Application.Selection
    Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
    Set WorkRng = WorkRng.SpecialCells(xlCellTypeConstants, xlNumbers)

    For Each rng In WorkRng
        xValue = rng.Value
        If xValue > 0 Then
            rng.Value = xValue * -1
        End If
    Next
End Sub

Затем я обнаружил, что поместил код в сам лист и назову суб Change(ByVal Target As Range), который будет обновлять выбранный диапазон по мере его использования.

Код:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Dim WorkRng As Range
    On Error Resume Next

    Set WorkRng = Application.Selection
    Set WorkRng = WorkRng.SpecialCells(xlCellTypeConstants, xlNumbers)

    If Target.Address = WorkRng Then     
        For Each rng In WorkRng
            xValue = rng.Value
            If xValue > 0 Then
                rng.Value = xValue * -1
            End If
        Next 
    End If
End Sub

Это прекрасно работает, но тогда это означает, что, какую бы ячейку я ни щелкнул и набрал цифры, она будет отрицательной.

Поэтому вместо использования Application.Selection я хочу задать ей определенный диапазон- но тот, который может измениться.

  1. Так что, только если в ячейках C5:C143 есть текст, ячейки F5:F143 должны быть отрицательными числами

  2. Если я удаляю все ячейки между C5:C143, то диапазон должен быть обновлен соответствующим образом.

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

1 Ответ

0 голосов
/ 16 октября 2018

Я добавил множество комментариев, чтобы объяснить, что делает код.

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim WorkRng As Range
    Dim RangeToCheck As Range
    Dim rCell As Range

    'Don't Resume Next - if an error occurs handle it properly
    'and don't just hope the code can carry on regardless.
    On Error GoTo Err_Handle

    'This is the range we're looking at.
    'Use a named range so the range will update if you add/remove cells.
    Set RangeToCheck = Union(Range("Column_C_Figures"), Range("F5:F143"))

    'Are any cells within the required range?
    If Not Intersect(Target, RangeToCheck) Is Nothing Then

        'The cell will be updated, so disable events so
        'Worksheet_Change doesn't fire a second time.
        Application.EnableEvents = False

        'Look at each cell in Target.
        'More than one cell could change if values pasted in, or row deleted, or....
        For Each rCell In Target
            'All values in Target may not be in RangeToCheck so only look at
            'the ones that are.
            If Not Intersect(rCell, RangeToCheck) Is Nothing Then
                If IsNumeric(rCell) And rCell > 0 Then
                    rCell = rCell * -1
                End If
            End If
        Next rCell

    End If

Fast_Exit:

    Application.EnableEvents = True

Exit Sub

Err_Handle:
    'Deal with any errors and resume so that events are re-enabled.
    Select Case Err.Number
        'Case 13 'Example of error that may occur.
            'Deal with a data type mismatch and either
            'Resume, Resume Next or Resume Fast_Exit.
        Case Else
            Resume Fast_Exit
    End Select

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