初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2020-11-18 10:23:30

Chikutaku
Member

Excelへのエクスポートについて

お世話になっております。
FileMaker19 Windows10
WebサイトへCSVをアップロードし、データを取り込む作業があるのですが、
そのフォーマットが1レコードにつき、2行のCSVになっており、困っております。
内訳としましては、1レコード内に、顧客情報と商品情報が保管されており、
一行目は、顧客情報、2行目に商品情報となっております。
現在Excelのマクロを用いてCSVへしておりますが、FileMaker内に顧客、商品のデータがあるので、
FileMakerからエクスポートしたデータがそのフォーマットになればありがたいのですが、こういうことは可能なのでしょうか。

Excelのマクロを下記に載せておきます。

Sub CSV出力()
    Dim csvFilePath As String
    Dim iCount As Long
    Dim jCount As Long
    Dim kCount As Long
    Dim maxRow As Long
    Dim maxCol As Long
    Dim fileNo As Integer
    Dim FileName As String
    Dim wScriptHost As Object, strInitDir As String
    'カレントディレクトリをデスクトップに変更
    Set wScriptHost = CreateObject("WScript.Shell")
    ChDir wScriptHost.SpecialFolders("Desktop")

    FileName = Application.GetSaveAsFilename("sample.csv", "CSVファイル(*.csv;),*.csv", 2, "保存するファイルの名前を指定してください。")

    ' CSVファイルパスの作成
    csvFilePath = FileName
    ' 最終行
    maxRow = ActiveSheet.Range("A1").End(xlDown).Row
    ' 最終列
    maxCol = ActiveSheet.Range("A1").End(xlToRight).Column
    ' ファイル番号
    fileNo = FreeFile

    ' ファイル開く
    Open csvFilePath For Output As #fileNo

    Dim isSecond As Boolean
    isSecond = False
    Dim isThird As Boolean
    isThird = False
    
    ' 縦方向ループ(最終行まで)
    For iCount = 2 To maxRow
        ' 横方向ループ(最終列-1まで)
        For jCount = 1 To 80
            '基本情報
            If jCount < 32 Then
                ' ファイル出力(改行なし)
                Print #fileNo, Cells(iCount, jCount) & ",";
            '基本情報最後
            ElseIf jCount = 32 Then
                ' ファイル出力(改行付き)
                Print #fileNo, Cells(iCount, jCount)
            ' 商品情報1行目
            ElseIf jCount < 48 Then
                ' ファイル出力(改行なし)
                Print #fileNo, Cells(iCount, jCount) & ",";
            ' 商品情報1行目最後
            ElseIf jCount = 48 Then
                ' ファイル出力(改行付き)
                Print #fileNo, Cells(iCount, jCount)
            ' 商品情報2行目最初
            ElseIf jCount = 49 Then
                If Cells(iCount, jCount) <> "" Then
                    isSecond = True
                    ' ファイル出力(改行なし)
                    Print #fileNo, Cells(iCount, jCount) & ",";
                End If
            ' 商品情報2行目内容
            ElseIf jCount < 64 Then
                If isSecond = True Then
                    ' ファイル出力(改行なし)
                    Print #fileNo, Cells(iCount, jCount) & ",";
                End If
            ' 商品情報2行目最後
            ElseIf jCount = 64 Then
                If isSecond = True Then
                    ' ファイル出力(改行付き)
                    Print #fileNo, Cells(iCount, jCount)
                End If
            ' 商品情報3行目最初
            ElseIf jCount = 65 Then
                If Cells(iCount, jCount) <> "" Then
                    isThird = True
                    ' ファイル出力(改行なし)
                    Print #fileNo, Cells(iCount, jCount) & ",";
                End If
            ' 商品情報3行目内容
            ElseIf jCount < 80 Then
                If isThird = True Then
                    ' ファイル出力(改行なし)
                    Print #fileNo, Cells(iCount, jCount) & ",";
                End If
            ElseIf jCount = 80 Then
                If isThird = True Then
                    ' ファイル出力(改行付き)
                    Print #fileNo, Cells(iCount, jCount)
                End If
            Else
                ' ファイル出力(改行なし)
                Print #fileNo, Cells(iCount, jCount) & ",";
            End If
            ' ループカウンタをコピー
            kCount = jCount
        Next jCount
        'メモ内容がある場合は、メモ行を出力
        If Cells(iCount, kCount + 1) <> "" Then
            Print #fileNo, "3,,01,";
            ' 最終列をファイル出力(改行付き)
            Print #fileNo, Cells(iCount, kCount + 1) & ","
        End If
        isSecond = False
        isThird = False
    Next iCount

    ' ファイルを閉じる
    Close #fileNo
'
End Sub

Offline

#2 2020-11-18 11:48:58

Hiro
Member

Re: Excelへのエクスポートについて

考え方の一例です。

  • 任意構造のCSV書式文をグローバルフィールドに生成。
    なお、生成には、繰越変数値の「フィールド内容の全置換」が一発処理で簡便です。

  • その際、FMデフォルトのutf-16以外の文字コードが必要な場合は、
    TextEncode関数を使用して、生成テキストから目的の文字エンコードと改行コードを
    変換した結果をオブジェクトデータとしてテキストファイル化します。
    そのため、Gフィールドはオブジェクト・タイプが必須条件となります。

  • このGフィールドを〇〇.csv名で「フィールド内容のエキスポート」します。

Last edited by Hiro (2020-11-18 12:34:11)

Offline

#3 2020-11-18 15:03:32

Chikutaku
Member

Re: Excelへのエクスポートについて

なるほど。恐れ入りました。
こんなことができたのですね。
テキストエンコードは盲点でした。
utf-16部分で一度躓きましたが、上記で対応できました。
誠にありがとうございます。

Offline

Registered users online in this topic: 0, guests: 1
[Bot] claudebot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.016 seconds, 9 queries executed - Memory usage: 514.59 KiB (Peak: 531.12 KiB) ]