Niezgodność typu 13 programu Excel VBA przy użyciu tablicy zawierającej wartości i ciągi


Mam problemy z błędem wykonania 13 „Błąd niezgodności typów”. Próbuję wziąć wiele wierszy kodu i skondensować je w jednym wierszu, czyli w każdym wierszu obok niego. Problem polega na tym, że moje dane wejściowe to łańcuchy i liczby i uważam, że to jest przyczyną tego problemu. Jak mogę to naprawić?
Sub multRowsTo1Row()
Dim inputRange As Variant
Dim outputRange As Variant inputRange = Selection
y = UBound(inputRange, 1)
x = UBound(inputRange, 2) ReDim outputRange(1 To x * y) For j = 1 To y
For i = 1 To x
outputRange(i + y(j - 1)) = inputRange(j, i)
Next i
Next j Selection.Offset(0, x).Select
End Sub

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zadeklaruj zmienne poprawnie
Dim x #, y #
. To naprawi błąd niezgodności, ale przedstawi inny błąd, ponieważ
y (j - 1)
oczekuje tablicy. Dodaj znak mnożenia tak, aby był
y * (j-1)
i unikniesz tego błędu, ale możesz uzyskać przepełnienie w przypadku
Selection.Rows.Count & > 2
, więc możesz również dodać czek.
Sub multRowsTo1Row()
Dim inputRange As Variant
Dim outputRange As Variant
Dim y#, x# If selection.Rows.Count > 2 Then
MsgBox "Invalid Selection!", vbCritical
Exit Sub
End If inputRange = Selection
y = UBound(inputRange, 1)
x = UBound(inputRange, 2) ReDim outputRange(1 To x * y)For j = 1 To y
For i = 1 To x
outputRange(i + y * (j - 1)) = inputRange(j, i)
Next i
Next jSelection.Offset(0, x).Select
End Sub

Jak zawsze, dużo bólu i można uniknąć rozwiązywania problemów dzięki
Option Explicit
, a także mierzeniu zmiennych do określonego
Type
:)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Odniosłem sukces dzięki Davidowi. Oto mój ostateczny kod.
Sub multRowsTo1Row()

„To pobiera tablicę wielu linii i umieszcza każdą linię obok siebie
”obecnie umieszcza go w pobliżu górnej linii. Można to zmienić.
Dim inputRange As Variant
Dim outputRange As Variant
Dim x#, y#inputRange = Selectiony = UBound(inputRange, 1)
x = UBound(inputRange, 2)ReDim outputRange(1 To x * y)For j = 1 To y
For i = 1 To x
outputRange(i + x * (j - 1)) = inputRange(j, i)
Next i
Next j

„Zmień to, jeśli chcesz drukować w innym miejscu. Spowoduje to wstawienie wyniku po prawej stronie ostatniego wpisu w pierwszym wierszu.
Selection.Offset(0, x).Resize(1, x * y).Select
Selection = outputRange
End Sub

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się