アプリ版:「スタンプのみでお礼する」機能のリリースについて

詳しい方教えてください。
前任者が作った式なのですが、正確に理解出来ず、このまま使い続けて良いものか不安で、、、
お力を貸してください。

セルに下記のような式が入っていました。

'=@index(sheet1!$G$14:$G$82,column()-@cell("col",sheet2!$G$6)+1,row()-@cell("row",sheet2!$G$6)+1)


まずindex関数に「@」がついているところから理解でできず。。。

index関数は文字によって、セルを指定するのですよね、

配列が
(sheet1!$G$14:$G$82

であり、$G$14のセルから
行がcolumn()-@cell("col",sheet2!$G$6)+1
列がrow()-@cell("row",sheet2!$G$6)+1

動いたセルに入っている文字を入力させると言うことでしょうか。

何故「cell」式の前に「@」がついているのでしょうか。

また、column()-@cell("col",sheet2!$G$6)+1

はcolumn()(現在の列番号)から@cell("col",sheet2!$G$6)+1 を引くことだと思うのですが
@cell("col",sheet2!$G$6)+1 の意味が理解出来ません。。。情けない

このように人が作ったファイルで意味がわからない部分で、人に聞けない場合、とりあえず業務を滞らせないよう、使い続けても良いのでしょうか。

聞く相手もいない、自分の理解にも限界がある場合は、式は使いつつも、詳しい方に聞きながら理解していくのが良いでしょうか。(私の場合、詳しい方が社内に以内のですが。。。)

マクロなどは使えないレベルなので、せめて式レベルは理解したいのですが、、、
Excelの式に詳しくなるにはやはり実践でしょうか。今回の質問のようにわからない部分は都度調べていく、その積み重ねで何とか成長できるでしょうか。

式の意味と友に教えて頂ければと思います。

A 回答 (4件)

こんばんは



>前任者が作った式なのですが、正確に理解出来ず~
なんだかもっとずっと古そうな気がしますし、回りくどい指定方法になっているようです。
もしかすると、前任者さんもそのままわからずに使っていただけなのかも知れませんね。

>まずindex関数に「@」がついているところから理解でできず。。。
関数名の前の@は無視しても良いです。
@マークは、MS-DOS時代の表計算ソフト「Lotus 1-2-3」との互換性を保つためのものです。
https://xtech.nikkei.com/dm/article/LECTURE/2013 …
(No2様がご紹介の機能はここ最近のもので、もとからある上記を利用して旧来の関数を明示するものです)


さて、ご提示の式ですが、雰囲気からしてセル範囲に同じ式をフィルコピーできるように作成されているものと推測します。
(実際に値が変化するのは、column()とrow()の部分になります)
>配列が
>(sheet1!$G$14:$G$82
>であり、$G$14のセルから
>行がcolumn()-@cell("col",sheet2!$G$6)+1
>列がrow()-@cell("row",sheet2!$G$6)+1
に関してはお考えの通りです。

式中の「cell("col",sheet2!$G$6)」と「cell("row",sheet2!$G$6)」はセル位置が絶対参照になっているので、フィルコピーしても固定値のままです。(シート名を付す必要もないですね)
前者は$G$6の列番号「7」、後者は行番号「6」の固定値になります。
これで置き換えれば、INDEX関数内の
 行の指定は、column()-6
 列の指定は、row()-5
と同じ意味ということになります。
ここで何点かの考察ができます。
1)行の指定がcolumn()、列の指定がrow()になっているので、範囲の行列を入れ替えて参照している。
2)引数は0以下にできないので、この式はG6セル以降に設定されている
3)元のセル範囲が$G$14:$G$82で1列だけなので、そもそも列の指定に意味がない。


想像するところ、ご提示の式はG6セルから右方にフィルコピーしてあるものと推測します。
ですので、ご提示の式の代わりにG6セルに
 =INDEX(Sheet1!$G$14:$G$82,COLUMN(A1))
を入力して、右方にフィルコピーしても、同じ結果になるものと推測できます。
あくまでも、同じ形式に拘るのであれば、
 =INDEX(Sheet1!$G$14:$G$82,COLUMN()-6)
でしょうか。
もしも、スピル機能のある環境をご使で利用あれば、G6セルに
 =TRANSPOSE(Sheet1!G$14:$G$82)
を入力するだけで、自動で右方にスピルされます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
長い式は理解しにくいので、簡単な式をご紹介頂き大変助かります。

回答に書かれているように、縦方向に記入されている数値を行方向にコピーする、という式のようです。

transpose 関数、使ってみたいと思います。

お礼日時:2023/02/03 21:25

No.2の回答者です。


式を見ただけで理解できたわけではないですよ。

私もExcelの勉強中なので、式を分解して動作確認しているときに
行列の入れ替えのようだと思っただけです。
そこで、検索したら以下のようなサイトがあったので、回答をする
ときの参考にしただけなので。
https://excel-design-dr.com/excel-row-column-tra …
https://excel-ubara.com/excel3/EXCEL008.html
https://qiita.com/11295/items/93af4296fe2b292f7125

スピル関係も最近知っただけで、そのときにブックマークとして
幾つかのサイトをメモしてあっただけですから。

マクロについても、慌てずに少しずつ勉強していけば、独学でも
簡単なものなら理解できるようになりますよ。
(私も10年ぐらいかけて、やっと最近回答できるようになった)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
マクロ、独学で勉強なんてすごすぎます。。。

式については、まず分解して動作確認が必要なのですね。
私は自分が理解出来ない式が出てきた時点でパニックになってしまい。。。

度々の回答ありがとうございました。

お礼日時:2023/02/03 21:20

@は[暗黙的な交差演算子]でスピルさせないためのものです。


https://excel-ubara.com/excel1/EXCEL628.html
https://support.microsoft.com/ja-jp/office/%E6%9 …
INDEX関数での配列をスピルさせないために、Excelが設定して
くれたものですね。

INDEX関数の引数部分ですが、行列入れ替えをしているだけで
難しいことはしていません。TRANSPOSEでの配列数式と同じで
範囲を限定しているだけのようですね。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/kansu …
使われている範囲は、6行目でG列から右方向になっています。
G6セルから開始して、G$14:$G$82の範囲にあるデータを右へと
行列入れ替えをして表示するものです。
{=TRANSPOSE(G$14:$G$82)}と同じ動作をしています。

CELL関数を使って行番号と列番号を取得し、G$14:$G$82での
範囲から、何番目にあるデータなのかを指定しています。
G6から開始させるためのようですが、何故にこれを使っている
のかはわかりません。
古いExcelのバージョンで使う意味があったのかな?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
まさしく、縦に入力されていたデータ(例えばA1:A3)を行に入力(B1:D1)する式でした。

何故それが理解出来たのでしょうか。。。私の能力では理解出来ませんでした。

スピルについて、初めて知りました。大変勉強になりました。

お礼日時:2023/02/03 19:51

このExcel式はsheet1上の$G$14から$G$82にある配列から、sheet2上の$G$6からの相对的な列数と行数に基づいて値を返すものです。



具体的には、column()関数で現在の列番号を取得し、そこから@cell("col",sheet2!$G$6)でsheet2上の$G$6のセルの列番号を取得し、その両者の差を計算することで、相对的な列番号を求めます。同様に、row()関数で現在の行番号を取得し、そこから@cell("row",sheet2!$G$6)でsheet2上の$G$6のセルの行番号を取得し、その両者の差を計算することで、相对的な行番号を求めます。最後に、これらの行番号と列番号を使ってindex()関数で値を取得することで、結果を返します。

「@」は、Volatile関数と呼ばれるもので、このような関数を使っていると、変更されたいかなるセルの値にも影響を受けるということを意味します。つまり、この式が含まれているセルの値が常に更新されているということです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

大変勉強になりました。

お礼日時:2023/02/03 19:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!