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
Co tam
źródło
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 ++.

Steve
źródło
28

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

If Not strTest = "" Then ...
Francuz
źródło
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.

Đức Thanh Nguyễn
źródło
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,
2

Spróbuj użyć <>zamiast !=.

Steve
źródło