![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.7ベストアンサー
- 回答日時:
#6の対策を取る前は、質問者様が補足に書かれた様な状況でした。
このとき名前"Date"の内容は、下記の様なものでした。文字列として入っています。
={"1/1/2010";"1/2/2010";"1/3/2010";"1/4/2010";"1/5/2010";"1/6/2010";"1/7/2010";"1/8/2010";(以下略)
やむを得ず、倍精度浮動小数点数に変換した後は、下記の様な形でした。
={40179;40180;40181;40182;40183;40184;40185;40186;40187;4(以下略)
この状態で、軸の書式を日付形式にすると、所期の日付で表示されました。
当方xl2000(xl2010は検証用にしか使えていない-使いこなしていない)ですが、下記コードで日付表示されております。
Sub test()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String
Dim chart1 As Chart
Dim i As Long
Dim arrayX As Variant
Dim arrayY As Variant
Set cn = New ADODB.Connection
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Open ThisWorkbook.Path & "\db1.mdb"
SQL = "SELECT TOP 1000 * FROM Table1 ORDER BY ID;"
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open SQL, cn, adOpenStatic, adLockReadOnly
With Worksheets(1)
arrayX = .Range(.Cells(1), .Cells(rs.RecordCount, 1))
arrayY = .Range(.Cells(1), .Cells(rs.RecordCount, 1))
End With
For i = 1 To rs.RecordCount
arrayX(i, 1) = CDbl(rs.Fields(1))
arrayY(i, 1) = rs.Fields(2)
rs.MoveNext
Next i
ThisWorkbook.Names.Add Name:="Date", RefersTo:=arrayX
ThisWorkbook.Names.Add Name:="Rate", RefersTo:=arrayY
Set chart1 = Charts.Add(Before:=ActiveSheet)
chart1.ChartType = xlXYScatter
chart1.SeriesCollection.NewSeries
With chart1.SeriesCollection(1)
.XValues = "='" & ThisWorkbook.Name & "'!Date"
.Values = "='" & ThisWorkbook.Name & "'!Rate"
End With
chart1.Axes(xlCategory).TickLabels.NumberFormatLocal = "yyyy/m/d"
Set rs = Nothing
Set cn = Nothing
End Sub
mitarashi様
勘違いしていました!申し訳ございません…
>>arrayX(i, 1) = CDbl(rs.Fields(1)) 'ここでDatevalueにしてもダメ
の部分を勘違いしていてスルーしていました…
コードにCDblを入れて実行したところ
問題なく期待した日付が出てきました。
この度は最後までお付き合い頂き本当にありがとうございました。
mitarashi様は真のハッカーです。(もちろん良い意味の方の)
私も精進致します。
No.6
- 回答日時:
#2~5ですが、また出てくるはめになりました...
出来たことに満足してグラフを眺めていると、なんだか変
X軸が日付になっていない。
色々やってみましたが、
レコードセットから配列に取り込む際に、数値に変換し、
For i = 1 To rs.RecordCount
arrayX(i, 1) = CDbl(rs.Fields(1)) 'ここでDatevalueにしてもダメ
arrayY(i, 1) = rs.Fields(2)
rs.MoveNext
Next i
グラフの目盛りの表示形式を日付形式にしないと、うまく行かない様です。
chart1.Axes(xlCategory).TickLabels.NumberFormatLocal = "yyyy/m/d"
日付のままだと、「名前」に入れる際に、文字列に変えられてしまうみたいです。
ご参考まで。
mitarashi様
改めてこんなに調べて頂いて本当にありがとうございました。
またお返事が遅くなってしまって申し訳ありません…
書いて頂いたコードを実行してみました。
XValueに日付を入れたのですが、
出来上がったグラフを見てみると
2001年から2010年まで日付が入るグラフが
すべて1900年代になってしまっていました…
おそらく要素の数がX軸になってしまっているのだと思われます…
配列の行と列を入れ替えたりRedimしてみたり
!Dateの後に記号や数字を入れたりしてみましたが
現象変わらずです…
もしかしたら私の環境に依存するかもしれません。
mitarashi様の方はどのような感じでしょうか?
No.5
- 回答日時:
#4です。
たびたびすみません。>動的配列の一次元目をredimする代用、セル値は上書きしてしまう
誤解を招きそうですが、読み込んだセルの値は、後ほどレコードセットの値で上書きしてしまうので、関係ありませんと言いたかったものです。補足させていただきます。
No.4
- 回答日時:
#2,3です。
それでもと思ってやってみました。Excel固有機能に相当お世話になっておりますが、シートに書き出してはいません...
当然ながら、別のグラフを描くときは、別の範囲名をつけないと、先ののグラフも変わってしまいます。
Sub test()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String
Dim chart1 As Chart
Dim i As Long
Dim arrayX As Variant
Dim arrayY As Variant
Set cn = New ADODB.Connection
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Open ThisWorkbook.Path & "\db1.mdb"
SQL = "SELECT TOP 1000 * FROM Table1 ORDER BY ID;"
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open SQL, cn, adOpenStatic, adLockReadOnly
'動的配列の一次元目をredimする代用、セル値は上書きしてしまう
With Worksheets(1)
arrayX = .Range(.Cells(1), .Cells(rs.RecordCount, 1))
arrayY = .Range(.Cells(1), .Cells(rs.RecordCount, 1))
End With
For i = 1 To rs.RecordCount
arrayX(i, 1) = rs.Fields(1)
arrayY(i, 1) = rs.Fields(2)
rs.MoveNext
Next i
ThisWorkbook.Names.Add Name:="Date", RefersTo:=arrayX
ThisWorkbook.Names.Add Name:="Rate", RefersTo:=arrayY
Set chart1 = Charts.Add(Before:=ActiveSheet)
chart1.ChartType = xlXYScatter
chart1.SeriesCollection.NewSeries
With chart1.SeriesCollection(1)
.XValues = "='" & ThisWorkbook.Name & "'!Date"
.Values = "='" & ThisWorkbook.Name & "'!Rate"
End With
Set rs = Nothing
Set cn = Nothing
End Sub
参考URL:http://blogs.yahoo.co.jp/mikezang/59251225.html
No.3
- 回答日時:
#2です。
まず、GetRowsは100レコード以上はダメな様です。
http://support.microsoft.com/kb/198528/en-us/
(機械翻訳の日本語版は英語以上に訳が分かりませんでした)
それではと、下記のコードでやってみましたが、別の制限がある様です。
http://blogs.yahoo.co.jp/mikezang/59251225.html
http://oshiete.goo.ne.jp/qa/4398916.html
下記コードのTOP 20のところをいろいろ振ってみましたが、
Excel2000は21からエラーになりました。
Excel2010は、999でもエラーになりませんでした。(1000個のつもりが一個足りなかった)
互換モードではなく、形式を変換した後の話です。
参考URLにある、SEREIS formula 256文字の制限(256列の制限を反映)は妥当な様です。
二つめの参考URLのコード4はメモリー上でやっている様ですが、
ここまで頑張ってメモリー上でやる必要があるのかな?と思います。
なお、Application.Transpose等も試してみましたが、ダメでした。
Sub test()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String
Dim chart1 As Chart
Dim i As Long
Dim arrayX() As Date
Dim arrayY() As Double
Set cn = New ADODB.Connection
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Open ThisWorkbook.Path & "\db1.mdb"
SQL = "SELECT TOP 20 * FROM Table1 ORDER BY ID;"
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open SQL, cn, adOpenStatic, adLockReadOnly
ReDim arrayX(rs.RecordCount - 1)
ReDim arrayY(rs.RecordCount - 1)
For i = 0 To rs.RecordCount - 1
arrayX(i) = rs.Fields(1)
arrayY(i) = rs.Fields(2)
rs.MoveNext
Next i
Set chart1 = Charts.Add(Before:=ActiveSheet)
chart1.ChartType = xlXYScatter
chart1.SeriesCollection.NewSeries
With chart1.SeriesCollection(1)
.XValues = arrayX
.Values = arrayY
End With
Set rs = Nothing
Set cn = Nothing
End Sub
こんなに調べて頂き本当にありがとうございますm(_ _)m
とてもお手数お掛けしてしまい非常に恐縮です…
私の方で今時間があまり取れない状態なので
恐れながらまた改めて書き込みさせて頂きます。
No.2
- 回答日時:
#1さんの仰る通りで、エクセルを使いながら、メモリ上に拘る意味が解りかねますが、
興味のおもむくまま調べてみました。一つ利口になりました。
エクセルからmdbにアクセスしています。
'ADOに参照設定要
Sub test()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String
Dim chart1 As Chart
Set cn = New ADODB.Connection
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Open ThisWorkbook.Path & "\db1.mdb"
SQL = "SELECT * FROM Table1;"
Set rs = New ADODB.Recordset
rs.Open SQL, cn, adOpenStatic, adLockReadOnly
If rs.BOF Then Exit Sub
Set chart1 = Charts.Add(Before:=ActiveSheet)
chart1.SeriesCollection.NewSeries
'試験用データTable1のFields(0)はIDなので、Fields(1)から指定しています
With chart1.SeriesCollection(1)
.XValues = rs.GetRows(, , rs.Fields(1))
rs.MoveFirst
.Values = rs.GetRows(, , rs.Fields(2))
End With
Set rs = Nothing
Set cn = Nothing
End Sub
この回答への補足
回答ありがとうございます。
メモリ上に拘る理由は、メモリ上で処理できれば
シートに書き出す必要がないのでは、、というただの好奇心です。
書いた頂いたコードを実行してみましたところ
ずっとエラーが出て悩んでいたのですが、
どうやらレコードセットの行数に関係していたようです。
100件以上のレコードセットで試してみたところ
.Values = rs.GetRows(, , rs.Fields(2))の行で
実行時エラー 1004
アプリケーション定義またはオブジェクト定義のエラーです
というエラーが出ます。
(たまに違うエラーも出たような…)
4件のレコードセットで試してみたところ、
問題なく実行できました。
実は作りたいグラフが100件以上のレコードを持つ
X軸に日付が入り、Y軸に4種のDoubleが入るものでして…
(ちなみにテストしたのはまた別のテーブルです…)
100件以上のデータも問題なく実行するにはどうしたら良いでしょうか…?m(_ _)m
No.1
- 回答日時:
こんにちは。
なぜシートにデータを吐き出してはいけないのか、
その理由を明確にすべきでしょう。
単に自分の希望を言うだけではだめです。
あなたの努力は? って言われます。
VBAで行うなら一度シートにデータを吐き出したって
何の問題もないはずです。
グラフだけ作って画像で固定してあとは
もとになったシートをさっさと消してしまう
ってことはできないでしょうか?
当方、コードを書くつもりは毛頭ありません。
コードもらいならそれに答えるつもりはありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Excel(エクセル) エクセルのイベントVBAを複数のシートで動かしたい 1 2022/12/07 16:55
- Excel(エクセル) Excel 散布図グラフ 外れ値 セル番地参照方法 4 2022/04/19 18:56
- Excel(エクセル) エクセルの大きなシートでグラフを見つける 4 2022/07/28 10:07
- Excel(エクセル) シートが違う2枚のエクセルシートにある数値を別シートにコピーしたい(VBA?) 8 2022/03/31 12:24
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Visual Basic(VBA) vbaについて 主に以下のような設定をしたいです。 Aブックの表の行数が20未満だったら Bブックの 1 2023/06/08 23:40
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
COBOLの基本的な事なので...
-
vba フィルター 複数条件 3つ以...
-
VB6からの移行したいけど、VB.N...
-
excel vbaの配列なんですが・・・
-
配列の中の最大値とそのインデ...
-
VB.NETの配列にExcelから読み込...
-
Dir関数で読み取り順を操作でき...
-
エクセルVBAからNotesでメー...
-
Redim とEraseの違いは?
-
VBA 桁数が混在するソート
-
コンボボックスのインデックス...
-
画像ファイルを配列に格納する方法
-
VB.NETにて、構造体へデータを...
-
構造体配列の特定のメンバーをF...
-
エクセルでXY座標に並べられた...
-
セル範囲から一次元配列の生成
-
デバイスマネージャーの一覧取得
-
エクセル(VBA)の空白配列の削除...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
vba フィルター 複数条件 3つ以...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
配列の中の最大値とそのインデ...
-
VB.NETの配列にExcelから読み込...
-
定数配列の書き方
-
Excel2010のinputboxで複数デー...
-
大量の変数を定義するにはどう...
-
構造体配列の特定のメンバーをF...
-
構造体配列内の文字列検索のよ...
-
Redim とEraseの違いは?
-
Segmentation Fault (メモリ制限?)
-
OutOfMemoryExceptionの回避策...
-
VBAでMODE関数をつくる
-
COBOLの基本的な事なので...
-
Excelのメモリ(配列)の上限は2G...
-
コンボボックスのインデックス...
-
VB6のメモリ解放に関して
おすすめ情報