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

このQ&Aのポイント
  • Sheetをcsv出力する際、空白のセルを区切る「,」が入ってしまう。A~C列の「文字数が0の文字列」ではないセルを選択し、その範囲をSheet2にペースト、csvで保存する方法が知りたい。
  • Excel2007での作業方法を教えてください。
回答を見る
  • ベストアンサー

【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です。 宜しくお願いいたします。

  • hee1
  • お礼率32% (137/422)

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

  • ベストアンサー
  • emaxemax
  • ベストアンサー率35% (43/121)
回答No.4

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

hee1
質問者

補足

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

その他の回答 (6)

  • kkkkkm
  • ベストアンサー率65% (1623/2463)
回答No.7

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

  • kkkkkm
  • ベストアンサー率65% (1623/2463)
回答No.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行目は空白という条件付きですが。

hee1
質問者

補足

ご回答ありがとうございます。 実際に設置してみたのですが、 貼り付け先が真っ白になりました。 設置場所が違ったのかも知れません。 申し訳ございません。 ありがとうございました。

  • kkkkkm
  • ベストアンサー率65% (1623/2463)
回答No.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

  • weboner
  • ベストアンサー率45% (111/244)
回答No.3

そんなややこしいことしなくても データ全体をsheet2に張り付けて sub sample() Sheets(2).Select Range("A1").Select Selection.SpecialCells(xlCellTypeBlanks).EntireRow.Delete Shift:=xlUp end sub であとは保存したらいいのでは?

hee1
質問者

補足

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

  • emaxemax
  • ベストアンサー率35% (43/121)
回答No.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

  • RandenSai
  • ベストアンサー率54% (305/561)
回答No.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データのカンマを削除するのは、普通はしない(やっちゃいけない)ことです。カンマしかない行は必要ないという話なら、メモ帳で開いて置換しちゃえば済むと思いますが。

hee1
質問者

補足

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

関連するQ&A

  • マクロについて教えてください

    マクロの超初心者です。 数式を入力しているのではなく、配付物をエクセルで作成しているのですが、同じもの(氏名や項目は違いますが)を100枚ほど作成しているのでマクロを・・・と思ったのですがやり方が全く分かりません。 sheet1からsheet2に下記のようにデータを写したいのですが、やり方を教えてください。 ●氏名が入力されています sheet1(A9) → sheet2(C2) sheet1(E9) → sheet2(C5) sheet1(I9) → sheet2(C8) ●項目1 sheet1(A8) → sheet2(E3) sheet1(E8) → sheet2(E6) sheet1(I8) → sheet2(E9) ●項目2 sheet1(A18~D18の結合セル) → sheet2(E2) sheet1(E18~H18の結合セル) → sheet2(E5) sheet1(I18~L18の結合セル) → sheet2(E8) と反映させたいのですが、250行あるのですが、 簡単にマクロで出来ないでしょうか?? ちなみに↓コレが上記の内容で作ってみたものです。 わかりずらい質問でスイマセン。 Range("A9").Select Selection.Copy Sheets("sheet2").Select Range("C2").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("E9").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("C5").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("I9").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("C8").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("A8").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E3").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("E8").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E6").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("I8").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E9").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("A18:D18").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E2").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("E18:H18").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E5").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("sheet1").Select Range("I18:L18").Select Application.CutCopyMode = False Selection.Copy Sheets("sheet2").Select Range("E8").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False End Sub

  • EXCELのVBAについて

    マクロのボタンで内容を削除する様に設定した所、 Dim re As Integer Sheets("投入シート").Select re = MsgBox("入力データをクリアします。" & vbCrLf & vbCrLf & "よろしいですか?", vbOKCancel, "クリア確認") If re <> vbCancel Then Sheets("投入シート").Select ActiveSheet.Unprotect Range("a1:c30").Select Selection.Copy Application.CutCopyMode = False Selection.Copy Sheets("work").Select Range("A1").Select ActiveSheet.Paste Sheets("投入シート").Select ActiveSheet.Unprotect Range("c4:c30").Select Selection.ClearContents Range("f31").Select Selection.Copy Range("c9").Select ActiveSheet.Paste Range("f33").Select Selection.Copy Range("c11").Select ActiveSheet.Paste Range("f32").Select Application.CutCopyMode = False Selection.Copy Range("c14").Select ActiveSheet.Paste Range("c4").Select Application.CutCopyMode = False 'ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End If Sheets("投入シート").Select Range("c4").Select End Sub この様に入力したのですがセルのC11の計算式だけセル番号が消えてしまいます。 どうしてでしょうか?ご指導をお願いします。

  • エクセル VBA 繰り返し コピー貼り付け

    以下を繰り返し作業をOffsetを使用して行いたいのですがどうすればいいでしょうか? Sheets("Sheet1").Select Range("A1:C1").Select のA1:C1以下へA1000:C1000ぐらいあります。 Sheets("Sheet2").Select Range("G1").Select は貼り付けたセル3つの数字の組み合わせで公式に使う計算期間がまちまちですので公式を張り付けたり出来ません。 D1の解を heets("Sheet1").Select Range("D1").Select に貼り付けてA1:C1以下1000までの結果を評価出来るようにしたいのですが! ' Macro1 Macro Sheets("Sheet1").Select Range("A1:C1").Select Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D1").Select ActiveSheet.Paste Range("A2:C2").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D2").Select ActiveSheet.Paste Range("A3:C3").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("D1").Select ActiveSheet.Paste Range("G1").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("D3").Select ActiveSheet.Paste End Sub よろしくおねがいします。

  • セル変更2回目以降マクロが走らない

    office2010 セル値変更でマクロ実行の件で質問です。 macroというシートのA11セルがプルダウンリストになっていて、その値を変更したらマクロ実行という構成を作成しました。 下記はmacroというシートに記載したマクロ Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$11" Then Exit Sub Calculate Macro4 End Sub 下記は標準モジュールに記載したマクロ Sub Macro4() ' 'macroシートB11に表示されるNo.で抽出 Application.EnableEvents = False Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Sheets("Sheet1").Visible = True Sheets("Sheet2").Visible = True Sheets("Sheet3").Visible = True Sheets("Sheet4").Visible = True Sheets("work").Visible = True Sheets("Sheet3").Select Cells.Select Selection.ClearContents Selection.ClearContents Sheets("Sheet2").Select Cells.Select Selection.ClearContents Selection.ClearContents Sheets("Sheet1").Select Cells.Select Selection.AutoFilter Selection.AutoFilter ActiveSheet.Range("$A:$BA").AutoFilter Field:=3, Criteria1:=Sheets("macro").Range("B11") Sheets("kisyu_work").Select Cells.Select Selection.ClearContents Sheets("Sheet1").Select Columns("F:F").Select Selection.SpecialCells(xlCellTypeVisible).Select Application.CutCopyMode = False Selection.Copy ActiveWindow.ScrollWorkbookTabs Position:=xlLast Sheets("kisyu_work").Select Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False Sheets.Add ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ "kisyu_work!R1C1:R1048576C1", Version:=xlPivotTableVersion14). _ CreatePivotTable TableDestination:="", TableName:= _ "ActiveSheet.Name", DefaultVersion:=xlPivotTableVersion14 Cells(1, 1).Select With ActiveSheet.PivotTables("ActiveSheet.Name").PivotFields("V_KISYU_CD") .Orientation = xlRowField .Position = 1 End With Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row - 2).Select ' Selection.Copy ActiveWindow.ScrollWorkbookTabs Position:=xlLast Sheets("kisyu_work").Select Range("B1").Select ActiveSheet.Paste ' Range("C1:C" & Range("B" & Rows.Count).End(xlUp).Row).Value = "=INDEX(M_KISYU!C[5],MATCH(RC[-1],M_KISYU!C,0))" Sheets("macro").Select End Sub A11セルの値を変更するとMacro4は実行されます。 しかしながら、2回以上続けてA11の値を変更するとMacro4が動作しません。 なぜなのでしょうか? なお、プルダウンリストの構成をやめると、連続してA11セル値変更しても動作します。

  • エクセルマクロ 繰り返して、別のシートへコピーしたい

    エクセルマクロ 繰り返して、別のシートへコピーしたい マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、 どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 1行目から10行目まで繰り返したくて、 1行目から2行目のセルの移動の差は10行目までかわりません。 '1行目 Sheets("Sheet1").Select Range("B14:C14").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B15:C17").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False '2行目 Sheets("Sheet1").Select Range("B18:C18").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B19:C21").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B2").Select Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False

  • マクロの記録を書きかえる

    下記の構文を可能な限り短くして書きたいのですが、 どのように省略出来るのかがわかりません。 <シート1のB列のデータの入力されているセルまでコピーし、シート2のA2から値で貼付ける> Range(\"B2\").Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets(\"Sheet1\").Select Range(\"A2\").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ご指導宜しくお願い致します。

  • シート1のC列の最終行をコピーして同じ行に値貼り付けしたい

    シート1のC列の最終行を取得して その行を丸々値貼り付けするマクロを作りたいと思います。 シート3のB18の値をシート1のC列の最終行の1つ下のセルに値貼り付け すると、その行のA、B列に日付が入力される関数が入っています。(下まで) 関数が入ったままだと、うまくいかない時があるので最終行をコピーして値貼り付けしたいのですが、マクロの作り方を教えてください。 シート1の最終行に貼り付け Sheets("Sheet3").Select Range("B18").Select Selection.Copy Sheets("Sheet1").Select Range("C65536").End(xlUp).Offset(1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub 最終行をコピーして値貼り付け Dim 最終行 As Integer 最終行 = Range("C65536").End(xlUp).Row Range("A6:C" & 最終行).Select Selection.Copy Sheets("Sheet1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub このマクロだと、A6からC列の最終行まで全てコピーされてしまうので、C列の最終行のAからC列まで1行だけコピーできないでしょうか?

  • アクティブセルとそのセルに隣接する右隣の2つのセルをコピーしてシート2に貼り付ける

    「アクティブセルとそのセルに隣接する右隣の2つのセルをコピーしてシート2に貼り付ける」というVBAコードが知りたいです。 「アクティブセルをシート2に貼り付ける」だけなら Selection.Copy Sheets("Sheet2").Select ActiveSheet.Paste はわかるのですが、 「アクティブセルとそのセルに隣接する右隣の2つのセルをコピー」がわかりません。 例えて言うなら A1がアクティブならA1からC1までコピーして シート2の(C3がアクティブなら)C3からE3に貼り付けたいです。 よろしくお願いします。

  • VBA セルの空白から、行挿入するしないを変更する

    とある表作成に下記のようなコマンドボタンを作成しましたが、 1回目は良いのですが、修正が発生し、2回目以降で再計算をする場合、 更にC列が挿入されてしまい、表が崩れてしまいます。 (Sheet1に計算表、Sheet2にデータベースという形にしています。) その為、2回目以降はSheet2のC列を挿入しないようにしたいのです。 1つの案として列挿入後、C1セルは絶えず空白のままとなり、 (行挿入前は文字が入っています)挿入後はC1セルに文字を 入力することはない為、そこから判断して、CommandButton1を押した後、 C列を挿入するしないの作業を変えることは可能でしょうか? もし出来なければ、C1セルが空白の場合、 ”Sheet2のC行を削除後、再度実施して下さい”みたいな メッセージボックスを出す形でもOKです。 よろしくお願いいたします。 ※因みに下記は、分からないながらもマクロの記録を使って試行錯誤しながら 自己作成したものですので、不要な文が入っているかも知れません。 すみませんがよろしくお願いいたします。 ーーーーーーーーーーーーーーーーーーーーーーーーーーー Private Sub CommandButton1_Click() Application.ScreenUpdating = False Sheet2.Select Sheet2.Columns("C:C").Select Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove Sheet2.Range("C2").Select ActiveCell.FormulaR1C1 = "=RC[-1]-RC[2]" Application.CutCopyMode = False Sheet2.Range("C2").Copy Sheet2.Range("C2:C20000").PasteSpecial Sheet2.Range("C2").Select Sheet1.Select Range("E4").Select Application.ScreenUpdating = True End Sub ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

  • マクロ編集プリントアウト

    Sheets("Sheet1").Select Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet4").Select Application.CutCopyMode = False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Sheets("Sheet1").Select Range("A9").Select Sheets("Sheet1").Select Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet4").Select Application.CutCopyMode = False ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Sheets("Sheet1").Select Range("A15").Select これで2回プリントアウトされていることになります。 6行ずつ下方にデータが続いています。 データ行数は常に変化します。 dim i as long  for i = 3 to 99 step 6   if worksheets("Sheet1").cells(i, "A") = "" then    worksheets("Sheet2").range("A3:H8").value = worksheets("Sheet1").cells(i - 6, "A").resize(6, 8).value       end if  next i を使用してうまくまとめることはできるでしょうか?

専門家に質問してみよう