Google
 
Web itpro-blogger.blogspot.com
月曜日, 12月 29, 2008

[VB2005]Excel処理の高速化

▼質問
大量のデータをデータベースから読込んでExcelのシートに表示したいんだ。

ループしてValueにデータを格納すると遅くなるんだ。

一括してデータを格納する方法はないのか?!

▼回答
一括してデータを貼り付ける方法はあるよ。

まず、セルの行と列を2次元にしたデータ領域を作成するんだ。

Dim value(5, 2) As String

この領域にデータを格納して、次の様にRangeに貼り付ける範囲を指定して

Range("A1:B5").Value = value

Valueに2次元配列を格納すれば、配列に格納したイメージのままセルに

データが貼り付けられるんだ。


金曜日, 12月 26, 2008

[VB2005]ExcelのA1形式で列名取得

▼質問
Excelの参照形式で表示されるA1形式の数字以外の列名を取得したいんだ。

どうしたらできるか教えてくれ!

▼回答
サンプルを示すから参考にしてくれ!!



Public Shared Sub GetExcelA1Address(ByRef strA1() As String)
Dim xlApp As Excel.Application = Nothing

Try

xlApp = CreateObject("Excel.Application")

If IsNothing(xlApp) Then Exit Sub

xlApp.Workbooks.Add()
xlApp.WindowState = Excel.XlWindowState.xlMinimized
xlApp.Visible = False
xlApp.DisplayAlerts = False
xlApp.ScreenUpdating = False

Dim wWorksheet As Excel.Worksheet = _
CType(xlApp.ActiveWorkbook.ActiveSheet, Excel.Worksheet)

ReDim strA1(256)

'最大列数分ループする。
For i As Integer = 1 To 256
strA1(i) = Replace(Split(CType(wWorksheet.Columns(i), _
Excel.Range).Address(False, True, Excel.XlReferenceStyle.xlA1), _
":")(0), "$", "")
Next i

GC.Collect()

Catch ex As Exception

Finally

If (Not IsNothing(xlApp)) Then xlApp.Quit()
xlApp = Nothing

GC.Collect()

End Try

End Sub



火曜日, 12月 16, 2008

[VBA]CopyFromRecordsetでAccessのメモ型が読込めない

▼質問
CopyFromRecordsetでAccessのメモ型が読込めない!

どうしてなのか教えてくれ!

▼回答
まずは、データベースのオープンの仕方を調べてみてくれ!

下記のようになっていなか調べてみてくれ!

con.Open ("Driver={Microsoft Access Driver (*.mdb)}; DBQ=C:\db1.mdb")

ここで問題なのは、Driver=の部分なんだ。

これはODBC接続でデータベースに行っていることを示している。

このODBC接続に不具合があるようなんだ。

だから、これをOLDB接続に替えればうまくいくと思うよ。

その方法を書きに示しておくから参考にしてくれ!

con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db1.mdb;"


■参考サイト
[XL2000]DAO3.6でCopyFromRecordsetを使用するとデータが欠ける
http://support.microsoft.com/kb/414048/ja
ADOの接続文字列に設定するPROVIDERとDRIVERの記述方法の違い --Access Club 超初心者 FORUM--
http://www.accessclub.jp/bbs3/0222/superbeg70904.html


土曜日, 12月 13, 2008

[VB2005]2つのDataGridのスクロールを連動させる

▼質問
2つのDataGridのスクロールを連動させるにはどうしたら良いんだ。

DataGridのScrollイベントでスクロールのValue値を設定したんだがうまくいかないんだ。



Private Sub DataGrid2_Scroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid2.Scroll
Dim obj As DataGrid = CType(sender, DataGrid)
CType(Me.DataGrid1.Controls.Item(0), HScrollBar).Value = CType(obj.Controls.Item(0), HScrollBar).Value
End Sub



スクロールだけ動いて、グリッドの内部が動かないんだ。

Refresh等のイベントを呼んでも駄目だったんだ。

どうしたらよいか教えてくれ!

▼回答
DataGridを継承した独自のクラスを作成するしか方法はないようだ。

独自クラスでスクロールを行うパブリックメソッドを作成して

引数にValue値を与えてそのメソッドの中でGridHScrolled

メソッドをコールすればいいんだ。



Public Class CustomDataGrid
Inherits DataGrid

'''
''' 水平スクロールバーのスクロールイベントを呼び出しNewValueを設定します。
'''

''' スクロールバーの新しい値
Public Sub GridHScroll(ByVal newValue As Integer)
Dim args As New ScrollEventArgs(ScrollEventType.LargeIncrement, newValue)
GridHScrolled(Me, args)
End Sub

End Class


■参考サイト
DataGrid内の指定された行までスクロールする: .NET Tips: C#, VB.NET, Visual Studio
http://dobon.net/vb/dotnet/datagrid/gridvscrolled.html

▼質問
片方に垂直スクロールがあると少しずれるんだ。

どうしたらよいか教えてくれ!

▼回答
垂直スクロールを表示させてから、それを非表示にすればいいんだ。

Visibleは設定ができないようだから、次の例のようにWidthを0に設定すればいいんだが・・・。

CType(Me.DataGrid1.Controls.Item(1), VScrollBar).Width = 0

これだけでは駄目なんだ。

もうひとつ、連動する相手側のサイズをあらかじめスクロールの幅分だけ短くしてないとうまく

いかないから気をつけてくれ!


金曜日, 12月 05, 2008

[VBA]DAO or ADO の Close

▼質問
DAOやADOのデータベース接続で失敗した時に作成しようとしたDatabaseやRecordsetの

クローズがされているかチェックしてクローズしたいんだ。

どうやったらできるか教えてくれ!

▼回答
下記にそのサンプルを示しておくから参考にしてくれ!!



Dim db As Database
Dim rs As Recordset
If (Not rs Is Nothing) Then rs.Close
If (Not db Is Nothing) Then db.Close



[VBA]DAOからADOへの移植

■参考サイト
DAO から ADO への移植 1
http://www.microsoft.com/japan/msdn/data/techmat/ado/dao2ado.aspx
Takenoff Labs >> LotusScriptからRDBのデータをやりとりする
http://takenoff.com/notes/lotusscript/20081125002012.html
accessのVBAの記述についていくつか質問です。 - 教えて!goo
http://oshiete1.goo.ne.jp/qa432565.html


水曜日, 12月 03, 2008

[VBA]QueryTable

▼質問
QueryTableって何?

どうやって使うの?

▼回答
ODBCのデータソースを使って簡単にデータベースにアクセスできる関数なんだ。

サンプルを示しておくから参考にしてくれ!



If (Worksheets(シート名).QueryTables.Count <= 0) Then
With Worksheets(シート名).QueryTables.Add( _
Connection:="ODBC;DSN=データソース;UID=ユーザ;PWD=パスワード", _
Destination:=Worksheets(シート名).Range("A1"))
.Sql = Array("SELECT * FROM " & tableName)
.Refresh BackgroundQuery:=False
End With
  else
Selection.QueryTable.Sql = Array("SELECT * FROM " & tableName)
Selection.QueryTable.Refresh BackgroundQuery:=False
End If



■参考サイト
[XL97]外部データベースにアクセスする方法
http://support.microsoft.com/kb/408061/ja

▼質問
QueryTableを使って簡単にデータベースにデータを登録したいんだ。

どうやってできるか教えてくれ!

▼回答
サンプルを示しておくから参考にしてくれ!



maxRow = Worksheets(シート名).Range("A65536").End(xlUp).row
maxCol = Worksheets(シート名).Rows(1).End(xlToRight).Column
desCol = maxCol + 1

For Each objQuery In Worksheets(シート名).QueryTables
objQuery.Delete
Next

With Worksheets(シート名).QueryTables.Add( _
Connection:="ODBC;DSN=データソース名;UID=ユーザー;PWD=パスワード", _
Destination:=Worksheets(シート名).Cells(1, desCol))
.Sql = "DELETE FROM テーブル名 WHERE 条件)
.Refresh
Do While .Refreshing
DoEvents
Loop
.Parent.Names(.Name).Delete
.Delete
End With

Worksheets(シート名).Cells(1, desCol).ClearContents

For i = 2 To maxRow
strValue = ""
For j = 1 To maxCol
If (strValue <> "") Then strValue = strValue & ", "
strValue = strValue & "'" & Worksheets(シート名).Cells(i, j).Value & "'"
Next j
With Worksheets(シート名).QueryTables.Add( _
Connection:="ODBC;DSN=データソース名;UID=ユーザー;PWD=パスワード", _
Destination:=Worksheets(シート名).Cells(1, desCol))
.Sql = "INSERT INTO テーブル名 VALUES(" & strValue & ")"
.Refresh
Do While .Refreshing
DoEvents
Loop
.Parent.Names(.Name).Delete
.Delete
End With
Worksheets(シート名).Cells(1, desCol).ClearContents
Next i



■参考サイト
■QueryTables.Add/.Deleteと.Names().Delete - 半角チルダ
http://blog.goo.ne.jp/end-u/e/2fd0b68b8cb29e4b80dc7182a800fc9c


▼質問
Refreshで次のエラーが出るんだ。

「バックグラウンドでデータが更新中であるため、この操作は行えません。」

どうやったら回避できるか教えてくれ!

▼回答
それは、SQLの処理が終わる前に実行しているSQLの処理を止めるような

処理が実行されているからなんだ。

だから、SQLの実行が終了したのを確認してから次の処理を実行しなくてはいけないんだ。

そのサンプルを次に示しておくから参考にしてくれ!

Refreshの後に次のコードを書けばいいんだ。



Do While .Refreshing
DoEvents
Loop



This page is powered by Blogger. Isn't yours?