Jaki jest odpowiednik „! =” W Excel VBA?


95

Problem polega na tym, !=że nie działa jako funkcja w programie Excel VBA.

Chcę móc korzystać

If strTest != "" Then zamiast If strTest = "" Then

Czy istnieje inne podejście do zrobienia tego poza !=?

Moją funkcją naśladowania !=jest

Sub test()

Dim intTest As Integer
Dim strTest As String

intTest = 5

strTest = CStr(intTest) ' convert

Range("A" + strTest) = "5"



    For i = 1 To 10
        Cells(i, 1) = i

        If strTest = "" Then
            Cells(i, 1) = i
        End If

    Next i


End Sub

1
Czy na pewno tak jest !=i nie <>?
Sergey Kalinichenko

Jakie jest Twoje pytanie? Dlaczego !=nie działa w VBA lub jaki jest operator nierówności w VBA?
GSerg,

Odpowiedzi:


154

Ponieważ operator nierówności w VBA to <>

If strTest <> "" Then
    .....

operator !=jest używany w językach C #, C ++.


28

W VBA !=operator jest Notoperatorem, na przykład:

If Not strTest = "" Then ...

5
To jest niepoprawne. Notjest logicznym operatorem inwersji, który odpowiada !językom w stylu C.
Zev Spitz

7

Tylko uwaga. Jeśli chcesz porównać ciąg z "", w twoim przypadku, użyj

If LEN(str) > 0 Then

lub nawet po prostu

If LEN(str) Then

zamiast.


6
Wiem, że dla ludzi trochę nowych w VBA ta odpowiedź może wydawać się dziwna, ale to, wierzcie lub nie, jest o wiele bardziej wydajne niż sprawdzanie<> ""
LimaNightHawk

6
Ciekawostka na poparcie tej odpowiedzi: języki Visual Basic i Pascal przechowują ciągi znaków z ich długością na początku i samą zawartością zaraz po tym. Z drugiej strony języki oparte na języku C i Java nie przechowują długości i mają terminator „\ 0” (null), który sygnalizuje koniec ciągu. Z tego powodu uzyskanie długości w VBA jest szybkie - po prostu odczytuje liczbę całkowitą z pamięci - i jest powolne w Javie - musisz iterować przez ciąg.
Paulo Avelar

1
@LimaNightHawk jest znacznie bardziej wydajny? Czy możesz to rozwinąć, proszę? Wydaje mi się, że większość współczesnych kompilatorów złapałaby wzorzec <> ""i wyprodukowałaby ten sam kod p co Len(str).
Roland

@Roland Ma to związek ze sposobem, w jaki VBA przechowuje ciągi znaków w pamięci. Dam ci Google dla pełniejszego wyjaśnienia, ale w skrócie, część jak struny są zapisane jest, że pierwsze bajty przechowywania długości łańcucha, po czym dodaje bajty przechowywać znaki: [3][C][A][T]. „Pusty” ciąg znaków ma [0]pierwsze bajty, a sprawdzenie Lenpozwala kodowi po prostu sprawdzić i porównać liczby całkowite. Ponadto, gdy wykonujesz = ""tę sekundę, ""najpierw należy ją zaalokować jako własny ciąg w pamięci, a następnie porównać z ciągiem docelowym.
LimaNightHawk

@Roland: To byłaby łatwa optymalizacja, ale najwyraźniej kompilator VBA tego nie robi. Ktoś wykonał test porównawczy z wynikiem Len(str) > 0około dwa razy szybszym niż w str <> ""przypadku 10 milionów iteracji. To powiedziawszy, mówimy tutaj o ekstremalnej mikro-optymalizacji (0,36 vs 0,72 sekundy przez 10 milionów iteracji), więc na pewno pozostanę przy bardziej czytelnym str <> "".
Heinzi,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.