advanced help
per page, with , order by , clip by
Results of 1 - 1 of about 37655 for IF (0.008 sec.)
[[20041031102648]]
#score: 1592
@digest: d2a3f8d51016eaead9ccf5c19320599b
@id: 9798
@mdate: 2004-11-04T09:53:44Z
@size: 32494
@type: text/plain
#keywords: cu81 (229187), ce81 (183939), cu80 (108202), ce80 (76896), myrows (58258), ce78 (52072), di81 (50494), dh81 (50494), dj81 (50494), myselect (50279), ce70 (48350), ce79 (48350), b81 (41896), b78 (39108), keisan (24425), 照セ (13419), offset (13007), ン) (9926), ーチ (7879), myrow (7228), チャ (6588), lastrow (6521), 削除 (5992), vbcrlf (5758), myrange (5676), 挿入 (5564), ャン (5472), soulman (5252), destination (4395), 川野 (4245), 野鮎 (4190), elseif (4056)
『列を挿入及び削除した場合に参照セルを移動』(ツーチャン)
[列及び行を挿入及び削除した場合に参照セルをその分移動する方法] お世話になります。 A B C A B C 1 (1) 1 2 (2) 2 3 3 この行を挿入 4 (3) 4 (4) 5 上記のように(2)行目と(3)行目の間に行を挿入した場合 (A:4)のセルに「=A1」としている場合は(A:4)のセルは「=A2」となるように設定する 方法を教えてください。 offset関数を使用すれば可能ですが、カッコが使用可能範囲を超えてしまいます。 削除した場合も同様 よろしくお願いいたします。 Excel2002 WindowsXP ---- 質問が理解できません(^^;) “OFFSET関数を使用して可能”な式と “カッコが使用可能範囲を超えてしまう”式を 提示してみたらいかがでしょうか? (Hatch) ----- (Hatch)さんre有り難うございます。 一つのセルに [=IF(OR(R81="YOKO",R81="L"),IF(CU81=B81,E81,IF(CU81=B80,E80,IF(CU81=B79,E79,IF (CU81=B78,E78,0)))),IF(CE81="SITA",IF(CU81=B81,G81,IF(CU81=B80,G80,IF (CU81=B79,G79,IF(CU81=B78,G78,IF(CU81=B77,G77,IF(CU81=B76,G76,0))))))*IF(AND (CE81=CE80,CE81=CE79,CE78=0),IF(AND(DH81>0,DI81>0),3/4,IF(OR(AND (DI81>0,DJ81>0),AND(DH81>0,DJ81>0)),1/2,IF(AND(DC81>0,DD81>0),3/4,1/4))),IF(AND (CE81=CE80,CE81=CE79,CE81=CE78,CE77=0),IF(OR(DH81=0,DI81=0,DJ81=0),1/4,1/2),IF (AND(CE81=CE80,CE81=CE79,CE81=CE78,CE81=CE77,CE76=0),1/4,0))),0))] のような関数を使用しています。カッコ計算が7重以上は計算不能(エクセル)になるため この中にoffset関数を使用することが出来ません。 はじめの例でオフセット関数を使用した場合は [=OFFSET(A4,-3,0)] となります。 (ツーチャン) ---- うわぁ〜複雑すぎる 思考回路が停止・・・(>_<) なんとなくですが、行を挿入するセルより上のセルは絶対参照 挿入行より下は相対参照にするということでしょうか? ところで、セルの挿入や削除は頻繁に発生するのでしょうか? 表のデザイン変更?のため今回だけで済むのでしょうか? # 数式も表引きのような感じなので他の書き方があるかも・・・ (Hatch) ------ わぁお(゚o゚)!! 目がくらくらする様な式ですねぇ(^^;; ヒヤアセ そのもの凄い式は全然、解読しておりませんが、最初のご質問に限って コメントします。 =ADDRESS(ROW()-3,1,4) で、どうでしょう?? v(=∩_∩=)v (SoulMan) 今日は、朝からトラブッたびぃ ---- (Hatch)(SoulMan)さんお世話になります 60行目より下部行は行単位でコピー(挿入)及び削除コマンドを使っております。 削除及び挿入による分だけ相対参照セルが移動出来るようにシート全体を設定 することはその設定が可能であればOKです。 マクロを組んで出来ればと考えますが当方まくろを組む能力が皆無です。 シート全体で時には10Mbを越える場合がありますのであまり重たくは出来ません。 よろしくお願いいたします。 (ツーチャン) ---- 数式の解析は・・・途中でGive Upしました(^^;) ところで、この数式はどのセルに入力されているのですか? そして、挿入・削除される行との位置関係がどうなっているのでしょうか? # まだ処理のイメージが掴めない (Hatch) ------ (Hatch)(SoulMan)さんお世話になります。 セルCO81です。 全体の一例として、上記セルの式内で[CU81=B78]がありますが76行を削除した 場合はこのセルはCO81からCO80になり式は[CU80=B78]になりますが、それを [CU80=B77]の式にする方法 CU81=B78をCU81=OFFSET(B81,-7,0)とすればよいのですが()が一重増えてしまい 計算不能になります。 60行より下部は行単位でコピー等をするので同じ式(行番号は移動)になります。 挿入、削除は61行より下部で行います。 (ツーチャン) -------- とても全部はみていません。 結局 CU81=B78 を CU81=OFFSET(CU81,-3,-97) に置換するだけじゃないんですかぁ??? ↓はその部分だけを置換した例です。 =IF(OR(R81="YOKO",R81="L"), IF(CU81=B81,E81,IF(CU81=B80,E80, IF(CU81=B79,E79,IF(CU81=OFFSET(CU81,-3,-97),E78,0)))), IF(CE81="SITA",IF(CU81=B81,G81,IF(CU81=B80,G80, IF(CU81=B79,G79,IF(CU81=OFFSET(CU81,-3,-97),G78, IF(CU81=B77,G77,IF(CU81=B76,G76,0))))))*IF(AND(CE81=CE80,CE81=CE79,CE78=0), IF(AND(DH81>0,DI81>0),3/4,IF(OR(AND(DI81>0,DJ81>0),AND(DH81>0,DJ81>0)),1/2, IF(AND(DC81>0,DD81>0),3/4,1/4))),IF(AND(CE81=CE80,CE81=CE79,CE81=CE78,CE77=0), IF(OR(DH81=0,DI81=0,DJ81=0),1/4,1/2), IF(AND(CE81=CE80,CE81=CE79,CE81=CE78,CE81=CE77,CE76=0),1/4,0))),0)) 追伸! 余計なお世話かもしれませんが、この様な場合は、式に名前をつける方法がいいです。 シンプルいずべすとぉ〜〜なぁ〜〜んちゃって(-_☆)きらりんこ http://arena.nikkeibp.co.jp/tec/excel/20040308/107594/ v(=∩_∩=)v (SoulMan) ------ (SoulMan)さんありがとうございます。 細かく記入していただき有り難うございます。 EXCELの能力範囲として「 () 」が7重を越えるとセルに入力出来ないように なっており、現状で()が7重でOFFSET関数を使用した場合は、一つ()が増えることに なりセルに入力不能になります。式に名前を付ける・・・は結局その他のセルに同じ 式を入力しなければならないのでは 式に名前を付けるがあるとは知りませんでした。勉強になりました。 又、このことで式を二つのセルを利用して一つのセルの()数を減らして出来ないかと 思い立ちました。その分重たくはなりますが一度挑戦してみます。 みなさん本当に有り難うございました。 (ツーチャン) ------- あっあぁ〜〜!!もう、見ていらっしゃらないかもしれないけど、 今の式で出来ているなら、出来ますよ?出来ると思いますよ? CU81=B78 を CU81=OFFSET(CU81,-3,-97) かえるもの置換ですぐに出来ますよ。 これは、条件だからTRUEが返ればいいんでしょ? 同じですよ。 シートに CU81=B78 としても CU81=OFFSET(CU81,-3,-97) としても Trueが返るでしょ?? 要はいつも CU81からみて左に97上に3の位置にあるセルを参照していて欲しいんじゃないの?? 条件が七つ以上になったら困るけど、別に条件は増えてませんよ? IF(Trueだたら、なになに、それ以外は何々)だから同じですよ。 ただ、 CU81=B78 を CU81=OFFSET(CU81,-3,-97) にすると式が長くなってみにくので、式に名前を付けてみては?と提案しただけです。 一度、OFFSETに位置関係を単独でシートに書き出しておいて(Trueが返ることを確認しておいて) 全体の式を選択した状態で、 編集→置換→CU81=B78→CU81=OFFSET(CU81,-3,-97) とすればどうですか?何か勘違いをされている様なので・・・ (SoulMan) ---- なかなか理解できないので、ご提示の数式を入力して、76行を削除してみました。 「CU81=B78」とは『IF(CU81=B78,E78,0))))』のところだと思いますが、削除後は『IF(CU80=B77,E77,0))))』 もう1箇所の『IF(CU81=B78,G78,』は削除後『IF(CU80=B77,G77,』となりました。 >[CU80=B78]になりますが、それを[CU80=B77]の式にする方法 CU80=B78とはならず、CU80=B77になっています。 ご提示の関係が再現できません。 そして、計算に関係した76行目のセル(B76,G76,CE76)が削除されたため『#REF!』 と3箇所ほど表示されました。 ↓削除後の数式です。 =IF(OR(R80="YOKO",R80="L"),IF(CU80=B80,E80,IF(CU80=B79,E79,IF(CU80=B78,E78, IF(CU80=B77,E77,0)))),IF(CE80="SITA",IF(CU80=B80,G80,IF(CU80=B79,G79,IF(CU80=B78,G78, IF(CU80=B77,G77,IF(CU80=B76,G76,IF(CU80=#REF!,#REF!,0))))))*IF(AND(CE80=CE79,CE80=CE78,CE77=0), IF(AND(DH80>0,DI80>0),3/4,IF(OR(AND(DI80>0,DJ80>0),AND(DH80>0,DJ80>0)),1/2, IF(AND(DC80>0,DD80>0),3/4,1/4))),IF(AND(CE80=CE79,CE80=CE78,CE80=CE77,CE76=0), IF(OR(DH80=0,DI80=0,DJ80=0),1/4,1/2),IF(AND(CE80=CE79,CE80=CE78,CE80=CE77,CE80=CE76,#REF!=0),1/4,0))),0)) 上記のように、こちらでは再現できませんでした。一応報告まで・・・(Hatch) ------ 私が思うに >76行を削除した は、 79行の間違いだと思いますよ。 最初から中間の値のことを気にしていらっしゃる様なので CU81=B78 79を削除 [CU80=B78] になるざんしょ? 要は中間の行を削除または追加してもある基点から一定の距離にあるセルを 参照していたいのではないでしょうか? どうかな??間違ってるかなぁ??? (SoulMan) ---- >CU81=B78 79を削除 [CU80=B78] なるほど・・・でも参照セルを削除するから『#REF!』が出てきますよ。 あっ、行の一部を削除かもね・・・ # おっと、前の投稿に大きな字が・・・意図したことでないので # 元に戻しておきます。(;^_^A (Hatch) ------- みなさんたくさんのRE有り難うございます。 ご指摘の通り書き込み間違いがありました。 つまり、式の中の CU81=B78 の場合 81行目と78行目の間の行を削除した場合です。 申し訳ありません。 (Hatch)さんが再現していただいたように参照している間にある行が削除した場合は #REF!及び式の中のセルの間(間隔)が違ってきます。 80行目を削除した場合は下記のようになります。 =IF(OR(R80="YOKO",R80="L"),IF(CU80=B80,E80,IF(CU80=#REF!,#REF!,IF (CU80=B79,E79,IF(CU80=B78,E78,0)))),IF(CE80="SITA",IF(CU80=B80,G80,IF (CU80=#REF!,#REF!,IF(CU80=B79,G79,IF(CU80=B78,G78,IF(CU80=B77,G77,IF (CU80=B76,G76,0))))))*IF(AND(CE80=#REF!,CE80=CE79,CE78=0),IF(AND (DH80>0,DI80>0),3/4,IF(OR(AND(DI80>0,DJ80>0),AND(DH80>0,DJ80>0)),1/2,IF(AND (DC80>0,DD80>0),3/4,1/4))),IF(AND(CE80=#REF!,CE80=CE79,CE80=CE78,CE77=0),IF(OR (DH80=0,DI80=0,DJ80=0),1/4,1/2),IF(AND (CE80=#REF!,CE80=CE79,CE80=CE78,CE80=CE77,CE76=0),1/4,0))),0)) 式中にOFFSETを入力しましたが下記の部分までは入力出来ますが8重カッコになる部分は 入力できません。 =IF(OR(R81="YOKO",R81="L"),IF(CU81=B81,E81,IF(CU81=OFFSET(B81,-1,0),OFFSET(E81 ,-1,0),IF(CU81=OFFSET(B81,-2,0),E79,IF(CU81=OFFSET(B81,-3,0),OFFSET(E81,- 3,0),0)))),IF(CE81="SITA",IF(CU81=B81,G81,IF(CU81=OFFSET(B81,-1,0),OFFSET(G81 ,-1,0),IF(CU81=OFFSET(B81,-2,0),OFFSET(G81,-2,0),IF(CU81=OFFSET(B81,-3,0),OFFSET (G81,-3,0),IF(CU81=OFFSET(B81,-4,0),OFFSET(G81,-4,0),IF(CU81=B76,G76,0))))))*IF (AND(CE81=CE80,CE81=CE79,CE78=0),IF(AND(DH81>0,DI81>0),3/4,IF(OR(AND (DI81>0,DJ81>0),AND(DH81>0,DJ81>0)),1/2,IF(AND(DC81>0,DD81>0),3/4,1/4))),IF(AND (CE81=CE80,CE81=CE79,CE81=CE78,CE77=0),IF(OR(DH81=0,DI81=0,DJ81=0),1/4,1/2),IF (AND(CE81=CE80,CE81=CE79,CE81=CE78,CE81=CE77,CE76=0),1/4,0))),0)) (ツーチャン) ------- あのぅ、、私は、全然試していませんし、ぱっとしかみてませんが、、 何をどう置換したんですか? 置換するだけなら、IFのネクストも増えないと思うんだけど、、 まぁ、それより以前になぜ削除とか追加をされるのかわかりませんが、、、 もう少し式を見やすくするとか作業列を使うとか、、 愚痴に聞こえたら、ごめんなさい。 一応ご参考程度にどうぞ =IF(OR(R81="YOKO",R81="L"), IF(条件1,え81,IF(条件2,え80, IF(条件3,え79,IF(最初に置換した式,え78,0)))), IF(条件14,IF(条件1,じ81,IF(条件2,じ80, IF(条件3,じ79,IF(最初に置換した式,じ78, IF(条件4,じ77,IF(条件5,じ76,0))))))*IF(AND(条件6,条件7,条件16), IF(あんど1,3/4,IF(OR(あんど2,あんど3),1/2, IF(あんど4,3/4,1/4))),IF(AND(条件6,条件7,条件8,条件15), IF(OR(条件10,条件12,条件13),1/4,1/2), IF(AND(条件6,条件7,条件8,条件9,条件17),1/4,0))),0)) >でも参照セルを削除するから『#REF!』が出てきますよ。 極端な話、全部一つの基点からOFFSETで参照すれば、お望みの形になるのかな? 例えばB1を基点とするとB1以外は全てB1からの位置関係で記述するとかぁ、、、 =C1 は =OFFSET(B1,0,1) とかぁ、、、 あまり現実的じゃないような気もしますね。 追伸!くどいようですが、私は、ぱっとしか見ていません。 (SoulMan) ぱっと見ただけでは失礼かな?と思ってじっくりみました、、 でも、、わかりませんでしたぁ。。(^^;; ヒヤアセ CO81を基点にして81行をすべてセットして行だけをOffsetで参照しようとしました。 で、結局、よく考えてみると、あの長い式で出る答えは一つ?なんですね?? 何かと何かを掛けてる様だけど、よくわからないのでベタベタのべたで書き出してみました。 まぁ、、とりあえずということで、、 追伸!!もう、みてらっしゃらないかな??(・・;) (SoulMan) Sub てすと() Dim R81 As Range, CU81 As Range, B81 As Range, G81 As Range, E81 As Range Dim CE81 As Range, DC81 As Range, DD81 As Range, DH81 As Range, DI81 As Range, DJ81 As Range Dim MyStrA As Variant, MyStrB As Variant, MyStrC As Variant, MyStrD As Variant Const Main = "CO81" With Worksheets("Sheet1").Range(Main) Set B81 = .Offset(, -91) Set E81 = .Offset(, -88) Set G81 = .Offset(, -86) Set R81 = .Offset(, -75) Set CE81 = .Offset(, -10) Set CU81 = .Offset(, 6) Set DC81 = .Offset(, 14) Set DD81 = .Offset(, 15) Set DH81 = .Offset(, 19) Set DI81 = .Offset(, 20) Set DJ81 = .Offset(, 21) End With Select Case R81.Value Case "YOKO", "L" If CU81.Value = B81.Value Then MyStrA = E81.Value ElseIf CU81.Value = B81.Offset(-1).Value Then MyStrA = E81.Offset(-1).Value ElseIf CU81.Value = B81.Offset(-2).Value Then MyStrA = E81.Offset(-2).Value ElseIf CU81.Value = B81.Offset(-3).Value Then MyStrA = E81.Offset(-3).Value End If End Select Select Case CE81.Value Case "SITA" If CU81.Value = B81.Value Then MyStrB = G81.Value ElseIf CU81.Value = B81.Offset(-1).Value Then MyStrB = G81.Offset(-1).Value ElseIf CU81.Value = B81.Offset(-2).Value Then MyStrB = G81.Offset(-2).Value ElseIf CU81.Value = B81.Offset(-3).Value Then MyStrB = G81.Offset(-3).Value ElseIf CU81.Value = B81.Offset(-4).Value Then MyStrB = G81.Offset(-4).Value ElseIf CU81.Value = B81.Offset(-5).Value Then MyStrB = G81.Offset(-5).Value End If End Select If CE81.Value = CE81.Offset(-1).Value And _ CE81.Value = CE81.Offset(-2).Value And _ CE81.Offset(-3).Value = 0 Then If DH81.Value > 0 And DI81.Value > 0 Then MyStrC = 3 / 4 Else If (DI81.Value > 0 And DJ81.Value > 0) Or (DH81.Value > 0 And DJ81.Value > 0) Then MyStrC = 1 / 2 If DC81 > 0 And DD81 > 0 Then MyStrC = 3 / 4 Else MyStrC = 1 / 4 End If End If End If End If If CE81.Value = CE81.Offset(-1).Value And _ CE81.Value = CE81.Offset(-2).Value And _ CE81.Value = CE81.Offset(-3).Value And _ CE81.Offset(-4).Value = 0 Then If DH81.Value = 0 Or DI81.Value = 0 Or DJ81.Value = 0 Then MyStrD = 1 / 4 Else MyStrD = 1 / 2 End If Else If CE81.Value = CE81.Offset(-1).Value And _ CE81.Value = CE81.Offset(-2).Value And _ CE81.Value = CE81.Offset(-3).Value And _ CE81.Value = CE81.Offset(-4).Value And _ CE81.Offset(-5).Value = 0 Then MyStrD = 1 / 4 Else MyStrD = 0 End If End If MsgBox MyStrA & vbCr & _ MyStrB & vbCr & _ MyStrC & vbCr & _ MyStrD Set B81 = Nothing Set E81 = Nothing Set G81 = Nothing Set R81 = Nothing Set CE81 = Nothing Set CU81 = Nothing Set DC81 = Nothing Set DD81 = Nothing Set DH81 = Nothing Set DI81 = Nothing Set DJ81 = Nothing End Sub http://ryusendo.no-ip.com/cgi-bin/upload/src/up0124.xls ---- ワークシートに数式を入れて、行の削除や挿入に対応して 参照セルが変化するのを コントロールするのは難しいのでは?・・・という気がしてきました。(^^;) ここで、さじを投げるのも失礼かと思い・・・ない知恵を振り絞った結果 ユーザー定義関数で逃げられないかと考えたのですが、いかがなものなんでしょう? ユーザー定義関数でのセル参照の書き方はこれでいいのか分かりませんし、 IF文の使い方も自信がない・・・取りあえず、提案ということで・・・ また、ご提示の数式をそのまま置き換えることや完全に移管する根気がありませんので 数式の前半部分を適当なセル位置に置き換えたサンプルとしています。 # 私のはあくまでも例で、提示された数式・セル位置には対応していません(>_<) シート容量が大きいらしいので、再計算の影響とか、シートの数式を書き換えることに なるのでかえって面倒になるかもしれませんので、熟考の上で実行された方がよろしいかと・・・ サンプルは例によって↓へUpしておきます。ファイル名はuser_kansu.xlsです。 (Hatch) http://www.geocities.jp/hatch4700/index.html Function keisan(r As Range) Application.Volatile If r.Offset(, -2).Value = "YOKO" Or r.Offset(, -2).Value = "L" Then If r.Offset(, -1).Value = r.Offset(, -5).Value Then keisan = r.Offset(, -4).Value If r.Offset(, -1).Value = r.Offset(-1, -5).Value Then keisan = r.Offset(-1, -4).Value If r.Offset(, -1).Value = r.Offset(-2, -5).Value Then keisan = r.Offset(-2, -4).Value If r.Offset(, -1).Value = r.Offset(-3, -5).Value Then keisan = r.Offset(-3, -4).Value If r.Offset(, -1).Value = r.Offset(-4, -5).Value Then keisan = r.Offset(-4, -4).Value ElseIf r.Offset(, -2).Value = "SITA" Then If r.Offset(, -1).Value = r.Offset(, -5).Value Then keisan = r.Offset(, -3).Value If r.Offset(, -1).Value = r.Offset(-1, -5).Value Then keisan = r.Offset(-1, -3).Value If r.Offset(, -1).Value = r.Offset(-2, -5).Value Then keisan = r.Offset(-2, -3).Value If r.Offset(, -1).Value = r.Offset(-3, -5).Value Then keisan = r.Offset(-3, -3).Value If r.Offset(, -1).Value = r.Offset(-4, -5).Value Then keisan = r.Offset(-4, -3).Value Else keisan = 0 End If End Function くどいようでようですが↑は例で、セル位置などでたらめですので・・・(>_<)Hatch -------- Hatchさんの方がトピ主さんの気持ちを理解している様な??(^^;; ヒヤアセ Hatchさんは、トピ主さんが何をしたいのか?わかりましたかぁ?? σ(^◇^;)は、わからなかったです。。・゚゚・(>_<)・゚゚・。 (SoulMan) ---- To SoulManさんへ >トピ主さんが何をしたいのか? 数式やデータを入力したシートがあって、行の挿入や削除をすると数式のセル参照がうまく変更されない。 行の挿入や追加しても、セル参照が意図したように変化するように、数式を改造できないだろうか? 問題はIF関数のネストが多くてOFFSET関数をうまく適用できない。 何かよい方法はないだろうか? ・・・だと思っています。(あれっ 質問そのまま?・・・(^^;) 私の考え方 行の挿入や削除によって参照しているセルは相対的に変化するので、問題は起きない。 もしくは、問題がないように数式を書くのがいい。 しかし、今までの話では参照セルを含む行が挿入や削除の対象になっているようなので 参照がおかしくなって当たり前のような気がします。 そこで、計算式を行の挿入や削除に影響されないマクロ(外部)に書けばいいのでは? でも、マクロを書くには処理の全体を把握しないと書けない。 ユーザー定義関数なら数式だけをシート外に持ってこれるので、 数式は改変されないからうまくいくのでは? ・・・と思ってレスしました。 (セル参照はすべて相対位置で書かないといけなさそうですが・・・ セル参照をするユーザー定義関数を初めて書いた(^^;) ) 以上勝手な解釈?・・・(Hatch) ------- そういうことでしたかぁ、、(゚゚)(。。)(゚゚)(。。)うんうん 納得しました。Hatchさんありがとうございました。m(._.)m ペコッ (SoulMan) ------- みなさん一生懸命考えていただき有り難うございます。 (ツーチャン)はいささか疲れてきました。能力(体力)の限界です。 うまく説明できず申し訳ありません。 入力セルと参照セルの間で削除、挿入をすればその間隔が変わるのですがそれを変わ らないように設定出来ないかということです。 絶対参照セルは60行目より上部のセルとなっておりその部分は削除挿入しません。 60行目より下部は全て行の位置によってその分 式(参照セル)が変化するのみです。 削除、挿入は行単位で行い60行より下部は列が同じであればすべてセル位置の違いだ けで式は同じです。OFFSET関数を全てのセル(1行だけ入力して後はコピー)を試みま したがOFFSETの()が増えてダメなセル及び計算式が長くなりすぎてダメなセルが1行 で5〜6のセルがあります。 当方はマクロを組む能力が皆無ですがマクロに精通した方であればすんなり出来るの ではと安易に考えていました。 (ツーチャン) ---- 該当シートを差し障り無い程度に修正してファイルをアップしてはどうですか。 とりあえず100行まででもあれば判るでしょうし、差し支えある名称等は修正すれば良いし。 アップの方法は以下です。参考までにどうぞ。 http://skyblue123.hp.infoseek.co.jp/Excel/YahooBc.html (川野鮎太郎) -------- (川野鮎太郎)さんお世話になります。 こんなことが出来るとは知りませんでした。いろいろと勉強になります。 下記URLで開けると思います。よろしくお願いいたします。 http://proxy.ymdb.yahoofs.jp/users/fce729cb/bc/%bb%c5%bb%f6/%bc%c1%cc%e4%cd%d1%%d5%a5%a1%a5%a4%a5%eb.xls?bcMCq1BBt.kqa_PR (ツーチャン) ---- アドレスが違うようですね。 再度確認してみてください。 (川野鮎太郎) ------ アドレス修正UP http://proxy.ymdb.yahoofs.jp/users/fce729cb/bc/%bb%c5%bb%f6/%bc%c1%cc%e4%cd%d1%a5%d5%a5%a1%a5%a4%a5%eb.xls?bcMCq1BBt.kqa_PR うまくUP出来ているでしょうか (ツーチャン) ---- はい、見れますね。 ただ、注意書きしておいたと思いますけど・・・。 社名等残ってますけど問題ないですか・・・。 それとこの表でどこをどうしたときにどうなりたいのでしょうか。 ※それにしてもこの拾い出し表は複雑ですね(^_^A; (川野鮎太郎) ------ ファイルを修正再度UPいたしました。 計算入力の後、設計変更などで行の挿入及び削除した場合に、セル内の式の参照セルの 位置の入力セルより距離が変わるため内容が変わってしまうこと、削除した場合はテキ メン よろしくお願いいたします。 (ツーチャン) ---- 確かにツーチャンさんの言われるように、ネストが増えてダメみたいですね。 (川野鮎太郎) ----- トピ主さんのファイル見れますか? (SoulMan) ---- 昨日は開けたけど、無理だとわかって消されたのかも・・・。 ※無理だとわかってではなく、無理だと思ってですね。 (川野鮎太郎) ------ みなさん有り難うございます。 削除したつもりはありませんが、誤った入力したかも。 再度UPします。 http://jp.y42.briefcase.yahoo.co.jp/bc/takahamatu2000/lst?.dir=/%bb%c5%bb%f6&.view=l&.src=bc&.done=http%3a//jp.y42.briefcase.yahoo.co.jp/bc/takahamatu2000/lst%3f.dir=/%25bb%25c5%25bb%25f6%26.src=bc%26.view=l (ツーチャン) ---- とりあえず、IFのネストを減らしてやってみました。 ただ心配されているように処理が重たくなるかもしれません。 CO70セルの式です。 =IF(OR(R70="ヨコ",R70="ベースL"),IF(ISNA(MATCH(CU70,OFFSET(CO70,-3,-91):B70,0)),0,INDEX(OFFSET(CO70,-3,-88):E70,MATCH(CU70,OFFSET(CO70,-3,-91):B70,0),1)),IF(CE70="主 下",IF(ISNA(MATCH(CU70,OFFSET(CO70,-5,-91):B70,0)),0,INDEX(OFFSET(CO70,-3,-86):G70,MATCH(CU70,OFFSET(CO70,-5,-91):B70,0),1))*IF(AND(CE70=OFFSET(CE70,-1,0),CE70=OFFSET(CE70,-2,0),OFFSET(CE70,-3,0)=0),IF(AND(DH70>0,DI70>0),3/4,IF(OR(AND(DI70>0,DJ70>0),AND(DH70>0,DJ70>0)),1/2,IF(AND(DC70>0,DD70>0),3/4,1/4))),IF(AND(COUNTIF(OFFSET(CE70,-3,0):CE70,CE70)>1,OFFSET(CE70,-4,0)=0),IF(OR(DH70=0,DI70=0,DJ70=0),1/4,1/2),IF(AND(COUNTIF(OFFSET(CE70,-4,0):CE70,CE70)>1,OFFSET(CE70,-5,0)=0),1/4,0))),0)) (川野鮎太郎) ---- ざ〜っとシートを見た感じで、行単位で挿入や削除をするのがマズイのでは? 参照セルを削除するのをやめればいいだけのような気がします。 入力箇所のみを上下に移動してやれば問題は起こらないのではないでしょうか? (数式の入力されていたセルに値が上書きされているのも気になります。) 行の挿入や削除を可能にするためマクロで数式を入れ直す方法を試してみましたが、 数式が長すぎるためかうまくいかない列が2箇所ほどありました。 数式をもうちょっと短くすればうまくいきそうですが・・・(^_^;) 今の私では能力的&時間的に無理なようですので、このへんでGiveupを宣言しておきます。 (Hatch) ---- 私もHatchさんと同じ様に思いました。 追加する場合は、追加するセル以下をコピーで下方に値の貼り付け 削除する場合は、削除するセル以下をコピーで上方に値の貼り付けでいけそうに思いました。 追加削除の項目が多いと大変そうなので、その操作をマクロでやるように出来ればいいのかな・・・。 (川野鮎太郎) ------ ありゃりゃ、みぃも、、パス。 (SoulMan) ------- みなさん本当に有り難うございました。 ご指摘の通り参照セルを削除するのをやめればよいのですが、全ての行で行の違う参照 セルが入力しています。又このファイルは、建物のコンクリート部分のコンクリート、 型枠、鉄筋数量を算出するのに、手計算形式で省力化を図る目的で、自動化出来るとこ ろは出来るだけ・・とのコンセプトで私用のソフトとして作っております。 使用している内にだんだんとよくが出ましてもっと省力化出来ないかとなり、この 問題になりました。今までは、その都度、影響範囲をコピーして解消してきました。 市販されているソフトがありますが、ピンからキリまであり、100万円を超えるソフト もあります。ただ、自分の使用方法では汎用性に疑問符が付きます。 投稿したときは、シート全体を設定する方法があるのではないかと思い載せました。 みなさん有り難うございました。 (ツーチャン) THE END ---- ああああ、少し遅かったか_/ ̄|○ il||li もう見ておられないかな(ノ_・。) 行削除、挿入を値の複写からやってみました。 Option Explicit Sub Test() '変数宣言 Dim LastRow As Long 'データの最終行 Dim MyRange As String '削除、挿入範囲 Dim MyRow As Long '削除、挿入開始行 Dim MyRows As Long '削除、挿入行数 Dim MyC As Variant '値の複写列 Dim i As Byte '値の複写列のループカウント Dim MySelect As String '編集選択 Dim MyFlg As Byte MySelect = MsgBox("行の挿入をしますか。" & vbCrLf & vbCrLf & _ "行の挿入の場合は『はい』" & vbCrLf & vbCrLf & _ "行の削除の場合は『いいえ』" & vbCrLf & vbCrLf & _ "作業を中止するには『キャンセル』を押してください。", _ vbYesNoCancel, "編集確認") If MySelect = vbYes Then MyFlg = 1 ElseIf MySelect = vbNo Then MyFlg = 2 ElseIf MySelect = vbCancel Then Exit Sub End If LastRow = Range("A65536").End(xlUp).Row MyRange = Application.InputBox(prompt:=vbCrLf & _ "行をを選択してください。", _ Default:=ActiveCell.Address, Title:="行選択", Type:=8).Address MyRow = Range(MyRange).Row MyRows = Range(MyRange).Rows.Count MyC = Array("A", "B", "C", "D", "H", "J", "L", "Q", _ "V", "W", "X", "Y", "AA", "AB", "AH") Select Case MyFlg Case 1 Rows(LastRow).Copy Destination:= _ Rows(LastRow).Resize(MyRows + 1) '挿入行分最終行をコピー For i = 0 To UBound(MyC) Range(MyC(i) & MyRow & ":" & MyC(i) & LastRow).Copy _ Destination:=Range(MyC(i) & MyRow + MyRows) Range(MyC(i) & MyRow).Resize(MyRows).ClearContents Next i Case 2 For i = 0 To UBound(MyC) Range(MyC(i) & MyRow + MyRows & ":" & MyC(i) & LastRow).Copy _ Destination:=Range(MyC(i) & MyRow) Next i Rows(LastRow - MyRows + 1).Resize(MyRows).Delete Shift:=xlUp End Select End Sub ''標準モジュールにコピペして実行すれば、行削除、行挿入と同じような働きをします'' (川野鮎太郎) ---- イチャモンをつけるわけではありませんが・・・(気を悪くしないでください) 数式が入力されているセルに値が入力されている所(E〜G列の一部)がありますので ここをどう処理するのかが問題だと思います。 何かいい方法があるような気もするのですが・・・思いつかない # まだこの問題を引きずっている・・・(^^;) (Hatch) ---- いや、これは単にアップするために値を入れているだけで、本来は断面リストに対応する値があって、 数式でもってくるんだと思いますよ。 梁記号のG1だったら、幅300高さ600とかで区分されますから。 違ってたりして(^_^A; もし同じベースのF1で寸法(長さ、幅)が違うなら、断面リストで枝番つけるようにしたら全部数式にならないかな_/ ̄|○ il||li Hatchさん、気を悪くはしてませんよー^^ どうにか質問者の方の希望のようなことが出来ないかと思ってるのは一緒ですから^^ もう一度見てくれることを祈って(((((* ̄0 ̄)†‾‾‾ アーメン (川野鮎太郎) -------- 何はともあれ、賞賛の口笛(^。^;)ひゅぅ〜〜ひゅゆぅ〜〜〜 さてと、、、穴場の○○○でも、勉強しようっと( ̄□ ̄;)!! ねばぁぎぶあっぷ、あきらめたらアカンちゅうこちゃね。 またまた、発音があやすぃ v(=∩_∩=)v (SoulMan) ---- >これは単にアップするために値を入れているだけで そうですか・・・関係ないところばっかり考えていました(^^;) たぶん川野さんのでOK・・・では(^^)/‾‾ (Hatch) --------- 川野鮎太郎さん すごいですね。 SoulManさんの言われるとおり、B:85に壁記号(たとえばW18)と入力した場合は 壁寸法ですのでその都度E,F行は数値を上書きする事になります。AL列までの セルは空のセルも含めて必要に応じて上書きする事で計算します。 (ツーチャン) ---- ぉお!!(゚ロ゚屮)屮 見てくれましたね〜^^ よく考えたら、Hatchさんの言われるように、壁記号W18 や ベース、スラブ記号のFやSは長さや高さが変化しますね。 ただ今回のような一括計算の表の場合には、数式と手入力を混在しないような表作りにしたほうが、 後のことを考えたら楽だと思います。 例えば、現在あるE〜G列は全て数式、値を手入力するための列を別に2列追加 そこに値が入ったときには、E〜G列を空白や1にして計算できるようにする。 それだったら、私の作ったマクロでそのまま使えるような気がします。 (対応列は変える必要があるのと、少しだけ容量が増えますね) でも現在の表をそのまま使うとしても、手入力の可能性のある列がどこか判っていれば、 上記のコードに少し手を加えるだけで、対応できそうな気がします。 気のせいかもしれないけど・・・♪〜〜( ̄ε ̄;) (川野鮎太郎) -------- 川野鮎太郎さんはじめみなさん、このことで時間を費やして頂き本当に申し訳ありま せん。 セルの色で白地が空白セル、黄色地が「上書きあり」のセル、緑地及び青地が「上書 きなし」のセルです。 (ツーチャン) ---- とりあえずコードを少し追加しました。 ご希望通りの動きになるか確認してみてください。 ''元に戻せませんので、バックアップをとってから実行してください。'' Option Explicit Sub Test() '変数宣言 Dim LastRow As Long 'データの最終行 Dim MyRange As String '削除、挿入範囲 Dim MyRow As Long '削除、挿入開始行 Dim MyRows As Long '削除、挿入行数 Dim MyC As Variant '列選択項目 Dim MyC2 As Variant '列選択項目 Dim i As Byte 'ループカウント Dim MySelect As String '編集選択 Dim MyFlg As Byte MySelect = MsgBox("行の挿入をしますか。" & vbCrLf & vbCrLf & _ "行の挿入の場合は『はい』" & vbCrLf & vbCrLf & _ "行の削除の場合は『いいえ』" & vbCrLf & vbCrLf & _ "作業を中止するには『キャンセル』を押してください。", _ vbYesNoCancel, "編集確認") If MySelect = vbYes Then MyFlg = 1 ElseIf MySelect = vbNo Then MyFlg = 2 ElseIf MySelect = vbCancel Then Exit Sub End If LastRow = Range("A65536").End(xlUp).Row MyRange = Application.InputBox(prompt:=vbCrLf & _ "行をを選択してください。", _ Default:=ActiveCell.Address, Title:="行選択", Type:=8).Address MyRow = Range(MyRange).Row MyRows = Range(MyRange).Rows.Count MyC = Array("A", "B", "C", "D", "H", "J", "L", "Q", _ "V", "W", "X", "Y", "AA", "AB", "AH") MyC2 = Array("E", "F", "G", "K", "M", "N", "O", "R", "S", "T", _ "U", "Z", "AD", "AE", "AF", "AG", "AJ", "AK", "AL") Select Case MyFlg Case 1 Rows(LastRow).Copy Destination:= _ Rows(LastRow).Resize(MyRows + 1) '挿入行分最終行をコピー For i = 0 To UBound(MyC) Range(MyC(i) & MyRow & ":" & MyC(i) & LastRow).Copy _ Destination:=Range(MyC(i) & MyRow + MyRows) Range(MyC(i) & MyRow).Resize(MyRows).ClearContents Next i For i = 0 To UBound(MyC2) Range(MyC2(i) & MyRow & ":" & MyC2(i) & LastRow).Copy _ Destination:=Range(MyC2(i) & MyRow + MyRows) Range(MyC2(i) & LastRow + MyRows).Copy _ Destination:=Range(MyC2(i) & MyRow & ":" & MyC2(i) & MyRow + MyRows - 1) Next i Case 2 For i = 0 To UBound(MyC) Range(MyC(i) & MyRow + MyRows & ":" & MyC(i) & LastRow).Copy _ Destination:=Range(MyC(i) & MyRow) Next i For i = 0 To UBound(MyC2) Range(MyC2(i) & MyRow + MyRows & ":" & MyC2(i) & LastRow).Copy _ Destination:=Range(MyC2(i) & MyRow) Next i Rows(LastRow - MyRows + 1).Resize(MyRows).Delete Shift:=xlUp End Select End Sub (川野鮎太郎) -------- 川野鮎太郎さん 試させていただきました。 ばっちりです。 本当に有り難うございました。祝杯させていただきたい気持ちです。 エクセルの設定若しくは、簡単なマクロを組めばOKかと思い又全然判りませんでした ので、投稿させていただいたのですが、こんなに長いマクロを組まなくてはいけないとは 想像だにしませんでした。 本当に有り難うございました。 その他のみなさん、依頼者がなにをしたいか判らないのに(説明不良のため)いろいろと 思考していただき有り難うございました。 お礼申し上げます。 (ツーチャン) ---- ぉお!!(゚ロ゚屮)屮 良かったですね〜^^ ( o ̄▽)o<※*:'゜。.お*:゜・め'゜゜:。で'・:+と"。*・う':゜:*♪:'゜‘。+: >こんなに長いマクロを組まなくてはいけないとは (T▽T)アハハ! 私じゃなければもっと簡単なコードになったでしょう(断言) それにしても解決してε-(´o`) ホッ!としました。 私の仕事でも使えるので、元ファイルをください。 (冗談です (川野鮎太郎) ...
http://www.excel.studio-kazu.jp/wiki/kazuwiki/200410/20041031102648.txt - [detail] - similar
PREV NEXT
Powered by Hyper Estraier 1.4.13, with 97039 documents and 608037 words.

訪問者:カウンタValid HTML 4.01 Transitional