[[20180515213840]] 『「ファイル新規作成」[ジャスミン茶] について』(ペンギン男爵) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『「ファイル新規作成」[ジャスミン茶] について』(ペンギン男爵)

投稿
[[20160908164905]] 『ファイル新規作成』(ジャスミン茶) 
について...

上記投稿を参考にcsv新規作成を行いたいです。
シート1のA列にファイル名B列にアドレスを入れてます。
C1にA列のデータを入れるとD1:G10までに関数が入っていて表示されます。
関数表示されたD1:G10のデータをcsvで保存したいのですが
どうすればいいのでしょうか?

csvは

            bk.SaveAs fPath & "\" & c.Value & ".csv"
でいいのかと思いますが、D1:G10迄だけをcsvにする修正方法が分かりません。

どなたかご教授ください。

Sub Sample2()

    Dim bk As Workbook
    Dim c As Range
    Dim bPath As String
    Dim fPath As String
    Dim flag As Boolean

    Application.ScreenUpdating = False

    bPath = ThisWorkbook.Path
    Set bk = Workbooks.Add

    With ThisWorkbook.Sheets("Sheet1")  '★
        For Each c In .Range("A1", .Range("A" & Rows.Count).End(xlUp))  '★
            fPath = bPath & "\" & c.Value
            'フォルダの存在チェックとなかった場合の作成
            flag = False
            If Len(Dir(fPath, vbDirectory)) > 0 Then
                If (GetAttr(fPath) And vbDirectory) = vbDirectory Then flag = True
            End If
            If Not flag Then MkDir fPath
            'ブックの書き込み
            Application.DisplayAlerts = False
            bk.SaveAs fPath & "\" & c.Value & ".xlsx"
            Application.DisplayAlerts = True
            c.Offset(, 1).Value = fPath
        Next
    End With

    bk.Close False

    MsgBox "処理が終了しました"

 End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


>csvは
>bk.SaveAs fPath & "\" & c.Value & ".csv"
>でいいのかと思いますが、

一旦、特定範囲だけってのは忘れて、SaveAsのヘルプを読むか、マクロの記録を使って、CSV形式で保存するには、どんな引数が必要か確認してみては?
(もこな2) 2018/05/16(水) 08:44


追加で。

提示されたコードをどのように理解して、どの部分を流用しようとしているのかわからないですが、
たぶん、
(1)新規ブックを追加する。
(2)D1:G10の値を、(1)の1番目のシートのA1セル以降にコピペする
(3)(2)をCSV形式で名前をつけて保存する
って感じで、処理する必要があるのでは?
(もこな2) 2018/05/16(水) 09:04


もこな2さん、いろいろアドバイスいただきましてありがとうございます。
すいません、提示間違っていました。
一つ目の↓を流用しようと思っています。

 Sub Sample()
    Dim bk As Workbook
    Dim c As Range

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Set bk = Workbooks.Add

    With ThisWorkbook.Sheets("Sheet1")  '★SaveAsSaveAsSaveAs
        For Each c In .Range("A1", .Range("A" & Rows.Count).End(xlUp))  '★
            bk.SaveAs "g:\test\" & c.Value & ".xlsx"
        Next
    End With
   Application.DisplayAlerts = True

    bk.Close False

 End Sub

CSVだといったん開いてしまうとゼロが消えてしまうので、D1:D10にまとめて関数表示にして
テキストファイルに保存しようと考えています。(最初の質問と変わってすいません)

記録したところ、下記コードが表示されました。

Sub Macro1()
'

    Range("D1:D10").Select
    Selection.Copy
    Workbooks.Add
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    ChDir "g:\test"
    ActiveWorkbook.SaveAs Filename:="g:\test\a.txt", FileFormat _
        :=xlText, CreateBackup:=False
    ActiveWorkbook.Save
    ActiveWindow.Close
End Sub

下記コードに書き換えて、テキストファイルは何とか作れるようになりましたが
C1のセルを変更してD1:D10を表示させているのですがこのコードだと
C1のセルが変更できません。コピーする前にA列のデータを入力する方法を
教えていただけないでしょうか?

 Sub Sample3()
    Dim bk As Workbook
    Dim c As Range

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Range("D1:D10").Select '追記
    Selection.Copy '追記

    Set bk = Workbooks.Add

    With ThisWorkbook.Sheets("Sheet1")  '★SaveAsSaveAsSaveAs

    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False  '追記
    Application.CutCopyMode = False '追記

        For Each c In .Range("A1", .Range("A" & Rows.Count).End(xlUp))  '★
            bk.SaveAs "g:\test\" & c.Value & ".txt", FileFormat:=xlText, CreateBackup:=False '追記
        Next
    End With
   Application.DisplayAlerts = True

    bk.Close False

 End Sub

宜しくお願いします。
(ペンギン男爵) 2018/05/16(水) 12:07


よろしくと言われても、ちょっと困ってしまいますが「Sample3」についてツッコミを入れるとしたら。

(1)

    Range("D1:D10").Select '追記
    Selection.Copy '追記

ここは、Range("D1:D10").Copy とした方がスマートだとおもいます。

(2)

    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False  '追記

同じことが↑でも言え「bk.Worksheets(1).Range("A1") Paste:=xlPasteValues」なんてほうがスマートに思えます。

(3)
せっかく「With ThisWorkbook.Sheets("Sheet1")」としているのですから、
「Range("D1:D10").Copy」も、この内側に入れて「.Range("D1:D10").Copy」とちゃんとシートを修飾するように直した方がいいんじゃないでしょうか。

(4)
「Application.ScreenUpdating = False」について意味がわかって入れているなら別にいいんですけど、私ならテスト動作したときに想定外の動きをしてても見落としてしまう原因になるので、私なら完成(安定動作が確認されるまで)入れないです。

(5)
SaveAsの引数「FileFormat:=xlText」は、それでいいんでしょうか?
(望む形になったならいいですけど、CSV形式にしたかったんじゃないんでしょうか・・・)
【参考】https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/xlfileformat-enumeration-excel

コードについては上記のようなところがちょっと気になりました。

次に、追加質問がよくわからないですが、
>C1のセルを変更してD1:D10を表示させているのですがこのコードだと
>C1のセルが変更できません。コピーする前にA列のデータを入力する方法を
>教えていただけないでしょうか?

であれば、
(1)マクロを動かす前に、手動で変更(入力)する。
(2)マクロの中で、コピペする前に自動で変更(値の設定)を行う。
この、どちらでも処理できると思うんですがどうでしょうか?

(もこな2) 2018/05/16(水) 13:38


もこな2さん
コードに関してアドバイス下さりありがとうございます!
今出先なのでコードの確認と(2)マクロの中で自動で変更の方法を帰宅後調べてみようと思います。
(4)のコード意味を理解していないのですが(ないほうがいいのでしょうか?
(すいません、コピーや記録からつぎはぎしているだけでVB自体よくわかっていません)。

この質問はアルバイトの方に勤務時間やお給料の情報が入ったエクセルファイルを作って送っていたんですが
エクセルを持っていない方が多くcsvで送ろうと思い折角だから自動化できないかなと
質問させていただいたのですがテストで作ったものをアルバイトの方へ送ったところ
ゼロが無くなってズレてよく分からないのでやめて欲しいと連絡がありました。

なのでテキストファイルを送ることにしました。
(通りすがりのビギナー) 2018/05/16(水) 16:00


よろしくと言われても、ちょっと困ってしまいますが「Sample3」についてツッコミを入れるとしたら。

⬆困らせるような質問すいません。
上手く質問できていないようで、申し訳ないです。

C1にA列のデータを入れると、D1:D10までにvlookup関数を使って
勤務時間やお給料の情報が表示されるようにしています。

C1にA列のデータを入れた状態でA列のファイル名をつけたファイルを自動で作ろうとしています。

このコメント、上のコメントの前に入れようとして切れていました。
前後おかしくなってすいいません。

後、ニックネームがなぜか違う名前で入っていますがペンギン男爵です。
(ペンギン男爵) 2018/05/16(水) 16:13


もこな2さん

2)

    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False  '追記

同じことが↑でも言え「bk.Worksheets(1).Range("A1") Paste:=xlPasteValues」なんてほうがスマートに思えます。

すいません、コンパイルエラーとなるものが表示されました。

(3)
せっかく「With ThisWorkbook.Sheets("Sheet1")」としているのですから、

 「Range("D1:D10").Copy」も、この内側に入れて「.Range("D1:D10").Copy」とちゃんとシートを修飾するように直した方がいいんじゃないでしょうか。 

内側に入れるとはどうゆう意味でしょうか?

初歩的な質問で申し訳ありません。

ご教授いただけないでしょうか?

(ペンギン男爵) 2018/05/16(水) 19:24


一応、見よう見まねで作成してみましたが ENDwithに対するWithがありませんと言われます。
どこを直せばいいのか教えてもらえますか?
宜しくお願いします。

Sub text2()

    Dim bk As Workbook
    Dim c As Range
    Dim r As Range

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Set bk = Workbooks.Add

          With ThisWorkbook.Sheets("Sheet1")  '★SaveAsSaveAsSaveAs

              For Each r In Sheet1.Range("A:A") '追記データ用シートのA列にデータがある分だけループ

              If r.Value = "" Then '追記A列が空ならループ終了
              Exit For
               End If

                 Range("c1").Value = r.Offset(, 0).Value  'データを転記
                 Range("D1:D10").Copy '追記

                Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False  '追記

                'bk.Worksheets(1).Range("A1") Paste:=xlPasteValues  '→コンパイルエラーになります

                Application.CutCopyMode = False '追記

                For Each c In .Range("A1", .Range("A" & Rows.Count).End(xlUp))  '★
                bk.SaveAs "g:\test\" & c.Value & ".txt", FileFormat:=xlText, CreateBackup:=False '追記

              Next
          End With
   Application.DisplayAlerts = True

    bk.Close False

 End Sub
(ペンギン男爵) 2018/05/16(水) 20:00

>すいません、コンパイルエラーとなるものが表示されました。

おっと失礼。肝心要のメソッドを書き忘れてました。
 誤 bk.Worksheets(1).Range("A1") Paste:=xlPasteValues
 正 bk.Worksheets(1).Range("A1").PasteSpecial Paste:=xlPasteValues

>内側に入れるとはどうゆう意味でしょうか?
そういう質問がくるってことは、「With」ってどういう意味で書いてあるかよく解らなかったりしませんか?
もし解らなければ「Withステートメント」という単語をネット検索などで調べてみてください。
一応、参考リンクも紹介
http://officetanaka.net/excel/vba/beginner/16.htm

また、text2について気になる箇所があったのでツッコミ
(1)
 If r.Value = "" Then '追記A列が空ならループ終了
  Exit For
 End If

↑だめじゃないですけど、なんで
 For Each c In .Range("A1", .Range("A" & Rows.Count).End(xlUp))
から変えたんですか?

(2)

    With ThisWorkbook.Sheets("Sheet1")  '★SaveAsSaveAsSaveAs
        For Each r In Sheet1.Range("A:A") '追記データ用シートのA列にデータがある分だけループ
            For Each c In .Range("A1", .Range("A" & Rows.Count).End(xlUp))  '

            Next c
        Next r
    End With

なんで二重ループにしたんですか?
さらに、二重ループにしたことにより内側の部分で同じこと(同じ名前で同じブックを保存)を何度もやることになるとおもうんですが、思った通りの動作なんでしょうか?

(3)
 Application.CutCopyMode = False '追記

前回のツッコミわすれ。
コピーモードを解除したところで次の周回?ですぐにまたコピペするので、ループの外で最後に1回だけやればいいと思います。

(4)
  r.Offset(, 0)
これは何をやりたいのかよくわかりません。

ということを踏まえて、たたき台。
(動作テストはしてないのでミスっていたらごめんなさい)
Sub Sample3()

    Dim MyRNG As Range    

    With ThisWorkbook.Worksheets("Sheet1")
        For Each MyRNG In .Range(.Range("A1"), .Range("A1").End(xlDown))
             .Range("C1").Value = MyRNG.Value

             .Range("D1:D10").Copy

             With Workbooks.Add
                .Worksheets(1).Range("A1").PasteSpecial Paste:=xlPasteValues

                Application.DisplayAlerts = False

                .SaveAs _
                    Filename:="g:\test\" & MyRNG.Value & ".txt", _
                    FileFormat:=xlText

                .Close

                Application.DisplayAlerts = True
            End With
        Next MyRNG

        Application.CutCopyMode = False

    End With

 End Sub

上を「ステップ実行」してみて望みの動作をするか確認して、上手くいくようであれば、どの命令がどのようなことをやっているのか研究してみてください。

(もこな2) 2018/05/17(木) 00:28


もこな2さん!
アドバイス&コードありがとうございます!
返事遅くなってすいません。(携帯忘れて出勤してしまい今見ました;;)
今から、作っていただいたコード試してみます。
美しいコードにうっとりです!

私が作成したコードは、こちらにサイトに掲載されているコードを見よう見まねで切りはりしたものでコードの理解はほとんど出来ていません。

どの命令がどのようなことをやっているのか、をどうやって確認するか調べながら(まずそこからなんです)勉強していきますね。

ありがとうございました。
(ペンギン男爵) 2018/05/18(金) 09:16


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.