2012-03-25 15 views
2

Excelでは単語の列があります。私はあなたがプログラミングの世界で言葉 "文字列"を呼ぶと信じています。VBAの簡単なループプロシージャでなければならない

行ごとに、各単語を列に入れ、1つの反転したコンマを入力する必要があります。

たとえば、セル内の単語が犬の場合、その単語を「犬」に変更する必要があります。

これを行うためのマクロを作成しようとしていますが、Excelのスプレッドシートからに単語の列をインポートするだけで、すでにコードの最初の部分で問題が発生しています。

私のコードは以下の通りです。エラーメッセージには "subscript out of range"と表示されますが、わかるように配列が淡色表示されています。私は間違って何をしていますか?ありがとう。私はあなたがこのような何かをしたいと考えてい

Sub putquotes() 
    Dim sym(1 To 162) As String 
    For i = 1 To 162 
     sym(i) = Worksheets("sheet1").Cells(i + 1, 1) 
    Next i 
    End Sub 
+1

ないVBAエキスパート表示されますが、それはあまりにもVBA場合なら、ほとんどのプログラミング言語、配列と文字列は0からカウントを開始するには、あなたがする必要があることを確認する''ダブルdo sym(i-1)=ワークシートを実行する( "sheet1")セル(i + 1,1) – Joris

+0

デバッグモードで調べる(エラー時にコードがブレークする)。 'sym(i)'は下付き文字を範囲外に返しますか、それは 'Worksheets(" sheet1 ")です。セル(i + 1、1)'?それが起こると '私'の価値は何ですか? –

+0

ワークシート( "sheet1")。範囲外の添え字を返すセル(i + 1、1)。それは、最初のループOKを通過するようだ。私はバグが2番目のループで発生すると思います。 – ben

答えて

3

私はあなたの問題は、おそらく私は3枚目のシートがあろうと、最初のワークシート上で実行されます。このような何か(Set ws = Sheets(1)を参照)

注意を使用することになりSheet1

する必要がありますあなたのsheet1名前だと思いますSet ws = Sheets(3)あなたは、このようなシートを持っていなかった場合、またはあなたがSet ws = Sheets("Sheet1")を使用することができ

このコード:

  • が追加

  • は、速度のための範囲ではなく、変異配列を使用する列Aに使用した細胞(よりむしろハードコード162行)の最初から最後まで見え
  • 選択されているシートとは独立に実行されます最初は:)

    Sub PutQuotes() 
    Dim ws As Worksheet 
    Dim varList 
    Dim rng1 As Range 
    Dim lngCnt As Long 
    Set ws = Sheets(1) 
    Set rng1 = ws.Range(ws.[a1], ws.Cells(Rows.Count, "A").End(xlUp)) 
    varList = rng1.Value2 
    
    For lngCnt = 1 To UBound(varList) 
        If Len(varList(lngCnt, 1)) > 0 Then _ 
         varList(lngCnt, 1) = "''" & varList(lngCnt, 1) & "'" 
    Next 
    'dump updated array back over range 
    rng1.Value2 = varList 
    End Sub 
    
+0

これは素晴らしいことです。どうもありがとう。フォローアップの質問:文字ごとに各セルの文字列内を移動し、特定の文字が見つかった場合はその行を削除することは可能ですか?私の場合は、セル内の文字列に次の文字が含まれている行を削除する必要があります。^ – ben

+0

@ben thx :)これは本当に新しい質問として尋ねられます。簡単な方法は、手動またはVBAを使用してオートフィルタを使用することです – brettdj

1

...

しかし
Public Sub DoQuotes() 
    Dim iRow As Integer 
    Dim Result() As String 
    iRow = 1 

    Do While Not IsEmpty(Sheet1.Cells(iRow, 1)) 
     ReDim Preserve Result(iRow - 1) 
     Result(iRow - 1) = "'" & Sheet1.Cells(iRow, 1) & "'" 
    iRow = iRow + 1 
    Loop 

    For Each x In Result 
     MsgBox (x) 
    Next x 

End Sub 

、Excelが配列の値ながら、そのようテキスト区切り記号として最初の引用符を扱います念頭に置いてクマは ' Excelで何か「それは何かのように見えるだろう」。

強く型付けされたSheet1オブジェクトを使用する代わりに、Worksheets()への呼び出しを避けるようにしてください。ワークシートの名前が変更されると、将来のあらゆる種類の苦痛が節約されます。 vbaエディタでシートが実際に何の名前で呼ばれているかを見ることができます。 Sheet1(MyWorksheet)のようになります

2

"Sheet1"という名前のシートがありません。次のいずれかの

  1. このコードは、データをワークブックに標準モジュールに住んでいると、あなたが シートの名前を変更しました、または
  2. コード別のブックに住んでいると、あなたが適切にあなたのワークシートのプロパティを修飾していません

私は後者を想定します。ワークシートやセルなどのコレクションプロパティを使用すると、Excelは親が誰であるかを前提にします。標準モジュールで修飾されていないワークシートの呼び出しは、修飾されていないワークシートには、問題がどこにある

ThisWorkbook.Worksheets() 

を確認するには想定してコードに次の行を追加しますはThisWorkbookモジュールに呼び出す

ActiveWorkbook.Worksheets() 

を仮定します

Debug.Print Worksheets("Sheet1").Parent.Name 

これは、どのExcelブックが使用しているかを示し、必要な場合とは異なる場合があります。

誤った推測を避けるには、参照を完全修飾することをお勧めします。あなたがデータを含むブックを開いている場合たとえば、それはWB参照が参照を修飾する簡単な方法であることを保持

Sub putquotes() 

    Dim wb As Workbook 
    Dim sym(1 To 162) As String 
    Dim i As Long 

    Set wb = Workbooks.Open("Path\Name") 

    For i = 1 To 162 
     sym(i) = wb.Sheets("Sheet1").Cells(i + 1, 1) 
    Next i 

End Sub 

次のようになります。あなたは、コードで別のファイルを開いていない場合は、あなただけの

ThisWorkbook.Worksheets("Sheet1") 
ActiveWorkbook.Worksheets("Sheet1") 
Workbooks("Mybook.xlsx").Worksheets("Sheet1") 

のように明示的に修飾することができます配列にセルの値を読み込むためのより良い方法は、あなたを与えるだろう、この

Sub putquotes() 

    Dim wb As Workbook 
    Dim sym As Variant 
    Dim i As Long 

    Set wb = Workbooks.Open("Path\Name") 
    sym = wb.Sheets("Sheet1").Range("A2").Resize(162, 1).Value 

    For i = LBound(sym, 1) To UBound(sym, 1) 
     Debug.Print "'" & sym(i, 1) & "'" 
    Next i 

End Sub 

のようなものですあなたが好きではないかもしれない2次元ベース1配列ですが、一度に1つずつ読み込むよりも高速です。

関連する問題