• ベストアンサー

空白セルをデータと認識してしまいます

Excel2003を使用しています。 「マクロの記録」を使って、あるリストを自動作成 しようとしているのですが、うまくいきません。 A,B2つの列に分かれたデータを連結させるため、 C列に「CONCATENATE」関数を入れて適当な行まで コピーします。(それ以上はデータが入らないだろうと思われる100行目ぐらいまで) その後C列をコピーし、「値貼付け」をして 関数を値に変えます。 そうすると、たとえば実際には20行目までデータが 入っていたとすると、21行目~100行目までは 空白になりますよね? でも、どうもその空白行もデータとみなされている ようなんです…。 Range("C2").End(xlDown).Row で下端セルを探そうとすると、100行目に なってしまいますし、「ジャンプ」で空白セルを 探しても、同じ結果になります。 空白セルを選んで一度「Delete」を押すと 正しく「空白」と認識するようなのですが…。 「実際にデータの入っているセルとそうでないセル」 を自動で判別させたいので、 簡単に「何も入っていないセルを”空白”と正しく 認識させる方法」はありませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • e10go
  • ベストアンサー率38% (47/122)
回答No.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

mami0810
質問者

お礼

半年以上も放置してしまって、本当にスミマセンっ! CONCATENATE関数を使わない方法で解決出来ました。 この方がずっと簡単ですね!勉強になりました。 回答、有難うございました。

その他の回答 (1)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんにちは。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 ほかにもっと簡単な方法があるのかなぁ...

mami0810
質問者

お礼

半年以上も放置してしまって、本当にスミマセンっ! No.2の方が書いてくださった、CONCATENATE関数を 使わない方法で解決出来ました。 でも、 >長さ0の文字列がセルの値データとして存在しています。 というのは勉強になりました。見た目が同じでも、空白ではないんですね。 有難うございました。

関連するQ&A