みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【ExcelVBA】空白ではないセルを選択する

こちらで、Sheetをcsv出力する際、
空白のセルを区切る「,」が入ってしまう件を質問いたしました。

http://okwave.jp/qa/q8886514.html

計算結果が空白でも、そのセルは「文字数が0の文字列としてデータ」がある状態
という事は理解ができました。

そこで、A~C列の「文字数が0の文字列」ではないセルを選択して、
その範囲をSheet2にペースト、そのSheet2をcsvで保存すればよいと思いました。

この部分をマクロに組み込みたいのですが、
A~B列で「文字数が0の文字列」ではないセルを選択という指示をする部分がわかりません。

以下は、マクロの記録を使って作成しました。

Sub csv送信用()
'
' csv送信用 Macro
'

'
Sheets("Sheet2").Select
Selection.QueryTable.Delete
Selection.ClearContents
With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\Documents and Settings\***\My Documents\***.csv" _
, Destination:=Range("$A$1"))
.Name = "***_2"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 932
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(2, 2, 2, 2, 2, 2, 2, 2, 2)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
Sheets("Sheet1").Select
Columns("A:C").Select
Selection.Copy
Sheets("csv_copy").Select
ActiveSheet.Paste
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:="C:\Documents and Settings\***\My Documents\csv_copy.csv", FileFormat:= _
xlCSV, CreateBackup:=False
Application.DisplayAlerts = True
Sheets("Sheet1").Select
End Sub


この

Columns("A:C").Select
Selection.Copy

の、部分を「A~B列で「文字数が0の文字列」ではないセルを選択」してコピーにするとよいのだと思うのですが、
どのように書いたらよいでしょうか。

Excel2007です。
宜しくお願いいたします。

投稿日時 - 2015-01-12 12:47:40

QNo.8888775

困ってます

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

回答No2のemaxemaxです。
先程のは該当セルがないとエラーになってしまいます。
また、非効率なことをやってますので修正しました。

Sub test02()
  Dim myC As Range, myRng As Range
  Sheets("Sheet1").Columns("A:C").Copy Sheets("csv_copy").Columns("A:C")
  With Sheets("csv_copy")
    On Error Resume Next
    Set myRng = .Columns("A:C").SpecialCells(xlCellTypeFormulas, xlTextValues) '数式かつ文字列表示の各セル
    On Error GoTo 0
    If Not myRng Is Nothing Then '該当があれば
      For Each myC In myRng
        If myC.Value = "" Then '空白表示なら
          myC.ClearContents 'クリア
        End If
      Next
    End If
    .Activate
  End With
End Sub

投稿日時 - 2015-01-12 15:05:44

補足

ご回答ありがとうございます。

丁寧に訂正を頂きましたおかげで、
こちらの内容を使わせて頂きましたところ、
思い通りのcsvを保存できました。

ありがとうございました。

投稿日時 - 2015-01-13 10:37:40

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

No5です たびたびすみません。

書き忘れてましたが、Sub Example()とEnd Subの中のコードが画面上2行に見えるかもしれませんが、1行ですので2行に分けないででください。2行にするとエラーになります。

投稿日時 - 2015-01-12 20:17:40

ANo.6

No5です

もし、コピーしたいA列のデータが10行目までで、10行目以降に別のコピーしたくないデータあり、かつ11行目が空白でしたら

Cells(Rows.Count, "A").End(xlUp).Row

Cells(11, "A").End(xlUp).Row

という方法で対応してください。

また、途中で空白の行がないということですから

Cells(1, "A").End(xlDown).Row

という方法もあります。どちらにしても11行目は空白という条件付きですが。

投稿日時 - 2015-01-12 20:00:09

補足

ご回答ありがとうございます。

実際に設置してみたのですが、
貼り付け先が真っ白になりました。
設置場所が違ったのかも知れません。

申し訳ございません。

ありがとうございました。

投稿日時 - 2015-01-13 10:52:10

ANo.5

「文字数が0の文字列」であるかないかを考えなくても、A列のA1から最終「可視データ」行までのABC列をSheet2にコピーしたらいいわけですよね。

Sub Example()

Range(Cells(1, 1), Cells(Cells(Rows.Count, "A").End(xlUp).Row, "C")).Copy Sheets("Sheet2").Cells(1, 1)

End Sub

投稿日時 - 2015-01-12 15:10:02

ANo.3

そんなややこしいことしなくても

データ全体をsheet2に張り付けて
sub sample()
Sheets(2).Select
Range("A1").Select
Selection.SpecialCells(xlCellTypeBlanks).EntireRow.Delete Shift:=xlUp
end sub

であとは保存したらいいのでは?

投稿日時 - 2015-01-12 15:05:06

補足

ご回答ありがとうございます。
実際設置してみましたが、上手く行きませんでした。
申し訳ございません。

投稿日時 - 2015-01-13 10:35:07

ANo.2

数式で空白表示になっているセルをクリアすればいいのですね?
こんなのはいかがでしょう?

Sub test01()
Dim myC As Range
Sheets("Sheet1").Select
Columns("A:C").Select
Selection.SpecialCells(xlCellTypeFormulas, 23).Select '数式が入っているセルだけ選択
For Each myC In Selection
If myC.Value = "" Then '空白なら
myC.ClearContents 'クリア
End If
Next
Columns("A:C").Select
Selection.Copy
Sheets("csv_copy").Select
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub

投稿日時 - 2015-01-12 14:28:15

ANo.1

それも無駄な抵抗では?というのも、セルが全くの空っぽであっても、周辺のセルに値が入っていればカンマが補われてしまうからです。なのでセルA1,B1,C1にそれぞれ1,2,3が、セルA2,B2,C2は空っぽ、セルA3,B3,C3にそれぞれ4,5,6が入ったシートをCSV保存すると・・・

1,2,3
,,
4,5,6

となってしまいます。つまり、セルの境界部分に当たるカンマはどうやっても入ってしまうわけです。それにカンマがないと、まずいことも起こりますよ。例えば以下の様なCSVですが、

2,3
4,5

頭のカンマが存在しない、しかしカンマが削除されている可能性がある場合、2と4はどこの列にあったのか判断できなくなるじゃないですか。,,2,3だったらカンマが2つあるから、2はC列のデータだと判りますが、カンマが消えているのか最初からないのか判らないと区別できません。これは先頭ですが、途中のカンマがない場合も同じような問題が生じます。

なのでCSVデータのカンマを削除するのは、普通はしない(やっちゃいけない)ことです。カンマしかない行は必要ないという話なら、メモ帳で開いて置換しちゃえば済むと思いますが。

投稿日時 - 2015-01-12 14:24:09

補足

お返事ありがとうございます。

今回作成している表に関しては、
途中で空白の行が入ることはありません。
従いまして、A:C列のA1から文字の入っている行までを選択、
別のシートにペーストしてそれをcsvで保存すれば可能でしたので、
それをVBAに組み込みたいと思いました。

投稿日時 - 2015-01-12 14:38:43

あなたにオススメの質問