[[20041224184538]] 『行挿入時、セルに入力した式の参照がずれる』(ご近所PG) ページの最後に飛ぶ

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

 

『行挿入時、セルに入力した式の参照がずれる』(ご近所PG)
 お世話になってます。
今回、マクロを使ってはならないシステムがあり悩んでいます。
質問にいたるまでの経緯は長いですが、質問はシンプルです…概要すっとばし可。
 
概要:
作成したテンプレートのExcelファイルを先方に渡し、編集していただく。
そして編集後のシートを受け取り、アプリで取り込む。
この時の取り込み方法として、ODBC経由でデータを読むという手法をとっています。
(そのアプリが動作するマシンにはExcelをインストールしてはいけない決まり…)
ですが、ODBC経由で読み込んだデータの中に、
確かにセルの値は入っているのにもかかわらず、
どういうわけか空欄で取得されるという現象が発生。
 
さまざまなテストデータから判明した事として、どうやら
同じ列に「文字列」と「数値」が混在していたりすると、
型を特定できない為?なのか、不正と判断された物がNull扱いで取得される様子。
要は型が混在していると問題あり。(おそらく)
 
 
これの回避方法として、以下のように考えました。
 
型が混在している事が問題なら、全ての型が一致していれば良いだろう。
なら、全てを文字列化したシートがあれば良い。
Sheet1を編集用シートとし、
Sheet2にはSheet1のデータを引っ張って来て、文字列化する式を埋め込んでおく。
ODBCからはSheet2のデータを読み込む形とする。
 
という事で以下のようなシートを用意しました。
 
Sheet1の内容
  A              B
1 TEST           DATA
2 123            456
3 
 :
 
Sheet2の内容
  A              B
1 =""&Sheet1!A1  =""&Sheet1!B1
2 =""&Sheet1!A2  =""&Sheet1!B2
3 =""&Sheet1!A3  =""&Sheet1!B3
 :
 
こうした場合に以下の問題が生じました。(ここらへんから本題)
「Sheet1に対して行挿入を行うと、Sheet2の式が変化する」
すなわち、
 
Sheet1の内容
  A              B
1 TEST           DATA
2 挿入した行     挿入した行
3 123            456
 :
 
Sheet2の内容
  A              B
1 =""&Sheet1!A1  =""&Sheet1!B1
2 =""&Sheet1!A3  =""&Sheet1!B3   ←ここより下の数式で、勝手に参照セルが変わる
3 =""&Sheet1!A4  =""&Sheet1!B4
 :
 
試しにSheet2の式を絶対参照にするなど試してみましたが、やはりずれます。
で、ようやく…
質問:
こういった式のズレを回避する方法、設定はあるのでしょうか。
 
よろしくお願い致します。
環境:WindowsXP,Excel2002
 
ちなみに…
もしODBC経由でExcelファイルを読み込んだ際、同じ現象に遭遇した事がある、
あるいは参考となりそうな情報をお持ちの方が居ましたら、ご教授願えれば幸いです。
(こっちに回答があればなとちょびっと期待して長々と書きました…笑)


 ご希望では無い方の回答ですが・・・(^_^A;
 このようなことでしょうか。
 Sheet2のA1 =""&OFFSET(Sheet1!$A$1,ROW()-1,COLUMN()-1)
 (川野鮎太郎)

 あまりスマートとはいえませんが、
 たとえばSheet2のE列に  Sheet1!A1
               Sheet1!A2
 と入れておいて、A1には
 =" "&INDIRECT(E1)
 では?
 (sato)

 早速のご回答ありがとうございます。
 
川野さん
おぉ…成る程…目から鱗が…
これなら確かにずれませんね。
OFFSETが使えないかなとまではたどり着いたのですが、
ROW、COLUMNを利用する事に思い至らず…3時間くらい試行錯誤してたのですが(笑)
いやはやExcelは奥が深いです。
 
satoさん
その方法でも行けました。
実は一応INDIRECTについても検討したのですが、
作業枠無しに、式だけでうまく表現できればと思っていました。
本来、1シートで済ませたい所を苦肉の策として2シートにしている手前、
セル位置を示す情報を持つとさらにデータが重くなるという懸念もありまして…
(でも数式が長いと、やっぱり重くなるかな…どっちが軽いんだろう。
 って、範囲次第かな…)
また、セル範囲も可変の可能性があるので、
その場合の変更箇所は少ない方が好ましいという面もありました。
 
今回は川野さん提示の式に置き換えて作成してみます。
(ご近所PG)しかしこう反応が早いと、うれしいものですねぇ

 追記。補足情報。
=""&OFFSET(Sheet1!$A$1,ROW()-1,COLUMN()-1)
は、A1がずれるような行、列挿入があると結局ずれてしまう点に留意。
今回は1行目は変更無し(タイトル行のため)
および列は増やさない決まり、なので今回の処理的には問題なかったです。
その点で、INDIRECTを用いた方法ならずれようが無いので、有用かも。
(ご近所PG)


 おはようございます。
 >A1がずれるような行、列挿入があると結局ずれてしまう
 そうなんですよね、列方向に式のコピーが出来ないから、OFFSET関数にしたんですけど、
 面倒でなければ =""&INDIRECT("Sheet1!A"&ROW()) でも良いかもです。

 (川野鮎太郎)

 A〜Z列までなら、以下の式のコピーでできます。
 =""&INDIRECT("Sheet1!"&CHAR(64+COLUMN())&ROW())
 AA〜AZ列なら、
 =""&INDIRECT("Sheet1!A"&CHAR(38+COLUMN())&ROW())
 (ちゅうねん)

 追加:
 > セル位置を示す情報を持つとさらにデータが重くなるという懸念もありまして…
 以下は、確かめたわけではありませんので「無責任発言」です。
 単なる参照に比べ、(種類にもよりますが)計算があると重いように想像します。
 各セルで、COLUMN() や ROW() を計算するのは冗長なので、どこかの行と列(非表示に
 しても可)に、A,B,C…、1,2,3…、と入力しておいて、それを参照する方が軽いかも
 知れません。
 > 作業枠無しに、式だけでうまく表現できればと思っていました。
 には反しますが…。
 (ちゅうねん)

 おはようございます。今年も最後の週ですね。
 
川野さん
ちゅうねんさん
更なる方法を提示いただき感謝です。

 >面倒でなければ =""&INDIRECT("Sheet1!A"&ROW()) でも良いかもです。
 >=""&INDIRECT("Sheet1!"&CHAR(64+COLUMN())&ROW())
なるほど、INDIRECTは用は文字列によるセル表記を元に探すのだから
セルに入っている文字列でなくても良い道理ですね。気付かなかった。
更にCHARを組み合わせるとは…
どうにもまだ私は頭が固いというか、ワークシート関数を使いこなせないというか。
A1がらみでのズレが問題になりそうな場合の方法として、提示してみる事にします。

 >単なる参照に比べ、(種類にもよりますが)計算があると重いように想像します。
 >各セルで、COLUMN() や ROW() を計算するのは冗長なので、どこかの行と列(非表示に
 >しても可)に、A,B,C…、1,2,3…、と入力しておいて、それを参照する方が軽いかも
 >知れません。
一応、前回のOFFSETを用いた方法で試してもらってますが、
特に「入力が重い」という問題は連絡を受けていませんので、心配は現在無さそうです。
(ちなみにアプリ側での制限のため、行は最大6500行、列は固定でR列までとなっているようです)
これは近年のPC性能に感謝ですかね。
でも先方のPCが古い場合もあるかな…一度古いPCで試して見ます。
 
一つ補足。
今回懸念していた「重い」という表現は、
シート入力時の動作に関するものではなく「ファイルサイズ」に関しての懸念でした。
そういう意味で作業枠を用意するとサイズが大きくなる、という話でした。
そのファイルをネットワーク上でやり取りすることになるので、
「ファイルサイズが大きい」=「ダウンロードが遅い」=「重い」という表現が
(事情を知ってる自分としては)自然だったもので…失礼。
どっちとも取れる表現で紛らわしかったですね。
(ご近所PG)

 蛇足ですが、
 >各セルで、COLUMN() や ROW() を計算するのは冗長なので、どこかの行と列(非表示に
 >しても可)に、A,B,C…、1,2,3…、と入力しておいて、それを参照する方が軽いかも
 >知れません。
 というのは、表の構成を
 	A	B	C
   1		Sheet1!A	Sheet1!B ←この行を作業に使う
   2	1			
   3	2			
     ↑
    この列を作業に使う

 とし、B2には =""&INDIRECT(B$1&$A2) を入力してこれを全体にコピーして作る
 (かつ、作業エリアは非表示)という意図です。

 >シート入力時の動作に関するものではなく「ファイルサイズ」に関しての懸念でした。
 とのことですが、作業エリアは1行と1列だけなので、ファイルサイズもさほど大きく
 ならないでしょうし、なるべく計算を省くことで動作が軽快にできると思います。
 何より式が単純で他人にも分かりやすいでしょう。 
 「Sheet1」の部分はどこかのセルを参照するようにすれば、シート名が変わる場合でも
 対応できます。
 (ちゅうねん)

 なるほど、面白いですね。こういう形の作業枠とは想像していませんでした。
応用が利きそう…覚えておこう。
A1にシート名を記載する形なら、見た目も綺麗で解りやすいですね。
(ご近所PG)

コメント返信:

[ 一覧(最新更新順) ]


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