よねさんのWordとExcelの小部屋 なんでも掲示板

HOME HELP 新規作成 新着記事 ツリー表示 トピック表示 検索 過去ログ

ツリー一括表示

Nomal CSVデータ→エクセル(ソート) /佐藤 (16/04/13(Wed) 16:53) #12984
Nomal Re[1]: CSVデータ→エクセル(ソート) /よねさん (16/04/14(Thu) 09:07) #12985
  └Nomal Re[2]: CSVデータ→エクセル(ソート) /佐藤 (16/04/14(Thu) 11:44) #12988
    └Nomal Re[3]: CSVデータ→エクセル(ソート) /よねさん (16/04/14(Thu) 17:48) #12991
      └Nomal Re[4]: CSVデータ→エクセル(ソート) /佐藤 (16/04/18(Mon) 15:47) #12994
        └Nomal Re[5]: CSVデータ→エクセル(ソート) /よねさん (16/04/19(Tue) 08:17) #12996
          └Nomal Re[6]: CSVデータ→エクセル(ソート) /佐藤 (16/10/18(Tue) 15:18) #13089
            └Nomal Re[7]: CSVデータ→エクセル(ソート) /よねさん (16/10/18(Tue) 16:53) #13090
              └Nomal Re[8]: CSVデータ→エクセル(ソート) /佐藤 (16/10/19(Wed) 13:40) #13091
                └Nomal Re[9]: CSVデータ→エクセル(ソート) /よねさん (16/10/20(Thu) 07:46) #13092
                  └Nomal Re[10]: CSVデータ→エクセル(ソート) /佐藤 (16/10/21(Fri) 16:46) #13097
                    └Nomal Re[11]: CSVデータ→エクセル(ソート) /よねさん (16/10/22(Sat) 08:22) #13098


親記事 / ▼[ 12985 ]
■12984 / 親階層)  CSVデータ→エクセル(ソート)
□投稿者/ 佐藤 -(2016/04/13(Wed) 16:53:03)
    売上順位表を作成したいのですが
    CSVの売上を降順にソートして、担当者、店番、店名、売上を売上順位表のエクセルに情報を反映させたいです。
    毎月シートを作成しているので、シート作成と並び替えは分かったのでVBAを作成してみたのですが、CSVの情報を
    エクセルに反映するVBAでつまってしまいました。
    分かりづらいVBAで、すみません。ご教授のほど、よろしくお願いします。
    
    【CSVシート】
       A    B      C     D    E      F
    1 場所   担当番号   担当者  店番  店名    売上 …
    2 東京  1111    田中    12345  果物屋   1,500…
    3 大阪  2222    佐藤    23456  文房具屋  10,000…
    …
    11 総計                       35,000…
    
    【売上順位表エクセルシート】
    A1=売上月の日付(ex:4/1)
    A12:A119=店番
    D12:D119=店名
    M12:M119=担当者
    O12:O119=売上(降順)
    
       A …  D …        M …      O …
    1 4/1   
    2
    …
    11 店番  店名    担当者   売上
    12 23456 文房具屋 佐藤        10,000
    13 12345 果物屋   田中     1,500
    …
    119
    
    【コード】
    
    Sub SheetCopy()
    
    Dim myBook As Workbook
    Dim OpenFileName As String
    Dim myb_name1 As String
    Dim myb_name2 As String
    Dim mySh_name As String
    Dim mySh1 As Worksheet, mySh2 As Worksheet
    Dim mySh_name1 As String
    Dim wSheetName As Variant
    Dim wNewSheetName As Variant
    Dim NewDate As Date
    Dim Sh As Worksheet
    
    
        'アクティブなシート名を取得
        wSheetName = ActiveSheet.Name
        NewDate = DateAdd("m", 1, Range("A1").Value)
        wNewSheetName = Format(NewDate, "yyyy.m")
        '同名シートの有無を確認
        For Each Sh In ThisWorkbook.Worksheets
            If Sh.Name = wNewSheetName Then
                MsgBox "すでに同名のシートが有りますので終了します "
                Exit Sub
            End If
        Next Sh
    
        'ワークシートのコピー
        ActiveSheet.Copy after:=ThisWorkbook.Sheets(Sheets.Count)
    
        'コピーしたシート名を変更する
        ActiveSheet.Name = wNewSheetName
        Range("A12:O119").ClearContents
    
    
         'A1セルに新しい日付を入力
        Range("A1").Value = NewDate
    
        '転記先シートを変数にセット
        myb_name1 = ThisWorkbook.Name
        mySh_name1 = ActiveSheet.Name
        Set mySh1 = Workbooks(myb_name1).Sheets(mySh_name1)
        'CSVファイルを開く
        OpenFileName = Application.GetOpenFilename("CSV ファイル (*.csv),*.csv")
        If OpenFileName <> "False" Then
            Workbooks.Open OpenFileName
        End If
        myb_name2 = ActiveWorkbook.Name
        mySh_name = Left(myb_name2, Len(myb_name2) - 4)
        'CSVシートを変数にセット
        Set mySh2 = Workbooks(myb_name2).Sheets(mySh_name)
       
        '並べ替えを実行する
        Range("A12:O119" & wLastGyou - 1).Sort _
            Key1:=Range("O12"), _
            Order1:=xlDescending, _
            Header:=xlNo
            
    End Sub

[ □ Tree ] 返信/引用返信 削除キー/

▲[ 12984 ] / ▼[ 12988 ]
■12985 / 1階層)  Re[1]: CSVデータ→エクセル(ソート)
□投稿者/ よねさん -(2016/04/14(Thu) 09:07:36)
    CSVファイルの書き出し部分が書いてなかったので追記しました。
    ややこしいのはCSVでの項目順番と書き出し先の順番が異なるところです。
    各項目ごとにコードを書く必要があるのでちょっと長くなります。
    
    また、sort部分のコードは2007以降は変化しています。
    こちらでは2010or2013でしたので、sortのコードを修正しています。
    お書きになっていた元のコードはコメントアウトしていますので
    バージョンに合わせて適切に修正してください。
    
    
    Sub SheetCopy()
    
    Dim myBook As Workbook
    Dim OpenFileName As String
    Dim myb_name1 As String
    Dim myb_name2 As String
    Dim mySh_name As String
    Dim mySh1 As Worksheet, mySh2 As Worksheet
    Dim mySh_name1 As String
    Dim wSheetName As Variant
    Dim wNewSheetName As Variant
    Dim NewDate As Date
    Dim Sh As Worksheet
    Dim wLastGyou As Long
    
    
        'アクティブなシート名を取得
        wSheetName = ActiveSheet.Name
        NewDate = DateAdd("m", 1, Range("A1").Value)
        wNewSheetName = Format(NewDate, "yyyy.m")
        '同名シートの有無を確認
        For Each Sh In ThisWorkbook.Worksheets
            If Sh.Name = wNewSheetName Then
                MsgBox "すでに同名のシートが有りますので終了します "
                Exit Sub
            End If
        Next Sh
    
        'ワークシートのコピー
        ActiveSheet.Copy after:=ThisWorkbook.Sheets(Sheets.Count)
    
        'コピーしたシート名を変更する
        ActiveSheet.Name = wNewSheetName
        Range("A12:O119").ClearContents
    
    
         'A1セルに新しい日付を入力
        Range("A1").Value = NewDate
    
        '転記先シートを変数にセット
        myb_name1 = ThisWorkbook.Name
        mySh_name1 = ActiveSheet.Name
        Set mySh1 = Workbooks(myb_name1).Sheets(mySh_name1)
        'CSVファイルを開く
        OpenFileName = Application.GetOpenFilename("CSV ファイル (*.csv),*.csv")
        If OpenFileName <> "False" Then
            Workbooks.Open OpenFileName
        End If
        myb_name2 = ActiveWorkbook.Name
        mySh_name = Left(myb_name2, Len(myb_name2) - 4)
        'CSVシートを変数にセット
        Set mySh2 = Workbooks(myb_name2).Sheets(mySh_name)
        
      '--------書き出し
        With mySh1
    Dim Fcn As Long
    Dim i As Long
    Dim buf As String
    Dim tmp As Variant
        Open OpenFileName For Input As #1
            Fcn = 9
            Do Until EOF(1)
                Line Input #1, buf
                Fcn = Fcn + 1
                tmp = Split(buf, ",")
                If Fcn >= 11 Then
                    For i = LBound(tmp) To UBound(tmp)
                        If i = 2 Then
                            .Cells(Fcn + 1, 13).Value = tmp(i)
                        ElseIf i = 3 Then
                            .Cells(Fcn + 1, 1).Value = tmp(i)
                        ElseIf i = 4 Then
                            .Cells(Fcn + 1, 4).Value = tmp(i)
                        ElseIf i = 5 Then
                            .Cells(Fcn + 1, 15).Value = tmp(i)
                        End If
                            
                    
                    Next i
                End If
    
            Loop
            Close #1
    
        End With
     '-------------
        
    
        '並べ替えを実行する
        wLastGyou = mySh1.Cells(Rows.Count, 1).End(xlUp).Row
    '    mySh1.Range("A12:O" & wLastGyou - 1).Sort _
            Key1:=Range("O12"), _
            Order1:=xlDescending, _
            Header:=xlNo
        mySh1.Sort.SortFields.Add Key:=Range("O12:O" & wLastGyou) _
            , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    
        With mySh1.Sort
            .SetRange Range("A12:O" & wLastGyou)
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    
    End Sub
    
    

[ 親 12984 / □ Tree ] 返信/引用返信 削除キー/

▲[ 12985 ] / ▼[ 12991 ]
■12988 / 2階層)  Re[2]: CSVデータ→エクセル(ソート)
□投稿者/ 佐藤 -(2016/04/14(Thu) 11:44:40)
    ありがとうございます。
    
    ソートの件、エクセルのヴァージョンによるんですね。
    知らなかったです。ありがとうございます。
    
    また説明不足で分かりづらく、すみません。
    CSVの書出し部分ですが
    
    担当者はC2から空白までで、エクセルM12から転記
    店番はD2から空白までで、エクセルA12から転記
    店名はE2から空白までで、エクセルD12から転記
    売上はF2から総計前のセルまでで、エクセルO12から転記
    
    上記の転記が希望です。
    またCSVデータの行は月ごとに変動があります。
    
    【CSVシート】
       A    B      C     D    E      F
    1 場所   担当番号   担当者  店番  店名    売上 …
    2 東京  1111    田中    12345  果物屋   1,500…
    3 大阪  2222    佐藤    23456  文房具屋  10,000…
    …
    11 総計                       35,000…
    
    ご教授いただいたコードで動かした際
    売上の数値がコンマの頭部分が転記されてしまいました。
    例えば『1,500』の場合は、『1』が転記されました。
    これも私の説明不足で、すみません。
    CSVのデータは、下記の様に『"",""』で区切られていました。
    
       A    B     C    D   E   F
    1 "場所","担当番号","担当者","店番","店名","売上", …
    2 "東京","1111","田中","12345","果物屋","1,500",…
    3 "大阪","2222","佐藤","23456","文房具屋","10,000",…
    …
    11 "総計","","","","","35,000",…
    
    度々、すみません。ご教授いただければ、幸いです。
    よろしくお願いします。

[ 親 12984 / □ Tree ] 返信/引用返信 削除キー/

▲[ 12988 ] / ▼[ 12994 ]
■12991 / 3階層)  Re[3]: CSVデータ→エクセル(ソート)
□投稿者/ よねさん -(2016/04/14(Thu) 17:48:08)
    > CSVのデータは、下記の様に『"",""』で区切られていました。
    > 例えば『1,500』の場合は、『1』が転記されました。
    このようなデータを扱うのはちょっと小細工が必要になります。
    
    作成するのが面倒なのでWeb検索するとドンピシャなページがありました。
    よそ様のサイトですが参考になると思いますのでリンクを載せておきます。
    
    エクセルVBAでダブルクォーテーションで囲まれているCSVファイルを取り込む
    http://tonari-it.com/vba-csv-double-quotation/
    
    エクセルVBAでデータにカンマが含まれてしまっているCSVを取り込む
    http://tonari-it.com/vba-csv-camma/
    
    
    

[ 親 12984 / □ Tree ] 返信/引用返信 削除キー/

▲[ 12991 ] / ▼[ 12996 ]
■12994 / 4階層)  Re[4]: CSVデータ→エクセル(ソート)
□投稿者/ 佐藤 -(2016/04/18(Mon) 15:47:06)
    カンマ区切りの件、教えていただいたページで勉強しカンマを外すことができました。ありがとうございます。
    ↓こちらも大変勉強になりました。
    http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_csv.html
    
    また大変面倒で申し訳ないのですが
    書出しの部分がうまくいかない上に、CSVが閉じませんが何が原因なのでしょうか?
    エクセルの書出し部分を三行ずつセルを統合してしまったのですが、それが
    原因でしょうか?
    大変ご面倒で申し訳ないのですが、ご教授のほど、よろしくお願いいたします。
    
    
    '--------書き出し
        With mySh1
    Dim Fcn As Long
    Dim i As Long
    Dim buf As String
    Dim tmp As Variant
        Open OpenFileName For Input As #1
            Fcn = 9
            Do Until EOF(1)
                Line Input #1, buf
                Fcn = Fcn + 1
                tmp = Split(buf, ",")
                If Fcn >= 11 Then
                    For i = LBound(tmp) To UBound(tmp)
                        If i = 2 Then
                            .Cells(Fcn + 1, 13).Value = tmp(i)
                        ElseIf i = 3 Then
                            .Cells(Fcn + 1, 1).Value = tmp(i)
                        ElseIf i = 4 Then
                            .Cells(Fcn + 1, 4).Value = tmp(i)
                        ElseIf i = 5 Then
                            .Cells(Fcn + 1, 15).Value = tmp(i)
                        End If
                            
                    
                    Next i
                End If
    
            Loop
            Close #1
    
        End With
     '-------------

[ 親 12984 / □ Tree ] 返信/引用返信 削除キー/

▲[ 12994 ] / ▼[ 13089 ]
■12996 / 5階層)  Re[5]: CSVデータ→エクセル(ソート)
□投稿者/ よねさん -(2016/04/19(Tue) 08:17:10)
    > CSVが閉じませんが何が原因なのでしょうか?
    閉じるコードを書いていませんので、CVSファイルを開いたときに Set myCVS = ActiveWorkbook としておき、
    書き出しが終わったら myCVS.Close として閉じたらよいと思います。
    Dim tmp As Variant
    Dim myCVS As Workbook
        Open OpenFileName For Input As #1
            Set myCVS = ActiveWorkbook
            Fcn = 9
            
            
            
    
    
            Loop
            Close #1
    
        End With
        myCVS.Close
     '-------------
     
    > 書出しの部分がうまくいかない
    これは
    > エクセルの書出し部分を三行ずつセルを統合してしまったのですが、それが
    原因でしょうか?
    たぶんこれが原因だと思います。
    3行が結合されているのであれば、3行ごとに書き出さないといけないのでは?
    .Cells(Fcn + 1, 13).Value = tmp(i)
    は Fcn+1で1行ずつ連続した行に書き出しています。
    Fcn*3-2 とすると、 1、4、7・・・と3行ごとになります。
    ただし、Fcn=9から開始して、11以上で書き出しているので(タイトル行を書き出さないため)
    11*3-2=31 になってしまいます。
    実際は12行目から書き出すので
    (Fcn-7)*3-2 といったような調整が必要と思います。
    
    
    > ↓こちらも大変勉強になりました。
    > http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_csv.html
    書いていたことを覚えていませんでした。(-_-;)
    

[ 親 12984 / □ Tree ] 返信/引用返信 削除キー/

▲[ 12996 ] / ▼[ 13090 ]
■13089 / 6階層)  Re[6]: CSVデータ→エクセル(ソート)
□投稿者/ 佐藤 -(2016/10/18(Tue) 15:18:47)
    こんにちは、よねさん。
    時間が経ってしまっての質問ですみません。

    下記の3行ごとに書き出す数式がうまくいきません。
    申し訳ないのですが、再度ご教授のほど、よろしくお願いします。

    Fcn=9から開始して、11以上の所は、フォーマットの行を調整しようかと思い
    3の倍数にハマる様に、Fcn=10から開始して、12以上にしたら3の倍数にハマるのかと思い、Fcn*3-2を記入しましたがうまくいきませんでした。
    どうしたら、よろしいでしょうか?


    > エクセルの書出し部分を三行ずつセルを統合してしまったのですが、それが
    原因でしょうか?
    たぶんこれが原因だと思います。
    3行が結合されているのであれば、3行ごとに書き出さないといけないのでは?
    .Cells(Fcn + 1, 13).Value = tmp(i)
    は Fcn+1で1行ずつ連続した行に書き出しています。
    Fcn*3-2 とすると、 1、4、7・・・と3行ごとになります。
    ただし、Fcn=9から開始して、11以上で書き出しているので(タイトル行を書き出さないため)
    11*3-2=31 になってしまいます。
    実際は12行目から書き出すので
    (Fcn-7)*3-2 といったような調整が必要と思います。
[ 親 12984 / □ Tree ] 返信/引用返信 削除キー/

▲[ 13089 ] / ▼[ 13091 ]
■13090 / 7階層)  Re[7]: CSVデータ→エクセル(ソート)
□投稿者/ よねさん -(2016/10/18(Tue) 16:53:14)
    > Fcn=9から開始して、11以上の所は、フォーマットの行を調整しようかと思い
    > 3の倍数にハマる様に、Fcn=10から開始して、12以上にしたら3の倍数にハマるのかと思い、
    > Fcn*3-2を記入しましたがうまくいきませんでした。
    > どうしたら、よろしいでしょうか?
    どのようにしたいのか理解できません。
    Fcnは何から始まって、Fcnが○○のときどのような結果を得たいのですか?
    Fcnの値とその結果を並べてください。
    そのようになる数式を組み立てることになると思うのですが、いかがでしょうか?
    

[ 親 12984 / □ Tree ] 返信/引用返信 削除キー/

▲[ 13090 ] / ▼[ 13092 ]
■13091 / 8階層)  Re[8]: CSVデータ→エクセル(ソート)
□投稿者/ 佐藤 -(2016/10/19(Wed) 13:40:52)
    3行を結合している表にCSVの情報を入力していきたいです。
    1,4,7,10,13,16,19...の行にあてはまる様にしたいです。
    12行目に項目名を入力させているので、CSVの情報を13行目から入力したいです。
    また、13行目からは3行ずつ結合させているので、CSV情報は13,16,19,21...行目に入力させたいです。
    そうすると下記の書き出しコードになるかと思うのですが、
    
    .Cells(Fcn + 1, 13).Value = tmp(i) の『Fcn+1』を3行ずつ結合されているセルに入力するには
    どんな数式にするかわからないので、教えていただきたいです。
    よろしくお願いします。
    
    念の為、書き出しコードの下に、CSV情報の入力したエクセルシートを記載します。
    
    '--------書き出し
        With mySh1
    Dim Fcn As Long
    Dim i As Long
    Dim buf As String
    Dim tmp As Variant
    
    Dim myCVS As Workbook
        Open OpenFileName For Input As #1
            Set myCVS = ActiveWorkbook
            Fcn = 12
    
    
            Do Until EOF(1)
                Line Input #1, buf
                Fcn = Fcn + 1
                tmp = Split(buf, ",")
                If Fcn >= 12 Then
                    For i = LBound(tmp) To UBound(tmp)
                        If i = 2 Then
                            .Cells(Fcn + 1, 13).Value = tmp(i)
                        ElseIf i = 3 Then
                            .Cells(Fcn + 1, 1).Value = tmp(i)
                        ElseIf i = 4 Then
                            .Cells(Fcn + 1, 4).Value = tmp(i)
                        ElseIf i = 5 Then
                            .Cells(Fcn + 1, 15).Value = tmp(i)
                        End If
                            
                    
                    Next i
                End If
    
            
    
        Loop
            Close #1
    
        End With
        myCVS.Close
     '-------------
    
    
    【CSVシート】
       A    B      C     D    E      F
    1 場所   担当番号   担当者  店番  店名    売上 …
    2 東京  1111    田中    12345  果物屋   1,500…
    3 大阪  2222    佐藤    23456  文房具屋  10,000…
    4 京都  1234    鈴木   34765  魚屋    25,000…
     …
    11 総計                        36,500…
    
    【書き出し後のエクセルシート】
    A1=売上月の日付(ex:4/1)
    
    
       A …  D …        M …      O …
    1 4/1   
    2
    …
    12 店番  店名    担当者   売上
    13 23456  文房具屋  佐藤      10,000
    16 12345  果物屋   田中     1,500
    19 34765  魚屋    鈴木    25,000
     …
    123 

[ 親 12984 / □ Tree ] 返信/引用返信 削除キー/

▲[ 13091 ] / ▼[ 13097 ]
■13092 / 9階層)  Re[9]: CSVデータ→エクセル(ソート)
□投稿者/ よねさん -(2016/10/20(Thu) 07:46:40)
    変数が同じなので分かりにくいですね。
    Fcn はカウントアップする変数として
    行数を変数 Gyou に入れることにします。
    
    すると Fcn=Fcn+1 でカウントアップするので、Fcnの初期値は 0で良いことになります。
    Fcn=0+1=1の時 Gyouは 13にするので Gyou=gyou*3+10=1*3+10=13 となります。
    つぎは、 Fcn=1+1=2 Gyou=2*3+10=16
    Fcn=2+1=3 Gyou=3*3+10=19 ・・・・といった具合になります。
    
    よって、コードは以下のように変更すればいかがでしょう
    
    '--------書き出し
        With mySh1
    Dim Fcn As Long
    Dim i As Long
    Dim buf As String
    Dim tmp As Variant
    
    Dim myCVS As Workbook
    Dim Gyou as long
        Open OpenFileName For Input As #1
            Set myCVS = ActiveWorkbook
            Fcn = 0
    
    
            Do Until EOF(1)
                Line Input #1, buf
                Fcn = Fcn + 1
                Gyou = Gyou * 3 + 10
                tmp = Split(buf, ",")
                
                    For i = LBound(tmp) To UBound(tmp)
                        If i = 2 Then
                            .Cells(Gyou , 13).Value = tmp(i)
                        ElseIf i = 3 Then
                            .Cells(Gyou , 1).Value = tmp(i)
                        ElseIf i = 4 Then
                            .Cells(Gyou , 4).Value = tmp(i)
                        ElseIf i = 5 Then
                            .Cells(Gyou , 15).Value = tmp(i)
                        End If
                            
                    
                    Next i
                End If
    
            
    
        Loop
            Close #1
    
        End With
        myCVS.Close
     '-------------
    
    

[ 親 12984 / □ Tree ] 返信/引用返信 削除キー/

▲[ 13092 ] / ▼[ 13098 ]
■13097 / 10階層)  Re[10]: CSVデータ→エクセル(ソート)
□投稿者/ 佐藤 -(2016/10/21(Fri) 16:46:53)
    カウントアップする変数の件
    イメージがつきやすく、分かりやすい説明ありがとうございます。
    
    新たに書き出していただいたコードで動かして見たのですが
    
    .Cells(Gyou , 13).Value = tmp(i)でデバックが出てしまいました。
    
    下記コードも入れてみたのですが、ダメでした。
    If Fcn >= 12 Then
    
    何が原因なのでしょうか?
    
    よろしくお願いいたします。

[ 親 12984 / □ Tree ] 返信/引用返信 削除キー/

▲[ 13097 ] / 返信無し
■13098 / 11階層)  Re[11]: CSVデータ→エクセル(ソート)
□投稿者/ よねさん -(2016/10/22(Sat) 08:22:05)
    Gyou = Gyou * 3 + 10 が間違っています。


    Gyou = Fcn * 3 + 10 が正解です。


    > .Cells(Gyou , 13).Value = tmp(i)でデバックが出てしまいました。
    この時、Gyouの値を見てみると(マウスをポイントすればポップアップ表示されると思います)
    とんでもない値になっていませんでしたか?、計算結果がおかしいことに気付くかと思います。

    > 下記コードも入れてみたのですが、ダメでした。
    > If Fcn >= 12 Then
    行数を変数Gyouとしましたので、この行は必要ありません。
    それに伴う Next i の後ろの行の End If も不要になります。
    コードの修正をお願いします。


[ 親 12984 / □ Tree ] 返信/引用返信 削除キー/


Pass/

HOME HELP 新規作成 新着記事 ツリー表示 トピック表示 検索 過去ログ

- Child Tree -