Numbers関数
何か良い方法ありますか?
MacBook Pro 16″, macOS 12.5
何か良い方法ありますか?
MacBook Pro 16″, macOS 12.5
shonz さんによる書き込み:
数式の意味が分からないので教えて頂きたいです!
詳細な説明は難しいので概要だけでごめんなさい。
最初のIF関数では B4 が空欄かどうかを確認しています。空欄であれば "倉庫" や "持出" を表示する必要がないためです。
次に、B4が空欄でなかった場合には2つ目のIF関数が評価されますが、2つ目のIF関数では E4〜AI4 までのセルがすべて空欄かどうかを確認しています。空欄であれば "倉庫" を表示するのが適当と考えられるためです。
続いて、E4〜AI4 までのセルのいずれかに入力がある場合に3つ目のIF関数が評価されますが、3つ目のIF関数では E4〜AI4 を参照範囲の右側(AI4側)から左に向かって "返却" の入力を探し最初に見つかった "返却" の位置が参照範囲内で入力値がある最も右側のセルかを確認しています。条件を満たす場合 "倉庫" を表示します。
最後に、以上3つのIF関数の全ての条件を満たさなかった場合( =E4〜AI4 の参照範囲内で入力値のある最も右端のセルの値が "返却" ではない=持出の場合)なので "持出" を表示します。
shonz さんによる書き込み:
数式の意味が分からないので教えて頂きたいです!
詳細な説明は難しいので概要だけでごめんなさい。
最初のIF関数では B4 が空欄かどうかを確認しています。空欄であれば "倉庫" や "持出" を表示する必要がないためです。
次に、B4が空欄でなかった場合には2つ目のIF関数が評価されますが、2つ目のIF関数では E4〜AI4 までのセルがすべて空欄かどうかを確認しています。空欄であれば "倉庫" を表示するのが適当と考えられるためです。
続いて、E4〜AI4 までのセルのいずれかに入力がある場合に3つ目のIF関数が評価されますが、3つ目のIF関数では E4〜AI4 を参照範囲の右側(AI4側)から左に向かって "返却" の入力を探し最初に見つかった "返却" の位置が参照範囲内で入力値がある最も右側のセルかを確認しています。条件を満たす場合 "倉庫" を表示します。
最後に、以上3つのIF関数の全ての条件を満たさなかった場合( =E4〜AI4 の参照範囲内で入力値のある最も右端のセルの値が "返却" ではない=持出の場合)なので "持出" を表示します。
shonz さんによる書き込み:
意味は理解できるのですが 数式と意味が一致しません、、、汗
各関数の意味については下記リンクが詳細の解説になります。
※引用:IF関数は、指定された式がブール値TRUEまたはFALSEのどちらを返すかに応じて、2つの値のうち1つを返します。
※引用:ISBLANK関数は、指定したセル番地が空の場合はブール値TRUEを、そうでない場合はブール値FALSEを返します。
※引用:IFERROR関数は、指定された値がエラーを返す場合は指定した値を返し、それ以外の場合は指定された値を返します。
※引用:XMATCH関数は、指定した項目のセルの範囲内での相対位置を返します。
XMATCH関数の使用例についてだけ補足です。
・XMATCH("?*",$E4:$AI4,2,−1)
第1引数:"?*" ・・・検索値です。?は任意の1文字を*は任意の文字列を表すため、この例は1文字以上の任意の長さの文字列の意味になります
第2引数:$E4:$AI4 ・・・検索範囲です。
第3引数:2 ・・・一致タイプです。?や*を検索値にしているため、ワイルドカードにしています。
第4引数:-1 ・・・検索タイプです。引用:「最後から最初へ(-1): 範囲を最後から最初に向かって検索します。」
・XMATCH("返却",$E4:$AI4,0,−1)
第1引数:"返却" ・・・検索値です。
第2引数:$E4:$AI4 ・・・検索範囲です。
第3引数:0 ・・・一致タイプです。引用:「完全一致(0または省略): 正確に一致するものがない場合、エラーを返します。」
第4引数:-1 ・・・検索タイプです。引用:「最後から最初へ(-1): 範囲を最後から最初に向かって検索します。」
前回の私の返信での、F4の数式の例について訂正です。当月の日数が31日に満たない場合を考慮していませんでした。
以下のように修正させてください。
IFS( OR(ISBLANK(E4),E4="返却"),""
,AND(ISBLANK(F$2)=FALSE,F$2≤TODAY()),E4
,TRUE,""
)
【その他参考】
※引用:AND関数は、すべての引数が真の場合はブール値TRUEを、それ以外の場合はブール値FALSEを返します。
shonz さんによる書き込み:
1つ目の数式だと31日未満だとどういった不具合が出るのでしょうか?
例えば、当月が2022年9月だった場合、9月の日数は30日間なのでE2〜AH2には2022/9/1〜2022/9/30と入力するでしょうがAI2は空欄にするでしょう。
そうすると、TODAY関数が2022/9/30より未来の日付を返すようになった状態でファイルを開いた時に、AI2<=TODAY() が 空欄<=2022/10/1 のような条件式になってしまって条件を満たすと判定されてしまいます。
その結果、AH列に事務所名がある状態(=持出状態の場合)だとAI列にも事務所名が表示されてしまう結果になります(AI列は存在しない日付の列なので空欄になるべきです)。
shonz さんによる書き込み:
E4に”事務所A”と入力したら”返却”と入力するまで日付が変わっても”事務所A”と入力される様にできないでしょうか?
こんばんは。お返事が大変遅くなりました。
F列からAI列について、各セルの1つ左隣の内容を必要に応じて表示するよう数式を設定すれば可能かもしれません。ただし、次の理由でおすすめはできません。
F列からAI列は入力用の列なので、そこに数式を設定するのは混乱や事故の原因になりそうです。というのは、セルに何か入力するとそのセルに設定した数式が消えてしまう(入力値に置き換わってしまう)からです。そうすると、各セルの数式を適宜再設定しなければならなくなります。面倒ですよね? ですので、普通は入力用の列に数式は設定しないと思います。
と言いつつ、一応書いてみたのでご紹介します。
F4の数式の例です。なおこの例はF2〜AI2に実際には2022/8/2〜2022/8/31というように当月の西暦日付が入っていることを前提にしています。F4に数式を入力したあとで、セルF4をコピーしてG4〜AI4,F5〜AI5等にコピーすれば、式の参照が適宜修正されてコピーされます。
IFS( OR(ISBLANK(E4),E4="返却"),""
,F$2≤TODAY(),E4
,TRUE,""
)
【その他参考】
※引用:IFS関数は、指定した式を確認して、ブール値TRUEを返す最初の条件に基づいて値を返します。
※引用:OR関数は、引数のうち1つでも真であればブール値TRUEを、それ以外の場合はブール値FALSEを返します。
※引用:TODAY関数はファイルの時間帯での現在の日付を返します(下の「参考」を参照)。時刻は午前12:00に設定されます。
shonz さんによる書き込み:
この数式で8月分のシートを作成し 別シートで9月を作成した場合 9/1に同じ数式を入れ 8/31から反映させると上手くいきません
何か良い方法はありますか?
やすどん さんのご提案を採用した方がいいですよ。
それだけでは何なので…。
自動的に貸出状況を翌月に繰り越すことは考慮していません。
月末に現実に行った倉庫の在庫確認の結果を翌月のシートの1日の列に手入力することを想定しています。
面倒でしたら、おすすめはしませんが、次のようにすれば多少は省力化できるでしょう。
1. 当月(8月)のシートの月末日の列(8月はAI列)の列の文字(8月はAI)の上で control+クリックして「スナップショットをコピー」を選択。
【参考】
MacのNumbersでセル、行、および列を選択する - Apple サポート (日本)
※「行と列を選択する」>「1つの行または列を選択する」
2. 翌月(9月)のシートの月初日の列(E列)の列の文字(E)の上で control+クリックして「ペースト」を選択。
3. 必要に応じて翌月(9月)のシートのE列の内容を訂正する(E2の数式を =A$2 に直す等)。
どうしても自動化したいなら、ご自身で頑張ってみてください。
なお、
・関数で別シートを参照することになるので、シートの命名規則を統一する必要があるでしょう。
・貸出物品の行を一意に識別するための情報を持った列があった方が良いでしょう(今のシートにはありません。管理物品が増えた時に、参照する行を自動的に調整するようにできた方が良いだろうというのが理由です)。
どうしても1日の項に倉庫を入れるのが嫌で、返却という言葉も使いたいのであれば下記かな。ちょっと冗長だけど。
IFS( COUNTIF(E4:AI4,"<>")=0,"倉庫", INDEX(E4:AI4,XMATCH("?*",E4:AI4,2,−1))="返却","倉庫", TRUE,INDEX(E4:AI4,XMATCH("?*",E4:AI4,2,−1)) )
やすどん さんがお示しになった数式では「管理番号」列が未入力の場合に「状態」列を表示しないようにする条件がありませんね(重要ではないとお考えになったのでしょう)。
必要ならCOUNTIF関数の前に次の条件を加えてください。
$B4="","",
あとは大丈夫ですよね。頑張ってください。
こんな感じで如何でしょうか。
C4の数式の例です。なおこの例では表の列数が35列(35番目の列はAI列)ある前提で書かれています。
IF( ISBLANK($B4)=TRUE
,""
,IF( IFERROR(XMATCH("?*",$E4:$AI4,2,−1),0)=0
,"倉庫"
,IF( IFERROR(XMATCH("返却",$E4:$AI4,0,−1),0)=IFERROR(XMATCH("?*",$E4:$AI4,2,−1),0)
,"倉庫"
,"持出"
)
)
)
ちょっと手こずりました。頑張ってください(おやすみなさい)。
A1を変更すると変更した月の各日付が表示されます。
A1がこの状態とします。
B1はこの状態とします(A1を参照しています)。
C1はこの状態とします。
D1〜AC1にはC1をコピーします。
AD1〜AF1は次のようにします。
AD1の数式の例です。AD1に数式を入力したあとで、セルAD1をコピーしてAE1とAF1にコピーしてください(参照が適宜修正されてコピーされます)。
IFS( AC$1="",""
,AC$1+1>EOMONTH(B$1,0),""
,TRUE,AC$1+1
)
【その他参考】
※引用:EOMONTH関数は、指定された日付から、指定された月数前またはあとの月の最後の日にあたる日付/時刻値を返します。
おはようございます。
やすどん さんによる書き込み:
消しゴム3と鉛筆1の間に無駄な行がありますよね。
一般的にはここに空白の行を挿入したりしません。
あえてユーザーが意図的に挿入していると考えました。
なので、ユーザが意図的に空白の行を挿入しているのですから、その行に関数をコピペすることもないでしょうって考えです。
空白行に関数をコピペしないのであれば、当該セルが空白かどうかもチェックする必要はないですよね。
不要とお考えだったのですね。失礼いたしました。
shonzさんがお作りになった表には(一般的には入れないでしょうが)物品間に空行があったので、隣接するセルに数式を自動入力でコピーすることを想定すると条件を入れたほうが良いかなと思いました。空行をいちいち避けてコピーしないだろうと思いまして。でも正直に言うと条件反射的に数式を入れたかもしれません(笑)
MacのNumbersでセルを自動入力する - Apple サポート (日本)
あと、物品が一つしかないため管理番号をあえてつけない状況も考えましたが、物差しが一つしかないのに管理番号1が記入されていますので、この可能性も否定されます。
そこまで深くは考えませんでした。さすがですね。
見栄えがちょっと悪いけど、簡単なのはこれかな
=INDEX(E4:AI4,XMATCH("?*",E4:AI4,2,−1))
返却されたものの状態が”返却”、一度も貸し出していないものは”!”になるけどご愛嬌。
これがいやならifsで適当にいじってください。
ぶっちゃけた話してもいいかな?
スタートの時点でのシートの作り方がダメだと思う。
私なら下記のようなシートを作成します。
物品の列はポップアップメニューにします。
状態の列もポップアップメニュー
物品ごとに状態を見たい時は、カテゴリを物品で整理します。
関数は使っていません。
やすどん さんによる書き込み:
この表だと、例えば
消しゴムを午前中に事務所Aが持ち出し午後に返却した場合
とか、
消しゴムを事務所Aが持ち出し、返却することなく午後に事務所Bへまた貸しした場合
ってどうするんだろう。
shonzさんの表を生かすとこんな表現になりそうですが、今までの数式も直さないといけないですね。
管理番号 8/1 (月)
1 事務所A→返却
2 事務所B→事務所X
3 事務所C→返却→事務所Z
手っ取り早いのは、1日の日付のところにすべて”倉庫”をいれておく。
”返却”と記入するところを”倉庫”と記入すればいいんじゃなかろうか。
Numbers関数