2016-10-16 14 views
0

次の行は、デバッグできないようなエラーを引き起こしています。エラーは、 "オブジェクトが必要です"と私は、関数とすべてのメソッドを適切なオブジェクトで提供することがわかります。String.Right関数実行時エラー '424':オブジェクトが必要です

変数 "first"は文字列として初期化され、この行はForループ内にあり、したがって "i"変数が使用されます。

first = Right(Sheets("Sheet1").Cells(i, 1).Text, Sheets("Sheet1").Cells(i, 1).Text.LastIndexOf(" ")) 
+0

"i"が0より大きく、アクティブブック(必ずしもマクロが含まれているブックではない)に "Sheet1"という名前のシートがあることを確認してください。 – barrowc

答えて

1

.TextStringStringLastIndexOf性質を持っていませんが返されます。実際には、オブジェクトではないためプロパティがありません。だから、あなたは "必要なオブジェクト"を取得します。 InStrRevはあなたに最後を与えながら、何が欲しいのは

InStrRev(someString, " ") 

InStr機能を使用すると、検索文字列の最初の出現の指標を与えています。これはあなたの当面の問題を解決するだろう:あなたは、おそらく最後のスペース文字の一部の権利をしたいので、あなたは、文字列の右の部分の長さが必要になりますが、InStrRevはあなたの長さを与えるしかし

Dim cellCont As String 
'... 
cellCont = Sheets("Sheet1").Cells(i, 1).Value2 'use value or value2, not text 
first = Right(cellCont, InStrRev(cellCont, " ")) 

左の部分。だから、全長から空間の位置を引く必要があります。あなたが事前に単語の数を知っていたならば、これは

first = Split(cellCont, " ")(2) 

のように非常にきれいに見える

first = Split(cellCont, " ")(UBound(Split(cellCont, " "))) 

first = Right(cellCont, Len(cellCont) - InStrRev(cellCont, " ")) 

別のオプションは、配列を返すSplit機能だろう

編集:W 0 .Textの代わりにValue(またはValue2)を使用する必要があります。.Text実際に表示されるテキストを返します。したがって、列には大きすぎる数値がセルに含まれていると、たとえば####が返されます。

+0

詳細な応答をありがとう。私は使用してきた 'テキスト'公正な量、今なぜ私はこれらのすべての問題を引き起こしている知っている。 –

+0

@slightly_tastedほとんどの場合、問題は発生しません。セル内にテキストがあれば、それは '#### 'に置き換えられず、' .Text'は私が知る限り '.Value'と同じになります。これは、数字の形式とエラーの大部分が異なります。 – arcadeprecinct

関連する問題