- ベストアンサー
空白セルをデータと認識してしまいます
Excel2003を使用しています。 「マクロの記録」を使って、あるリストを自動作成 しようとしているのですが、うまくいきません。 A,B2つの列に分かれたデータを連結させるため、 C列に「CONCATENATE」関数を入れて適当な行まで コピーします。(それ以上はデータが入らないだろうと思われる100行目ぐらいまで) その後C列をコピーし、「値貼付け」をして 関数を値に変えます。 そうすると、たとえば実際には20行目までデータが 入っていたとすると、21行目~100行目までは 空白になりますよね? でも、どうもその空白行もデータとみなされている ようなんです…。 Range("C2").End(xlDown).Row で下端セルを探そうとすると、100行目に なってしまいますし、「ジャンプ」で空白セルを 探しても、同じ結果になります。 空白セルを選んで一度「Delete」を押すと 正しく「空白」と認識するようなのですが…。 「実際にデータの入っているセルとそうでないセル」 を自動で判別させたいので、 簡単に「何も入っていないセルを”空白”と正しく 認識させる方法」はありませんでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1さんの回答の通り、「CONCATENATE」を使用すると、元のセルに何も無くても計算結果に 「文字数0のデータ」が返されます。 空白セルに「=""」を入力して、そのセルでコピー・値貼り付けをしたのと同じです。 >「実際にデータの入っているセルとそうでないセル」 >を自動で判別させたいので、 ならば、「IFステートメント」を使用すれば、質問者さんの要求がかなえられると思います。 Sub test1() Dim intA As Integer For intA = 1 To 100 If Cells(intA, 1) <> "" Or Cells(intA, 2) <> "" Then Cells(intA, 3) = "=CONCATENATE(RC[-2],RC[-1])" Cells(intA, 3).Copy Cells(intA, 3).PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False End If Next intA Application.CutCopyMode = False End Sub #「CONCATENATE」関数を使うのなら上のコードになると思います。 #それにこだわらないなら、下のコードのほうが簡単で処理速度も速いです。 Sub test2() Dim intA As Integer For intA = 1 To 100 If Cells(intA, 1) <> "" Or Cells(intA, 2) <> "" Then Cells(intA, 3) = Cells(intA, 1) & Cells(intA, 2) Next intA End Sub
その他の回答 (1)
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 > ...どうもその空白行もデータとみなされているようなんです…。 みなされているのではなく、長さ0の文字列がセルの値データとして 存在しています。次のことを確かめて下さい。イミディエイトウイン ドウは VBE で [Ctrl]+[G] で表示されます。 ・新規シートの空セルを選択し、VBE のイミディエイトウインドウ で次のコマンドを実行します。 ? Typename(ActiveCell.Value) 結果:Empty ・ご質問の「どうもその空白行もデータとみなされている...」セル を選択し、同様に VBE のイミディエイトウインドウで次のコマン ドを実行します。 ? Typename(ActiveCell.Value) 結果:String CONCATENATE 関数の引数が Empty だった場合でも、戻り値として 「長さ0の文字列」が返されていることが分かります。「&」演算子で 文字列を連結しても結果は同様です。 これが Excel の仕様です。 面倒なのですが、「長さ0の文字列」を最終行取得の前に置換する必要 があります。Replace で簡単にできそうですが、ダイレクトには置換 できませんので、サンプルコードでは 2 回ほど置換を行って います。 Sub Sample() '長さ0の文字列データを置換 Application.ScreenUpdating = False With Range("C2:C100") .Replace What:="", Replacement:="_$temp" .Replace _ What:="_$temp", _ Replacement:=vbNullString, _ LookAt:=xlWhole End With '最終行取得 Application.ScreenUpdating = True MsgBox Range("C2").End(xlDown).Row End Sub ほかにもっと簡単な方法があるのかなぁ...
お礼
半年以上も放置してしまって、本当にスミマセンっ! No.2の方が書いてくださった、CONCATENATE関数を 使わない方法で解決出来ました。 でも、 >長さ0の文字列がセルの値データとして存在しています。 というのは勉強になりました。見た目が同じでも、空白ではないんですね。 有難うございました。
お礼
半年以上も放置してしまって、本当にスミマセンっ! CONCATENATE関数を使わない方法で解決出来ました。 この方がずっと簡単ですね!勉強になりました。 回答、有難うございました。