2016-06-13 2 views
2

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

enter image description here

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

Это код, который я до сих пор:

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, так что это может быть совершенно неправильно. Благодаря!

+0

Первое, что нужно узнать, когда обучение VBA является различие между подпрограммами и функциями. Если вы хотите что-то просто добавить соответствующее значение в одну ячейку, используйте функцию. Если вы хотите использовать любую другую форму обработки данных, вам нужно использовать подпрограмму. Таким образом, я не уверен, что вы надеетесь, что код будет делать для вас. Если вы можете немного разъяснить, я буду рад помочь. – RGA

+0

Непонятно, что вы пытаетесь сделать. Можете ли вы подробнее рассказать? Пожалуйста, укажите, какие данные следует оценивать, как вы хотите оценить и ожидаемый результат. – Vegard

+0

Привет @RGA благодарю вас за помощь! Как показано на рисунке выше, мне нужна функция, которая принимает диапазон в качестве входа (например, A1: A13). Функция должна выводить массив (A18: A21 выше) с содержимым диапазона, при котором пробелы не следует рассматривать. Поэтому, если функция вызывается в диапазоне на снимке (отображается зеленым цветом), выход должен быть ячейками с правой стороны (на рисунке показано белым). Это было яснее? –

ответ

0

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

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 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 
0

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

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 
0

Основываясь на ваш вопрос и комментарии в этой теме, я понимаю, что вы хотите взять данный диапазон (поставляется в порядке) и печатать все непустые значения в некотором диапазоне, начиная с одной и той же строке в столбце 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 
Смежные вопросы