2014-01-06 67 views
1

我是新變種函數。我創建了一個假設的練習,然後爲它創建一個代碼。練習是要求在每個工作表中搜索單詞「Price」,然後使用調整大小來存儲單詞「Price」和「Price」單詞的值,這意味着將2個單元格的文本存儲在同一排。最後,返回單元格C1中Sheet1中的整個存儲文本。我被困在如何存儲變體中的文本,下面的代碼返回值TRUE,有關如何做到這一點的任何想法?請嚴格批評下面代碼的任何錯誤。使用.resize()後存儲文本變量()

還有一個問題,是我在使用變體而不是字符串在這種情況下數組錯?非常感謝。

Sub macro1() 

Dim data1 As Integer 
Dim counter1 As Integer 
Dim rng As Range 
Dim variant1() As Variant 
Dim strData As String 

data1 = Worksheets.Count 


ReDim variant1(data1) As Variant 

counter1 = 1 

For counter1 = 1 To data1 

Sheets(counter1).Select 
Cells.Find(What:="Price", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
    False, SearchFormat:=False).Activate 



    variant1(counter1 - 1) = Selection.Resize(1, 2).Select 
    'variant1(counter1 - 1) = Selection.Resize(1, 2).Text 

Next 



strData = Join(variant1, vbNewLine) 

strData = Left(strData, Len(strData) - 1) 

Sheets(1).Select 
Range("C1") = strData 


MsgBox strData 


End Sub 

回答

3

請什麼毛病下面代碼嚴厲批評。

好吧,你問它:P

我是新來的變體功能。

Variant不是功能。它是一個數據類型。你可能想讀THIS

使用.Find

你的代碼假定它會發現在每片Price。如果特定工作表中沒有Price,該怎麼辦?你的代碼將失敗。您需要捕獲.Find。例如

Dim aCell As Range 

With Sheets(counter1) 
    Set aCell = .Cells.Find(What:="Price", LookIn:=xlFormulas, LookAt _ 
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
    False, SearchFormat:=False) 
End With 

If Not aCell Is Nothing Then 
    ' 
    '~~> Rest of the code 
    ' 
Else 
    Debug.Print "`Price` not found in sheet " & Sheets(counter1).Name 
End If 

你可以閱讀更多的.FindHERE

存儲陣列

這是一個非常簡單的例子,以幫助在從多張兩個單元格的值您瞭解如何將這些值存儲在陣列中

Dim MyArray() 
Dim n As Long 

n = 1 

ReDim MyArray(n) 

MyArray(n) = Sheets("Sheet1").Range("A1").Value & _ 
      "-" & _ 
      Sheets("Sheet1").Range("B1").Value 

n = n + 1 

'<~~ We need to use Preserve else the previous data will be lost 
ReDim Preserve MyArray(n) 

MyArray(n) = Sheets("Sheet2").Range("A1").Value & _ 
      "-" & _ 
      Sheets("Sheet2").Range("B1").Value 

n = n + 1 

ReDim Preserve MyArray(n) 

MyArray(n) = Sheets("Sheet3").Range("A1").Value & _ 
      "-" & _ 
      Sheets("Sheet3").Range("B1").Value 

所以,當你使用.Find那麼下面

MyArray(n) = Sheets("Sheet3").Range("A1").Value & _ 
      "-" & _ 
      Sheets("Sheet3").Range("B1").Value 

成爲

MyArray(n) = aCell.Value & _ 
      "-" & _ 
      aCell.Offset(,1).Value 

如果你願意,你也可以省略存儲陣列中的第一個單元格的值,因爲它會一直是Price。在這種情況下,上面的代碼簡單地變爲

MyArray(n) = aCell.Offset(,1).Value 

從上述陣列

考慮到上述示例寫入的細胞,我們將結果寫入陣列說C1Sheet3

Dim MyArray() 
Dim n As Long 

ReDim MyArray(n) 

MyArray(n) = Sheets("Sheet1").Range("A1").Value & _ 
      "-" & _ 
      Sheets("Sheet1").Range("B1").Value 

n = n + 1 

ReDim Preserve MyArray(n) 

MyArray(n) = Sheets("Sheet2").Range("A1").Value & _ 
      "-" & _ 
      Sheets("Sheet2").Range("B1").Value 

ThisWorkbook.Sheets("Sheet3").Range("C1").Resize(UBound(MyArray) + 1, 1).Value = _ 
Application.Transpose(MyArray) 

還有1個問題,是我在使用變體而不是字符串在這種情況下數組錯?

不,沒有什麼不對。但是,我會使用一個字符串數組,而不是將不同工作表中的字符串存儲到數組中。這裏是一個使用Variant數組的例子。

Dim MyArray As Variant 

MyArray = Sheets("Sheet1").Range("A1:B1").Value 

Debug.Print MyArray(1, 1) 
Debug.Print MyArray(1, 2) 

進一步閱讀(強烈推薦)

VBA Arrays And Worksheet Ranges

+1

+1,雖然不是那麼苛刻如我所料。 :D – Manhattan

+1

@ BK201:我幾乎不知道因爲'苛刻':p –

+1

加一,很多有用的提示和信息。看起來像一個新的節日後發現的熱情:) – L42