アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

http://oshiete.goo.ne.jp/qa/8886514.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です。
宜しくお願いいたします。

A 回答 (7件)

回答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

この回答への補足

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

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

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

補足日時:2015/01/13 10:37
    • good
    • 0

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



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

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/13 10:52
    • good
    • 0

「文字数が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
    • good
    • 0

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



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

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

この回答への補足

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

補足日時:2015/01/13 10:35
    • good
    • 0

数式で空白表示になっているセルをクリアすればいいのですね?


こんなのはいかがでしょう?

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
    • good
    • 0

それも無駄な抵抗では?というのも、セルが全くの空っぽであっても、周辺のセルに値が入っていればカンマが補われてしまうからです。

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

この回答への補足

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

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

補足日時:2015/01/12 14:38
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!