[[20161227180631]] 『コピーしたシートの共通の場所の数値を参照する』(ぽんた) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『コピーしたシートの共通の場所の数値を参照する』(ぽんた)

お尋ねします。
「H29」というシートがあります。
次の年は、この「H29」シートをコピーして「H30」というシートを作成します。
さらに次の年は、この「H30」シートをコピーして「H31」というシートを作成します。
以降、同様の操作をしてシートを作成していきます。
その際、各シート共通の場所「BA12」と「BD12」に数値が入っているのですが、
この数値をコピーしたシートの年の「BA13」「BD13」に入るようにしたいのです。
説明が下手くそですみません。
例えば、「H29」をコピーして「H30」を作成した場合、「H30」の「BA13」に「H29」の「BA12」、
「BD13」に「BD12」の数値が自動で入るようにしたいのです。
自分でも色々と試みましたが、成し遂げられません。
知識の高い皆さんのお力をどうぞお貸しください。よろしくお願いします。

< 使用 Excel:Excel2016mac、使用 OS:Windows7 >


 Sub main()
    Dim sht1 As Worksheet, sht2 As Worksheet
    For Each sht1 In ThisWorkbook.Worksheets
        For Each sht2 In ThisWorkbook.Worksheets
            If sht2.Name = "H" & Val(Replace(sht1.Name, "H", "")) + 1 Then
                sht2.Range("BA13").Value = sht1.Range("BA12").Value
                sht2.Range("BD13").Value = sht1.Range("BD12").Value
                Exit For
            End If
        Next sht2
    Next sht1
 End Sub
(mm) 2016/12/27(火) 18:36

早速のご回答ありがとうございます。
BA13とBD13にはどのような数式が必要でしょうか?
(ぽんた) 2016/12/27(火) 20:22

 勘違いかもしれませんが

 BA13 : =INDIRECT("H"&SUBSTITUTE(RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1))),"H","")-1&"!BA12")

 BD13 : =INDIRECT("H"&SUBSTITUTE(RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1))),"H","")-1&"!BD12")

(β) 2016/12/27(火) 20:57


すごいです。この関数、よーく眺めましたがすごいです。
ありがとうございます。
(ぽんた) 2016/12/27(火) 21:11

おはようございます。
以前の関連の質問になります。

βさんにご教示頂いた以下の数式の "!BA12" この部分に数式を入れることは可能でしょうか?

=INDIRECT("H"&SUBSTITUTE(RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1))),"H","")-1&"!BA12")

これは、シートをコピーしても「特定の場所の値を特定の場所にもってくる」ということを実現してもらいました。
これをさらに発展させて、「特定の場所の値を計算して特定の場所にもってくる」という形にすることは可能でしょうか?
例えば、以下のような計算式を入れたいと思います。

=ROUND((BA12*8+BD12)/8,0) ←先日、ねむねむさんよりご教示頂いたものです。

実際に、"!BA12" 部分に上記計算式を入れ込んでやってみましたが、求める結果が出ず、「0」と表示されました。
どうぞよろしくお願いします。
(ぽんた) 2017/01/14(土) 07:28


 よくわからないのですが・・・

 現在は、たとえば H30 というシート上の数式は =H29!BA12 といったものになりますね。
 (実際には INDIRECT で、その文字列を参照しているわけですが)

 この BA12 の部分を どうしたいのですか?

 =ROUND((BA12*8+BD12)/8,0)

 この結果は数値でしょうから、これを そのまま 反映させるとしたら =H29!123 といったものになりますよね?
 これっておかしいですね。

 H29!BA12 の、どの部分を 計算結果によるものにしたいのですか? 12 の部分ですか?

(β) 2017/01/14(土) 07:38


βさん、おはようございます。
早速のご回答ありがとうございます。

質問しておきながら、βさんの質問にうまく答えられない(表現しきれてない)かもしれませんが、
おっしゃるとおり、12 の部分を計算結果としたのですが・・・

 =ROUND((BA12*8+BD12)/8,0)

よろしくお願いします。
余談ですが、今日はとても寒いですね。
(ぽんた) 2017/01/14(土) 07:46


 H30の数式だとして、この =ROUND((BA12*8+BD12)/8,0) の BA12 や BD12 は H29 のセルですか? H30 のセルですか?

 βは 関数が苦手なので、面倒だなぁという予感がします。
 シートの未使用のセルに 当月シート名や前月シート名を表示する数式をいれておいて BA13 や BD13 では
 そこを参照する数式にするほうが、コンパクトになると思っています。

 いずれにしても 回答お願いします。

(β) 2017/01/14(土) 07:52


βさんがおっしゃるとおり、
この数式 =ROUND((BA12*8+BD12)/8,0) の BA12 や BD12 は H29 のセルです!
よろしくお願いします。
(ぽんた) 2017/01/14(土) 07:55

 未使用のセル、たとえば XX1 に

 ="H"&SUBSTITUTE(RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1))),"H","")-1

 といれておきます。シートが H30 であれば、ここは H29 になるはずです。

 また XX2 に

 =ROUND((INDIRECT(XX1&"!BA12")*8+INDIRECT(XX1&"!BD12"))/8,0)

 といれておきます。H29の関連セルの計算結果が出るはずです。

 で、 BA13 : =INDIRECT(XX1&"!BA"&XX2)

 こんなようにすると、たぶん結果が出ると思います。

 ★関数素人ですので、専門家さんだったら、もっとスマートな数式が提示できるんだろうと思いますが。

(β) 2017/01/14(土) 10:21


すごい!できました!

βさん、ありがとうございます。

感謝感謝です。
(ぽんた) 2017/01/14(土) 10:53


先日ご教示頂いた内容について、質問です。
シートをコピーした際、コピー元シートの特定の場所の数値をコピーしたシートの特定の場所に参照するという関数を実現させていただきました。具体的な数式は以下のとおりです。

=INDIRECT("H"&SUBSTITUTE(RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1))),"H","")-1&"!W6")

上記数式を、コピーしたシートのB2の数値を参照させて、その結果次第では以下の関数の結果を出したいと思います。

=VLOOKUP(DATEDIF(M2,DATE(B5,1,1),"M"),{0,0;6,10;18,11;30,12;42,14;54,16;66,18;78,20},2)

コピー元シートのB2セルには西暦を入力しています。例えば、「2015」です。ここも当然、コピーしたシートに引き継がせて、「2016」となります。この「2016」と入ったB2セルを手入力で「2017」と入力したら、コピー元のB2セルから連続していないため、

=VLOOKUP(DATEDIF(M2,DATE(B5,1,1),"M"),{0,0;6,10;18,11;30,12;42,14;54,16;66,18;78,20},2)

この式での結果を出したいのです。IF関数でやってみましたが、だめでした。

どうぞよろしくお願いいたします。
(ぽんた) 2017/01/23(月) 14:27


こんにちは。

M2セルには何のデータが入っているんですか?たぶん日付だとは思うんですが。
B2セルを参照するとのことですが、VLOOKUPの式を見るとB5セルをを参照しているのでしょうか。

エラーになっているのか、数字がおかしいのか、細かく記載された方が皆様も分かりやすいかと思います。

エラーになっているのでしたら、VLOOKUPの範囲がおかしいのではないかと。
M2セルの日付よりもB2(B5?)セルの日付の方が古い など。
(pooh) 2017/01/23(月) 16:56


 シート名が "H"の2桁年のみなら、 こんなのでいいんじゃないですか?

 =IF(INDIRECT("H"&RIGHT(CELL("filename",A1),2)-1&"!B2")+1=B2,INDIRECT("H"&RIGHT(CELL("filename",A1),2)-1&"!W6"),VLOOKUP(DATEDIF(M2,DATE(B5,1,1),"M"),{0,0;6,10;18,11;30,12;42,14;54,16;66,18;78,20},2))

 ※平成も先が見えて来ているので、事務の継続性からすると、全て西暦ベースでやるのが無難だと思いますけど・・

(半平太) 2017/01/24(火) 22:48


半平太さん、ありがとうございます!
仮に西暦ベースに修正するとなると、どう変更すれば良いでしょうか?
よろしくお願いします。
(ぽんた) 2017/01/24(火) 22:55

おはようございます。
スゴイです!見事に思う結果を得ることができました。
ありがとうございます。

半平太さん、昨日言っていただいているように、これを西暦ベースとするとなると、どのような修正が必要になりますか?
それと、仮に年号がH→Мになったとしたら、、、
H部分をМに変更すればよいということでしょうか?

併せてご教授ねがいます。

=IF(INDIRECT("M"&RIGHT(CELL("filename",A1),2)-1&"!B2")+1=B2,INDIRECT("M"&RIGHT(CELL("filename",A1),2)-1&"!W6"),VLOOKUP(DATEDIF(M2,DATE(B5,1,1),"M"),{0,0;6,10;18,11;30,12;42,14;54,16;66,18;78,20},2))

(ぽんた) 2017/01/25(水) 07:46


 シート名の算出のとこだけ

 =TEXT((REPLACE(CELL("filename",A1),1,FIND("]",CELL("filename",A1)),)&-1&-1)-1,"ge")

 ※年数 1桁も考慮。
 ※Excelが新元号に対応することが前提w
 
(GobGob) 2017/01/25(水) 08:34 → 08:47 加筆

 > "H"&RIGHT(CELL("filename",A1),2)-1
         ↑
 多分、数式の意味が分かっていないと思うのですが、やっていることは単純です。

 例:H30の前年のシート名を求めるには、
   右2桁を切り取って1を引く(29となる)、その頭を"H"にする。

 平成が終わって、M元年になったらその前年をどう求めますか?
 ご自身でロジックを考えてみてください。

 もし、シート名が西暦なら、右4桁を切り取って1を引くだけで完了です。
 頭に何かつける必要もなく、シンプルです。

(半平太) 2017/01/25(水) 08:37


半平太さんからの課題を考えてみました。
仮にМ年になった場合は、単純に今のHをМに変えてあげればよいですよね?
ただ、元年となると・・・導きだせませんでした。
また、シート名を現在はH何年としていますが、これを西暦にする方法もご教授頂いていますが、
右四桁というのは、"H"&のことですか?

仮に西暦にする場合、B2に入力した西暦をそのままシート名として自動化させたいという新たな質問がわいてきました。シートをコピーするとB2を参照して、それがそのままシート名としたいのです。

色々と聞いて申し訳ありません。
どうぞよろしくお願いします。
(ぽんた) 2017/01/26(木) 07:28


 >仮にМ年になった場合は、単純に今のHをМに変えてあげればよいですよね? 
 それは、M年の2年以降の話です。
 たとえM2年以降だとしても、M9年までは1桁の切り取りですよね。

 するとM年に入ったら、1桁なのか2桁なのか判定しなければならないです。

 勿論この問題はM02年と2桁で入れるルールにすれば何とか解決します。

 でも、元年場合、たとえM01と入れたとしても、
 Hの最終年度が分からなければ、数式は作れないです。

 ※GobGobさんからどんな元号でも対応できる原案が提示されていますが、
  和暦元号を利用すると面倒なことには変わりないです。

 西暦なら、4桁処理の決め打ちでずーっと(多分人類が消滅するまで)使えます。

 >また、シート名を現在はH何年としていますが、これを西暦にする方法もご教授頂いていますが、 
 >右四桁というのは、"H"&のことですか?

 >=CELL("filename",A1)
   ↑
 この関数の意味が分かっていないのかも知れないですね。

 (保存済のブックで)その数式を入れてみればすぐ分かりますが
 こんな文字列が返って来ます。
  ↓
 C:\Users\ユーザー名\Documents\[ぽんた.xlsx]2018
                      ~~↑~~
                      シート名

 ですから、その右4桁を切り取れば、そのままその年度(=シート名)が分かります。
      つまり、 =RIGHT(CELL("filename",A1),4)*1 とすればいいです。「*1」は数値化の為。
 前年を求めたいなら =RIGHT(CELL("filename",A1),4)-1 とすればいいです。

(半平太) 2017/01/26(木) 08:54


24日にご教授いただいた以下の数式から、右4桁を切り取る場合は、以下のような修正でよいでしょうか?

(修正前)
=IF(INDIRECT("H"&RIGHT(CELL("filename",A1),2)-1&"!B2")+1=B2,INDIRECT("H"&RIGHT(CELL("filename",A1),2)-1&"!W6"),VLOOKUP(DATEDIF(M2,DATE(B5,1,1),"M"),{0,0;6,10;18,11;30,12;42,14;54,16;66,18;78,20},2))

(修正後)
=IF(INDIRECT(RIGHT(CELL("filename",A1),4)*1-1&"!B2")+1=B2,INDIRECT(RIGHT(CELL("filename",A1),4)*1-1&"!W6"),VLOOKUP(DATEDIF(M2,DATE(B5,1,1),"M"),{0,0;6,10;18,11;30,12;42,14;54,16;66,18;78,20},2))

ご指導よろしくお願いします。

それから、シートをコピーした時点でシートの名前を自動で変更するマクロは可能でしょうか?
例えば、「H29」をコピーすると「H29(2)」となってしまいます。これをB2セルを参照させて、自動でシートの名前を変更させたいのです。

併せて、ご指導ください。
(ぽんた) 2017/01/29(日) 10:19


 飛び入りです。

 その後、スレの経緯には、詳しく目を通していないのですが、なんだか、ますます 複雑怪異になってきていますねぇ。

 一度、今までのことは忘れ、H29 から H30 を作成するとき、H29 の何を、どう判定して、H30のどこに反映させたいかということを
 整理して、文章で箇条書きにされてはいかがですか。

 今回、H29からH30をコピーするところをマクロでやるということを考えておられるなら、その時に
 今、四苦八苦して関数で(無理やり)処理しているところも、そのマクロ内で実行すれば、なんということがない
 すっきりした単純なコードですべてが実現できると思いますよ。

(β) 2017/01/29(日) 10:51


 βさんのコメントの通りです。

 いまや CELL("filename",A1) なんてものは不要化して来ている状況ではないかと考えます。

 B2セルがどんな性質の年度なのか、こちらでは推測の域を出ません。 
 全体像そっちのけで、部分的対策を云々出来る状況ではなくなったと感じます。

 どんな帳票で、どんな事を実現したいのか、その全体像が示されれば
 もっとスマートな解決策が提示される可能性が高いです。

 多分、βさん達の面倒見のいい回答者にガイドして貰えると思います。 

 私は仕様が不明瞭な質問は苦手なので、ここで降ります。

(半平太) 2017/01/29(日) 11:30


 シートをコピーするのは年1回なんですよね?もしそうならわざわざマクロ使わなくても手動で直せばいいと思いますが。
(bi) 2017/01/30(月) 13:35

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.