みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
FM12 win8です。
あるエクセルファイルのデーターをFMで設定している2つのテーブルに一つのスクリプトでインポートしたいのですが、方法をお教えください。
30のエクセルファイルがあります。
エクセルファイルではシートがSheetA,SheetB、SheetC・・・とファイルによりシート数が異なります。
SheetAには、会社名A,会社名B・・・の会社名と担当者、電話番号の基本データーがあります。
SheetB,SheetC・・・には、各会社のシート名で会社ごとの注文部品のデーターとして、部品番号、注文個数のデーターがあります。
30のファイルは、取り扱う部品の分類と会社名が異なります。
FMではテーブルAとテーブルBがあります。テーブルAの会社名でテーブルBと親子のリレーションしております。
テーブルAには、会社名と担当者、電話番号の基本データーを取り込ます。
テーブルBには、注文部品のデーターとして、会社名、部品番号、注文個数のデーターを取り込ます。
これを、ユーザーがスクリプトでエクセルのファイル名とSheetAを選ぶことで、SheetB,SheetC・・・のデーターを取り込みたいのです。
インポートするときに、インポート元とインポート先の設定はインポート順でできるのかなと思いますが、
SheetB、SheetC・・・とする場合は変数で設定しLoopすれば出来そうですが、やり方が全く分かりません。
それぞれのエクセルシートをテーブルA,テーブルBと順番に手入力すればできそうですが、
エクセルSheetBシート名には会社名があるのですが、シート内の列には会社名がなく、手入力が困難です。
説明自体分かりにくいところがあるかもしれませんが、ご教授よろしくお願いいたします。
シートの選択に変数を使う余地が無いので無理です。
Offline
シート内にデータが入ってないと無理ですよ。(現状はデータの一部がシート名になってる)
エクセルのマクロで、1シート1ファイルに変換したらいいのでは。
Offline
シート名の取得には、先日質問した
[解決] エクセルのシート名を取得 by はしもと
https://fm-aid.com/bbs2/viewtopic.php?id=328
を使ってSheetAに各シートの名前を取得することを考えております(シート名全てを取得可能でした)
各シートの空きスペースにも入力することでシート内にシート名の取得可能ですが、何とかならないでしょうか?
私のおすすめはプラグイン ScriptMakerMS
https://sites.google.com/site/scriptmak … iptmakerms
ExcelとFileMaker の連携ができる
https://sites.google.com/site/scriptmak … ate_excel2
たとえば
セル:A1 の値を取得 xsl_GetValue_Range("A1")
セル:A1 の値を設定 xsl_SetValue_Range("A1";OpeEx2::argument)
Offline
keimaさん おすすめ!ありがとうございます。作者です。
ExcelとFileMaker の連携ができる
https://sites.google.com/site/scriptmak … ate_excel2
上記を使用する場合は、
フィールド設定 [フィールド; iiil_Eval( "wb.Worksheets(1).name" )]
フィールド設定 [フィールド; iiil_Eval( "wb.Worksheets(2).name" )]
でシート名が取得出来ます。
また、以下の様にすることで、それぞれの Sheet の値を取得出来ます。
Sheet1 の A1 の値を取得
変数を設定 [$er; 値:iiil_Exe( "Set ws=wb.Worksheets(1)" )]
フィールド設定 [フィールド; xsl_GetValue_Range("A1")]
Sheet2 の A1 の値を取得
変数を設定 [$er; 値:iiil_Exe( "Set ws=wb.Worksheets(2)" )]
フィールド設定 [フィールド; xsl_GetValue_Range("A1")]
Offline
回答ありがとうございます。
最初の質問で、シート名が所得出来ればSheetB,SheetCのデーター取得できるでしょうか?
ご教授、よろしくお願いいたします
めんどうなようでも、シート名の列を作り、データを入れておいたほうが後の処理が楽です。
EXCELのデータの右側に1行目(たとえばP列ならP1)に「シート名」2行目(P列ならP2)に下の式を入力。
セルの右下でポイントし マウスポインタが + になったらダブルクリック。さらに適当なところまでドラッグでその計算式をコピーします。
この式ではA行が3セル連続で空白になるとシート名が非表示になります。
EXCELの2行目専用のシート名の式
=IF(AND(A2="",A3="",A4=""),"",RIGHT(CELL("filename",$A$1),LEN(CELL("filename",$A$1))-FIND("]",CELL("filename",$A$1))))
データの取り込みはインポートとプラグインを使う方法があります。シート名が不変ならスクリプトをループでまわせばできます。
Offline
プラグイン使用時のサンプルスクリプトです。データが多い場合は、向きません。
xsl_OperateExcel ( "true" )
を
xsl_OperateExcel ( "false" )
にするとExcelの表示は、無くなります。
#シート2を対象にする
変数を設定 [$f1; 値:iiil_Exe( "Set ws=wb.Worksheets(2)" )]
#シート2の名前を取得
変数を設定 [$社名; 値:iiil_Eval( "wb.Worksheets(2).name" )]
の
wb.Worksheets(2)
を
wb.Worksheets(3) とか wb.Worksheets(4) とかに変更してそれぞれのシートのデータを取得します。
サンプルスクリプト
ウインドウの固定
#新しくExcelを起動。
変数を設定 [$er; 値:xsl_OperateExcel ( "true" )]
#ファイルを開く
変数を設定 [$path; 値:"D:\TEST01.xlsx"]
変数を設定 [$er; 値:xsl_Open ( $path )]
#シート2を対象にする
変数を設定 [$f1; 値:iiil_Exe( "Set ws=wb.Worksheets(2)" )]
#シート2の名前を取得
変数を設定 [$社名; 値:iiil_Eval( "wb.Worksheets(2).name" )]
#セルの値を取得
変数を設定 [$RowIndex; 値:1]
Loop
変数を設定 [$f1; 値:xsl_GetValue_Cells ( $RowIndex ; 1)]
変数を設定 [$f2; 値:xsl_GetValue_Cells ( $RowIndex ; 2)]
変数を設定 [$f3; 値:xsl_GetValue_Cells ( $RowIndex ; 3)]
Exit Loop If [IsEmpty ( $f1 & $f2 & $f3 )]
新規レコード/検索条件
フィールド設定 [sample::会社名; $社名]
フィールド設定 [sample::f1; $f1]
フィールド設定 [sample::f2; $f2]
フィールド設定 [sample::f3; $f3]
変数を設定 [$RowIndex; 値:$RowIndex+1]
End Loop
#WorkBookを閉じる。
変数を設定 [$er; 値:xsl_Close_NoSaved]
#Excelを終了。
変数を設定 [$er; 値:xsl_QuitExcel]
Operate_Excel2
https://sites.google.com/site/scriptmak … 2/download
FileMaker Pro Advancedの場合:
インポート、または、コピー&ペーストで別のファイルでもカスタム関数が利用可能です。
FileMaker Pro の場合:
カスタム関数入のファイル「Operate_Excel2.fmp12(.fp7)」を元にすれば、カスタム関数の利用が可能です。テーブルやスクリプトを削除し、ファイル名もお好きな名前に変更して下さい。
Offline
[ Generated in 0.007 seconds, 9 queries executed - Memory usage: 542.48 KiB (Peak: 563.38 KiB) ]