2016-06-13 127 views
2

我正在努力解決VBA中的一個基本問題,並希望得到一些幫助。我想定義一個函數返回從一系列數組沒有空格,如下圖所示:VBA數組函數 - 無空白範圍返回數組

enter image description here

所以,當我打電話的歐式期權細胞的功能,函數應該返回數組沒有任何空白,就像在右邊一樣。

這是我到目前爲止的代碼:我是一個新手,以VBA

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 

,所以這可能是完全錯誤的。謝謝!

+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循環第一

For i = 1 to N 

next i 

接下來是如果塊

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:A13A18: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