初心者のFileMaker pro Q&A

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

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

ログインしていません。

アナウンス

Claris FileMaker Pro ヘルプ
新しい質問は、新規トピック から投稿して下さい。


返信

メッセージを書いて送信してください。
オプション
登録の確認

実在の人物による登録であることを確認します。

戻る

トピックレビュー(最新表示)

koko009
2023-11-23 17:53:57

Excelで行列入れ替えは、確かにコピペで指定すれば簡単なようですが、例えばB2セルを先頭に表があったとすると入れ替えコピペする場所は表の範囲内以外の場所でないと駄目なので別の範囲にコピペしてその入れ替えた表を再度B2セルを先頭位置にペーストし無駄な部分を取り除くか等の作業が必要なので結構な手間だと私的には感じています。今回の方法では、変換したデーターをpowershellで最初から配置先のセル位置(B2)と表の範囲(範囲指定をしないと複数セルに渡る表として書き込めないため、そのためセル範囲の終端はpowershellで自動で取得するコードになっている)を指定して書き出すようにしている。

Shin
2023-11-23 16:31:41

Excelがかむなら、エリアをコピーして、行列を入れ替えてペースト で1っ発解決なんですが。

koko009
2023-11-23 14:03:00

>文字数が気になるならpowershellにはファイル名を渡して、そっちで直接CSVからデータを得るようにすればいいのでは。
1つの例ですが集計計算を
"\"" & ExecuteSQL ( "SELECT FieldName FROM FileMaker_Fields WHERE TableName='aggregation'
";"";"\",\"")& "\""&  ¶ &
ExecuteSQL ( "select '\"'||\"品名\"||'\"',\"数量\",\"金額\",'\"'||\"備考\"||'\"' from \"aggregation\"";",";"")
で別テーブルから変数として取得して利用するようにしています。以前はfmからデータをExcelの所定のセル位置に渡す方法として、水平タブ区切りで得た集計計算結果をフィールドに一度落としそれをコピーでクリップボード経由させpowershelllでExcelの所定のセル位置にペーストしていました。その手間を省くためpowershellの配列を利用す方法を別サイトで教えていただきこのサイトで過去に教えていただいた方法に手を加えfm側から操作できるようにまでなりました。
どちらにしても#21に記しているようにexcelの方で行列変換編集するには案外手間なのです。そこで今回、fm側データで最初から変換するようにすればと思いこの質問に至りました。
あと違和感の問題は、サンプル例に問題があるかもしれませんが、行列変換させるのはデータベースのデータの適切な蓄積方法から得た集計結果が表形式で見やすい表にする目的にそのままのデーターとして使えない場合ががあるからです。

himadanee
2023-11-23 12:57:16

文字数が気になるならpowershellにはファイル名を渡して、そっちで直接CSVからデータを得るようにすればいいのでは。

Excelにデータをいれるなら、エクスポートしたままのデータを入れて、Excelの方で編集すれば簡単そうですが。
コピペするだけで貼り付け時にオプションで指定できるそうです。
https://www.pc-koubou.jp/magazine/50678

今更ですが、項目名が縦に並ぶデータってすごく違和感がありますが...

koko009
2023-11-23 12:44:20

追記
#23で使ったダブルクォートで囲む下記の方法では、文字数が増えるので1行の文字数が「コマンド プロンプトで使用できる文字列の最大長は 8191 文字」の最大文字数制限の考えると配置方法によっては多少の問題があるかも
$array4 = @("バナナ","20","2640","p","");
過去の質問の際注意を受けていたのを思い出して気になったもので・・・数字の2文字数は2桁分に当たるから

koko009
2023-11-15 17:23:23

1次元配列をpowershellのwhileを使いループでExcelには
こんな集計結果で得たテキストデータを
品名,いちご,みかん,バナナ,リンゴ,梨
数量,,20,20,10,14
金額,3970,760,2640,1760,4720
備考,p,s,p,s,s
在庫,注文中 ,少,, 多,少

*powershell文に組み込むための変数の計算式
Let([e = While (
[
    t     = Pow::a1 ;
    nc    = PatternCount ( GetValue ( t ; 1 ) ; "," ) + 1 ;
    nr    = ValueCount ( t ) ;
    t    = Substitute( t ; "," ; ¶ ) ;
    i    = 0 ;
    re    = ""
] ;
    i < nc * nr ;
[
    j     = Mod ( i ; nr ) * nc + Div ( i ; nr ) + 1 ;
    re    = re & GetValue ( t ; j ) & Case ( i + 1 = nc * nr ; "" ; Mod ( i + 1 ; nr ) ; "," ; ¶ );
    i    = i + 1
] ;
    re
);
a = Substitute ( e ;"," ; "\",\"" )];
While ( [aa = "";i = 0  ] ; i < ValueCount ( a); [ aa=aa&"$array" & i+1 & " = @(\"" & GetValue ( a ; i+1 ) & "\");";i = i + 1 ]; aa ))

*計算結果
$array1 = @("品名","数量","金額","備考","在庫");$array2 = @("いちご","","3970","p","注文中 ");$array3 = @("みかん","20","760","s","少");$array4 = @("バナナ","20","2640","p","");$array5 = @("リンゴ","10","1760","s"," 多");$array6 = @("梨","14","4720","s","少");

Quote (Evaluate ())でpowershellコードを完成させeventを送信スクリプトでpowershellをを実行させExcelの任意のセル範囲に書き出すのに問題は生じていません。
なお
>項目数がそうそう変わることはないでしょうから、#5の式がいいのでは、
と勧められましたが行列の数は参考例のため少ないだけですので汎用式の方を使用させていただいています。

Shin
2023-11-15 15:15:51

それなら、項目数がそうそう変わることはないでしょうから、#5の式がいいのでは、

koko009
2023-11-15 08:09:45

ありがとうございます。ちなみに今試していることは
filemaker側でテキストを下記のようにpowershellのコードに組み込みeventを送信スクリプトでpowershellをを実行させExcelの任意のセル範囲に書き出す事です。
*空白があるデータ・・・文字列と数字が混在していますが、1次元、2次元配列のどちらの方法でも所定のセルが空白になりまた「””」括りの数字でもExcelでは数字となっています。
<#セルに書き込むためのデータ#>
$array1 = @("果物","リンゴ" ,"ミカン", "バナナ","ぶどう")
$array2 = @("個数","","10","5","8")
$array3 = @("売上",$empty, 2000,5000,300)
$array4 = @("在庫","注文中" ,"少", "",$empty)

Excelでも行と列を入れ替えることは可能ですが、同じ先頭セルを起点にすることが出来ないので、ならば最初のテキストの段階で入れ替えを実行すればと思い質問しました。
powershellでのExcel操作に関し再挑戦していたのでが現状詳しくpowershellを分かっていませんので悪しからず。
様々な提案に対し「,,」で試した結果だけしか述べられず申し訳なく思っております。

Shin
2023-11-14 22:02:44

クオーテーションは必要ですか。
同じ式にしておいて、最後に
Substitute  (
    “\”” & r & “\”” ;
   [ “,” ; “\”,\””];
   [ “\”\”” ; “$empty”]
)

koko009
2023-11-14 20:32:01

1次元配列をそのまま読み込まる方法

1次元配列をそのまま書き出す方法
に文言訂正

koko009
2023-11-14 20:24:15

様々な解法があり興味が尽きませんが、再度訂正です。
#12で

下記のテキストをpowershellを使いexcelに書き込んだ場合問題なく所定のセルが空白となったので別に明示する必要はありませんでした。
品名,数量,金額,備考
いちご,,3970,p

としていましたがデータをpowershellで2次元配列のオブジェクトに変換しExcelに書き出す方法では問題なく所定のセルが空白になりましたが、1次元配列をそのまま読み込まる方法では右側の値が読み込まれなく左に列がずれてしまいました。しかし、配列データを("個数","",$empty,"5","8")とすれば空白セルを正しく得られました。
以上今回の質問内容とかけ離れていますが訂正報告です。

Shin
2023-11-14 10:30:14

1pathでの計算式 やっと綺麗になった

While (
[
	t 	= text ;
	nc	= PatternCount ( GetValue ( t ; 1 ) ; "," ) + 1 ;
	nr	= ValueCount ( t ) ;
	t	= Substitute( t ; "," ; ¶ ) ;
	i	= 0 ;
	re	= ""
] ;
	i < nc * nr ;
[
	j 	= Mod ( i ; nr ) * nc + Div ( i ; nr ) + 1 ;
	i	= i + 1 ;
	re	= re & GetValue ( t ; j ) & Case ( i = nc * nr ; "" ; Mod ( i ; nr ) ; "," ; ¶ )
] ;
	re
)
himadanee
2023-11-13 19:16:24

1列に並べて取り出す方法なら、ループが1段な方が素直だろうと思って考えてみました。
While([
t=text;
row=GetValue(t;1);
nc=PatternCount(row;",")+1;
nr=ValueCount(t);
t=Substitute(t;",";¶);
i=1;
re="";
l=nc*(nr-1);
end=nc*nr
];
i<=end;
[
re=re&GetValue(t;i)&Case(i>l;¶;",");
i=i+nc-Case(i=end;0;i>l;end-1)
];
re
)

終了条件(というかCase関数のカウンタを次の列の1行目に戻す処理)が1つにならず、ちょっとすっきりしない...

Shin
2023-11-12 17:28:28

koko009さんの考え方は、1,2,3¶4,5,6を1¶2¶3¶4¶5¶6 にしておき(GetValue()が使えるように)、14¶25¶36の形にピックアップする方法ですね。最初に同じものを作って一応動いたのですが、綺麗な形にならなかったので、全く違う形へ書き換えました。
各列毎に変数へデータを格納していき、最後にそれを改行区切りでまとめています。繰り返し変数を使うのが味噌です。
また、違う方法として、最初に¶を列数だけ作り、Replace() で¶を置き換えてデータを入れ込んでいく方法も面白いかも。

koko009
2023-11-12 14:20:50

shinさんありがとうございます。
正直私の方法みたいにloop処理の流れをwhileの入れ子にするのは正しいかどうか分かりませんがなんとなく流れとしては分かりますが、shinさんのwhile式の構造はすぐ理解が出来ないので戸惑っています。時間をかけ理解するよう務めます。
何回もの修正に感謝します。

Board footer

Powered by FluxBB