Функция массива VBA – возвращаемый массив из диапазона без пробелов

Я борюсь с основной проблемой в VBA и буду признателен за некоторую помощь. Я хочу определить функцию, которая возвращает массив из диапазона без пробелов, как показано ниже:

введите описание изображения здесь

Поэтому, когда я вызываю функцию в ячейке European Option, функция должна возвращать массив без каких-либо пробелов, например, с правой стороны.

Это код, который у меня есть до сих пор:

Function portfolioX(N) Dim MyArray(3) Dim i As Integer counter = 1 For i = 1 To N If IsEmpty(i) Then Next i Else portfolio = MyArray MyArray (counter) counter = counter + 1 Next i End If End Function 

Я новичок в VBA, так что это может быть совершенно неправильно. Благодаря!

Если оператор и цикл являются блоками кода. Вы не можете чередовать блоки кода.

 Function portfolioX(N) For i = 1 To N ' Block 1 starts If IsEmpty(i) Then ' Block 2 starts Next i 'Block 1 can't loop back because Block 2 has't closed Else portfolio = MyArray MyArray (counter) counter = counter + 1 Next i 'Block 1 can't loop back because Block 2 has't closed End If ' Block 2 End Function 

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

 For i = 1 to N next i 

Далее идет блок If

 For i = 1 To N If IsEmpty(i) Then End If Next i 

И наконец

 Function portfolioX(N) Dim MyArray(3) Dim i As Integer counter = 1 For i = 1 To N ' Block 1 Starts If IsEmpty(i) Then Block 2 Starts portfolio = MyArray MyArray (counter) counter = counter + 1 End If ' Block 2 Closes Next i 'If the Loop Condition is meet, Block 1 Closes, else i is incremented and the loop starts over End Function 

Учитывая то, о чем вы просите, я написал быстрый суб, который будет использовать любой выделенный диапазон, и вставьте значения с пустыми ячейками, удаленными в конце строки. Надеюсь, это может дать вам начало тому, что вы надеетесь достичь.

 Sub RemoveBlanks() Dim OriginalRange As Range, WorkCell As Range, PasteCol As Integer Set OriginalRange = Selection.Rows(1) 'Ensures only one row of data is selected PasteCol = Range(Cells(OriginalRange.Row, ActiveSheet.UsedRange.Columns.Count + 2).Address).End(xlToLeft) For Each WorkCell In OriginalRange If Not IsEmpty(WorkCell) Then Cells(OriginalRange.Row, PasteCol).Value = WorkCell.Value PasteCol = PasteCol + 1 Next WorkCell End Sub 

Исходя из вашего вопроса и комментариев в этом потоке, я понимаю, что вы хотите взять заданный диапазон (предоставленный процедуре) и напечатать все непустые значения до некоторого диапазона, начиная с той же строки в столбце R (18-й столбец).

В комментарии вы указываете диапазоны A1:A13 и A18:A21 , но они не соответствуют вашему снимку экрана. Я предполагаю, что вы имели в виду строку 1 (или произвольную строку), столбцы с 1 по 13 и столбцы с 18 по 21.

Вот решение этой проблемы:

 Sub arrayPaster(rng As Range) Dim s() As Variant, r() As Variant, j As Integer ReDim r(1 To 1, 1 To 1) s = rng.Value j = 1 For i = 1 To UBound(s, 2) If s(1, i) <> "" Then ReDim Preserve r(1 To 1, 1 To j) r(1, j) = s(1, i) j = j + 1 End If Next i Range("R" & rng.Row).Resize(1, UBound(r, 2)).Value = r End Sub 
  • EXCEL ищет строку / массив на основе значения ячейки
  • Как объявить и заполнить двухмерный массив функцией vba
  • VBA Диапазон заполнения от массива
  • excel VBA (не VBScript) 101: Как мне создать и прочитать многомерный массив?
  • Почему у меня возникают проблемы с назначением диапазона для массива вариантов
  • Excel «Array Constants» не читается как массивы VBA (без разбора)
  • Сравнить 2 массива для разницы с некоторыми значениями, повторяющимися
  • VBA Excel - Loop, основанный на значении диапазона ячеек
  • Тип Несоответствие VBA при копировании данных диапазона в массив
  • VBA: работайте для ограничения массива 65 536 с заданными пользователем функциями
  • Исключение из HRESULT: 0x800A03EC - Запись массива в диапазон в надстройке Excel
  • Давайте будем гением компьютера.