advanced help
per page, with , order by , clip by
Results of 1 - 1 of about 1385 for ������������ #N/A (0.016 sec.)
[[20080216025711]]
#score: 6930
@digest: 2a9561f7a7a16e09ef52ffa893a57877
@id: 36166
@mdate: 2008-02-18T15:00:20Z
@size: 17970
@type: text/plain
#keywords: 圧力 (131893), 昇圧 (104976), 圧終 (84670), 間圧 (67484), 圧開 (53346), 主試 (50877), 降圧 (50494), 持終 (45725), getdataarea (44285), 験計 (41443), 試験 (38115), 査終 (36149), 回測 (32799), 自主 (27331), lastline (23803), activechart (10873), 測定 (8673), 力値 (6667), 計画 (5464), 散布 (5066), ラフ (4928), タ範 (4803), 布図 (4791), 保持 (4612), 終了 (4600), グラ (4567), 検査 (4545), 値( (3988), 〜d (3363), 時間 (2705), lastrow (2683), デー (2151)
『データ範囲が毎回変わるグラフをマクロで』(AYUYU)
マクロ初心者ですが、データ範囲がその都度変わるグラフを表示させたくて、 マクロで自動化できないものかといろいろ試していますがよくわかりません。 耐圧試験のグラフなのですが配管の色々な箇所で、無数に試験が行われ、 そのたびにこのグラフを作成しなくてはなりません。 説明が長くなりますが、以下説明します。 A列(試験時間:分) B列(計画圧力) C列(自主圧力) D列(立会圧力) 0 0 0 0 1 2 3 . . 75 15 . 85 17 . 95 19 . 105 15 . . A列に1〜300までの時間(分)があり、B、C、D列にはそれぞれ 「試験計画」「自主試験」「立会試験」の圧力値があります。 圧力値はそれぞれ「昇圧開始」「昇圧完了」「保持完了」「降圧完了」のポイントがあり、 自主試験の場合であれば、「0」「17」「17」「0」の圧力値が 「0」「85」「115」「200」の分のところに入ります。 圧力は、試験ごとに変わりますが、圧力の上昇するスピードは決まっていますので、 圧力が高くなると、試験時間が長くなります。最大で300分としてあります。 B〜Dの値は、表外のセルに「試験番号」を入力すると、 別表(別シート)の試験データからVLOOKUP関数などで参照するようにしてあります。 とりあえず、データ範囲をA1:D300としたグラフを作っています。 (縦軸が圧力、横軸が時間の折れ線グラフです。ちなみに横軸の項目名は表示しないようにしています。) 圧力が高い場合は、時間が長く掛かるので、グラフも見栄えよいのですが、 圧力が低い場合は、試験時間が短いので、グラフが左端にこじんまりとしてしまいます。 そこで、「グラフのデータ範囲をデータの入っている最後の行」までをとして 選択するマクロを作りたいのです。 説明が長くて申し訳ありませんがよろしくお願いします。 ---- データ範囲をB〜D列の最終データ位置までにしたいという解釈でよろしいでしょうか。 であれば、対象となるチャートを選択して、下記のマクロを実行してみてください。 Sub ChangeDataRange() ActiveChart.SetSourceData Source:=ActiveSheet.Range(getDataArea()) '-- ActiveChart.Axes(xlValue).MaximumScale = 2000 ' 縦軸を変えるならここ End Sub Function getDataArea() As String Dim lastLine As Long Dim c As Variant For Each c In Array("B", "C", "D") If lastLine < Range(c & ActiveSheet.Rows.Count).End(xlUp).Row Then lastLine = Range(c & ActiveSheet.Rows.Count).End(xlUp).Row End If Next getDataArea = "A1:D" & lastLine End Function 文章読みづらかったので勝手に整形しました。 (各文の先頭に半角スペースを入れれば、2重改行は不要です) 対象となる場所はマクロの記録で簡単にわかりますので、利用されると良いでしょう。 また、マクロをショートカット(Alt+F8でオプション)を割り当てておくと、 グラフを選んで、そのキーを押すだけで操作ができます。 (Mook) ---- B〜D列には300行目まで、VLOOKUP関数が入っているのですよね? マクロにこだわらないので有れば、こちらが参考になると思います。 Excel で名前付け範囲を使用して動的なグラフを作成する - Excel - Microsoft Office Online http://office.microsoft.com/ja-jp/excel/HA011098011041.aspx?pid=CH010003731041 (HANA) ---- Mookさま、HANAさま 回答ありがとうございました! マクロは残念ながら、うまくいきませんでした。 B〜D列には別表から値を参照するためにVlOOKUP関数が入っておりまして 300行のうちで、当てはまる時間(分)の行にのみ、歯抜け状態で値が表示されます。 抜けているセルは、グラフでプロットしないために「#N/Aを」表示させてあります。 たぶんそのせいではないかと・・・ 私のやり方がまずかったのかもしれませんが、よくわかりません・・・ HANAさまに教えていただいたヘルプも、上記の理由のため、適合しないのではと思います。 「#N/Aを」表示している為、「グラフのデータ範囲をデータの入っている最後の行」までというのは 無理ではないのかと思いあたりました! そこで、「グラフのデータ範囲を "数値" の入っている最後の行」としてはどうかと思い、 色々やってはみたものの、なにをやってもダメで、 もうちんぷんかんぷんになってしまいました。 どうか、もう一度どなたかご教授ください! (AYUYU) ---- #N/Aでないセルの最大行を求めればよいのでしょうか? ワークシート関数のISNAで調べた例です。グラフ作成は自動記録を利用したものです。 この程度のデータ数ならFor〜Nextでも大して時間はかからないと思うので・・・(^^ゞ (Hatch) Sub Macro2() Dim y Dim maxRow As Long Dim i As Long, j As Long y = Range("A1:D302").Value For i = 2 To 4 For j = 302 To 2 Step -1 If WorksheetFunction.IsNA(y(j, i)) = False Then If maxRow < j Then maxRow = j Exit For End If Next j Next i MsgBox maxRow Charts.Add ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:D" & maxRow), PlotBy _ :=xlColumns ActiveChart.SeriesCollection(1).Delete ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1" With ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False End With End Sub ---- Hatch さんのでも動くかと思いますが、ご参考までに先に提示したマクロの修正です。 Hatchさんので十分であれば、読み捨ててください。 getDataArea() 以下を下記に置き換えてみてください。 Function getDataArea() As String Dim lastLine As Long Dim c As Variant Dim mc As Long For Each c In Array("B", "C", "D") mc = getMaxData(c) If lastLine < mc Then lastLine = getMaxData(c) Next getDataArea = "A1:D" & lastLine End Function Function getMaxData(strCol) As Long Dim lastRow As Long getMaxData = 1 lastRow = Range(strCol & ActiveSheet.Rows.Count).End(xlUp).Row Do While Not IsNumeric(Cells(lastRow, strCol)) If lastRow = 1 Then Exit Function lastRow = lastRow - 1 Loop getMaxData = lastRow End Function (Mook) ---- Hatchさま、Mookさま ご回答ありがとうございました! Mookさまには二度もお答えいただいて感激です。 出来た!出来ました!! 本当になんとお礼を言っていいのかわかりません。 苦節35時間、やっとむくわれました・・・。 実際にはグラフは別シートにありまして、 最初にも書いたとおり、B列〜D列の一番下にくる数値は、すべて「0」なのです。 (折れ線グラフは「台形」の形になります) いただいたプログラムにそれを反映させようとしましたが、むずかしくて いじくりまわしているうちに、ふと思い立って A列とB列の間にもう1列入れて、そこに圧力値が入っている行のみ、 時間(分)をVLOOKUPで表示させることにしました。 その列の最大値をとりだして、データ範囲に使おうと思ったのです。 しかし当然のことながら、VBA初心者の私にはとんと無理だったのですが、 みなさまからいただいたコードを何べんも試して、意味はわかんないけどいろんな部分を切り貼りして 本屋に「VBAパーフェクトマスター」なる本を買いに行って もう意地になってやりました。 その結果以下のようになりました。 きっとみなさんから見ると、不恰好でスマートさに欠けるとは思いますが、 とりあえず、意図した結果を得られるように作動いたしました。 ご参考までに、下記に記入しときます。 ご意見、ダメだしなどあれば、お願いします。 勉強になりました。本当にありがとうございました。 (AYUYU) Sub グラフデータ範囲() Dim k As WorksheetFunction Dim ayu As String Dim yas As String Set k = Application.WorksheetFunction ayu = k.Max(Sheets("参照用シート").Range("b:b")) yas = ayu + 3 ActiveSheet.ChartObjects("グラフ 10").Activate ActiveChart.SetSourceData Source:=Sheets("参照用シート").Range("b2:E" & yas),_ PlotBy:=xlColumns ActiveChart.SeriesCollection(1).XValues = "={"" ""}" End Sub ---- 解決して居られるようですが・・・ >「グラフのデータ範囲を "数値" の入っている最後の行」としてはどうかと思い、 今回の場合、B〜D列のデータは途中にエラー値は表示されないと思います。 (つまり、有る一定の範囲にデータが存在したあと、エラー値が表示され その後300行目まではずっとエラー値が表示されている) その様な場合は > "数値" の入っている最後の行 を関数で取り出すことを考えるより 「その範囲の中に数値がいくつ有るか」 を数えるのが早いように思います。 COUNT関数は「引数リストの各項目に含まれる数値の個数の合計を返します。」 [A] [1] 1 [2] 2 [3] 3 [4] #N/A [5] #N/A [6] [7] 3 ←=COUNT(A1:A5) データの範囲はA1セルから3セル分の高さです。 =OFFSET(A1,,,COUNT(A1:A5),) (HANA) ---- HANAさま 回答ありがとうございます。 マクロを使わずに、意図する結果が得られるならこんないいとはないです。 COUNT関数の働きはわかるのですが、 それが、私のグラフ作成にどのように反映させるのかが、今ひとつわからないのです。 最初に示した私の例でいくと、D列の圧力値が一番大きいので 試験時間が一番長くなります。最下行周辺の表の様子は、 A B C D . #N/A #N/A #N/A . #N/A #N/A #N/A 240 0 #N/A #N/A . #N/A #N/A #N/A . #N/A #N/A #N/A 260 #N/A 0 #N/A . #N/A #N/A #N/A . #N/A #N/A #N/A 280 #N/A #N/A 0 . #N/A #N/A #N/A . . . . . . . . (A列はグラフの縦軸項目の為、連続データが入っています) となります。このような場合でもA列〜D列を範囲とするグラフが、 自動的に参照範囲を拡張・縮小してくれるのでしょうか? B〜Dに入る圧力値は大きい場合もあれば、小さい場合もあります。 データは連続的に増えていくのではなく、B〜Dに入るデータの数は それぞれ各5個づつで、それが0〜300分の間に歯抜け状態で散らばります。 その散らばりが、圧力値によって毎回変わるので、 グラフが参照するデータの範囲を自動的に変えたいというのが、意図です。 説明が下手で解りにくいかと思いますが、このような場合でも 教えていただいたヘルプの方法でいけますか? よろしければ、教えてください。 よろしくお願いします。 (AYUYU) ---- 間は抜けているのですね。失礼しました。 >最初に示した私の例でいくと、D列の圧力値が一番大きいので B:Dの間でどこが一番長く時間がかかったか分からない のですかね? >B〜Dに入るデータの数はそれぞれ各5個づつで これは、1回測定があったらその後4回測定が無く その後1回測定を行い・・・ と言う事ですかね? 作業列を使って、次のようにしてみるのはどうでしょう。 作業列は、仮にE列とします。 他の項目には、1行目に見出しが有ると想定して 作業列の1行目(E1)に =MAX(E2:E300) E2に =(COUNT(B2:$D$300)>0)*ROW(E1) として、E300までフィルドラッグ。 E1に表示された値が、最終行を示すと思います。 A列の値が、データの有る範囲内で連番になれば良いのなら E2に入れた式を少し変更して =IF(COUNT(B2:$D$300),ROW(A1),"") を300行までフィルドラッグしておいても良いかもしれません。 <追記1> その際は、MAX関数はA列を指定してください。 作業列(E列)が不要になります。 なお、E2とA2の式の違いは 測定が終了した後の行に「0」と出るか「」と出るかの違いです。 作業列とは言え、要らない所に「0」が表示されるのを避けたいので有れば A2用の式を使って下さい。 ・・・上手く行くと良いのですが・・・。 <追記2> なお、この式は ・B:Dの間でどこが一番長く時間がかかったか分からない ・各列の測定スパンが一定ではない を想定しています。 (HANA) 追記しました。13:06 ---- そう言えば・・・B:DのVLOOKUP関数はA列の値を見ているのですかね? その場合は A列にB:Dの範囲を計算する式を入れると 循環参照で怒られると思いますので B:DのVLOOKUP関数のA列を参照している部分は、ROW関数を使った物に 変更してください。 また、先に載せた式では1から始まってしまいますので =IF(COUNT(B2:$D$300),ROW(A1)-1,"") 戻り値を「-1」して、MAX関数の結果には「+1」してください。 ちなみに、B:DのVLOOKUP関数はどの様な式になっているのですかね? (HANA) ---- HANAさま 回答ありがとうございます!! >B:Dの間でどこが一番長く時間がかかったか分からないのですかね? はい、そうです。使用した圧力値によって変わります。 >B〜Dに入るデータの数はそれぞれ各5個づつで >これは、1回測定があったらその後4回測定が無く >その後1回測定を行い・・・ と言う事ですかね? いいえ、そうではありません。 詳しい仕事の内容を説明するのもどうかと思ったのですが、あえて説明しますと これは「耐圧試験記録」というもののデータのグラフを作成する作業で 配管の1箇所につき、「試験計画:B列」「自主試験:C列」「立会試験:D列」の3つの項目があります。 この3つでワンセットです。 配管の中に水や空気を入れて圧力をかけ、漏れないか試験します。 圧力を上げる→規定の圧力に達したら一定時間キープ→その後検査しながら一定時間キープ→圧力をさげる というもの。 圧力を上げる(下げる)スピードはどの項目も同じですので、使用する圧力が高くなるほど 試験終了までの時間が長くなります。 各試験には圧力値を確認する5つのポイントがあります。 「昇圧開始」「昇圧終了」「保持終了」「検査終了」「降圧終了」の5つです。 その確認した時間(開始からの累計時間)がA列に入っています。 使用する圧力が15(単位はMpa)とした場合、B列には「0」「15」「15」「15」「0」のデータが 圧力を確認した時間(A列)の 入っている行に入ります。 >ちなみに、B:DのVLOOKUP関数はどの様な式になっているのですかね? Sheet1に試験の記録データが入っています。 Sheet2にグラフがあります。試験番号を入れるとSheet1を参照して、試験番号に対応する分の 「試験計画」「自主試験」「立会試験」のデータを表示する表も入っています。 Sheet3にこのデータがあります。 取り出すグラフは、配管一箇所分のデータですで、 B:DはSheet2に表示されるデータを参照しています。 一行目は見出し行。B2に入っている式は =VLOOKUP($A2,Sheet2!$E$6:$J$11,2,FALSE) 今日は時間がとれなくて、教えていただいた式をまだ試していませんが、 とりあえず、ご指摘のあった事についてお答えしました。 よろしくお願いします。 (AYUYU) ---- ご説明ありがとう御座います。 取りあえず先に載せた式は<追記2>の仕様となっております。 ただ、それぞれのデータの状況や配置によっては そんなに苦労しなくても良さそうな気もします。 Sheet1にもSheet2にもSheet3にもデータが有るのですよね? それぞれは、どの様に違うのですか? 差し支えなければ、見出しだけでも教えていただければ もう少しそちらの各シートの状況が分かると思うのですが・・・。 例えば、Sheet2に [C] [D] [E] [F] [6] 時間 圧力 [7] 試験計画 昇圧開始 0 0 [8] 昇圧終了 75 15 [9] 保持終了 105 15 [10] 検査終了 165 15 [11] 降圧終了 240 0 [12] 時間 圧力 [13] 自主試験 昇圧開始 0 0 [14] 昇圧終了 85 17 [15] 保持終了 100 17 [16] 検査終了 175 17 [17] 降圧終了 260 0 [18] 時間 圧力 [19] 立合試験 昇圧開始 0 0 [20] 昇圧終了 95 19 [21] 保持終了 100 19 [22] 検査終了 185 19 [23] 降圧終了 280 0 の様にデータが表示されるようになっているなら E1:E23の最大値の+1が Sheet3のデータ最終行と一致すると思いますが・・・? Sheet1とSheet2のデータの配置によっては Sheet1から求める方が簡単に求まるかもしれません。 と言う事で、先の式をお試し頂く前に(笑) それぞれのシートのデータがどの様になっているのかを 教えていただきたいのですが。 (HANA) ---- もしも、Sheet2が上の様になっているのなら ・・・と思いましたが、VLOOKUP関数を見ると データの並びは [D] [E] [F] [G] [H] [I] [J] [5] 試験計画 自主試験 立合試験 [6] 時間 圧力 時間 圧力 時間 圧力 [7] 昇圧開始 0 0 0 0 0 0 [8] 昇圧終了 75 15 85 17 95 19 [9] 保持終了 105 15 100 17 100 19 [10] 検査終了 165 15 175 17 185 19 [11] 降圧終了 240 0 260 0 280 0 となっているのですかね? ・・・どちらでも良いのですが この様になっているなら 散布図でご希望のグラフになりませんか? グラフウィザード 1/4 グラフの種類(C):散布図 形式(T):右側3段目 データポイントを折れ線でつないだ マーカーなしの散布図 グラフウィザード 2/4 [系列]タブで 追加(A)を押して 系列1 名前(N) :E5 Xの値(X):E7:E11 Yの値(Y):F7:F11 系列2 名前(N) :G5 Xの値(X):G7:G11 Yの値(Y):H7:H11 系列3 名前(N) :I5 Xの値(X):I7:I11 Yの値(Y):J7:J11 軸のMAXはエクセル任せになりますので コントロールしたければ、やはり 名前の定義になると思いますが・・・。 (HANA) ---- 申し訳ないです。 いかに人の話を読んでいないか・・・。 >A列とB列の間にもう1列入れて、そこに圧力値が入っている行のみ、 >時間(分)をVLOOKUPで表示させることにしました。 >その列の最大値をとりだして、データ範囲に使おうと思ったのです。 名前の定義で範囲を設定するときも同じで良さそうです。 「(HANA) 追記しました。13:06」 と、その下の書き込みは 同じような考えの式です。 (もう消してしまっても良いくらいに。笑) 一つ上の書き込みの、散布図で代用出来るならSheet3が要らなくなると思いますし 色々ややこしいことをする必要も無くなりそうですが。 (HANA) ---- HANAさま できました!! >もしも、Sheet2が上の様になっているのなら >・・・と思いましたが、VLOOKUP関数を見ると >データの並びは > [D] [E] [F] [G] [H] [I] [J] >[5] 試験計画 自主試験 立合試験 >[6] 時間 圧力 時間 圧力 時間 圧力 >[7] 昇圧開始 0 0 0 0 0 0 >[8] 昇圧終了 75 15 85 17 95 19 >[9] 保持終了 105 15 100 17 100 19 >[10] 検査終了 165 15 175 17 185 19 >[11] 降圧終了 240 0 260 0 280 0 >となっているのですかね? そうです!その通りです。 私のあの説明でよくここまでわかりますね!?すごいです。 今までの問題は、グラフを「散布図」にしたとたんに全て解決しました。 Sheet3はまったくいらなくなりました。 「散布図」なんて今まで使ったこともないし、思いつきもしませんでした。 まさに目からうろこです。 ついでといっては何ですが、もうひとつ教えてください。(あつかましくてすみません) 条件付書式で、「#N/A」と表示されているセルの文字色を「白」にするには どう条件をつけたらよいでしょう? よろしくお願いいたします。 (AYUYU) ---- 散布図で問題解決ですか。 それは良かったです。 セルの値が「#N/A」のエラー値かどうかは ISNA関数で調べられると思います。 例えば、A1セルに設定するなら 条件付き書式の設定で 数式が =ISNA(A1) として、文字色を「白」に設定してみてください。 (HANA) ---- HANAさま ばっちりです! すべての問題が完璧に解決されました。 今夜はぐっすり眠れそうです! 色々教えていただいて、本当に感謝です! ありがとうございました!!! (AYUYU) ...
http://www.excel.studio-kazu.jp/wiki/kazuwiki/200802/20080216025711.txt - [detail] - similar
PREV NEXT
Powered by Hyper Estraier 1.4.13, with 97012 documents and 608132 words.

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