2013-05-22 1 views
0

У меня возникают проблемы с ошибкой Runtime 13 «Ошибка несоответствия типа». Я пытаюсь использовать несколько строк кода и конденсировать их в одну строку, каждая из которых размещена рядом. Проблема в том, что мои входы - это строки и числа, что, по моему мнению, вызывает эту проблему. Как я могу это исправить?Excel VBA Тип 13 Несоответствие с использованием массива, содержащего значения и строки

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 

ответ

2

Правильно объявите свои переменные Dim x#, y#. Это исправит ошибку Mismatch, но представит вам другую ошибку, так как y(j - 1) ожидает массив. Добавьте знак умножения так, чтобы он был y * (j-1), и вы избежите этой ошибки, но вы можете получить переполнение в случае, если Selection.Rows.Count > 2, так что вы также можете добавить чек для этого.

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 j 

Selection.Offset(0, x).Select 


End Sub 

Как всегда, много боли & поиска неисправностей можно избежать при использовании Option Explicit, а также размеров переменных к определенному Type :)

+0

Это было! Спасибо. Просто из любопытства, почему я помещаю хэш-символы после x и y? Кроме того, точка кода состоит из двух или более строк. Я не сталкивался с проблемами переполнения, но я не тестировал их на больших наборах данных. –

+0

hashtag - сокращенное обозначение для 'Integer', вы можете« Dim y As Integer, x As Integer », это то же самое. Если вы не попали в ошибку переполнения, не беспокойтесь об этом, я подумал, что у меня ошибка, поэтому я добавил этот тест 'If selection.Rows.count> 2 ...', поэтому вы можете удалить эти строки , –

+0

Еще раз спасибо !!! –

0

Я был успешным благодаря Давиде. Вот мой окончательный код.

Sub multRowsTo1Row() 

«» Это занимает массив нескольких строк и помещает каждую сторону строки бока «» В настоящее время помещает его рядом с верхней строкой. Это можно изменить.

Dim inputRange As Variant 
Dim outputRange As Variant 
Dim x#, y# 

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 + x * (j - 1)) = inputRange(j, i) 
    Next i 
Next j 

'' Измените это, если вы хотите вывести где-то еще. Это вставляет вывод в правую часть последней записи в первой строке.

Selection.Offset(0, x).Resize(1, x * y).Select 
    Selection = outputRange 
End Sub