プロが教えるわが家の防犯対策術!

使用環境は VB2005express ,excel2000 です。
VB6.0からVB2005へコンバートをしているのですが、excelのピボットテーブルの操作のところで
上手くいきません。具体的には、行列のタイトルを書き込むところまでは上手くいったのですが
中身のデータ貼り付けのところがわかりません。
宜しくお願い致します。
 
【以下VB6.0】 一部抜粋

With xlSheet.PivotTables("テーブル")

.PivotFields("場所").Orientation = xlRowField 
.PivotFields("日").Orientation = xlColumnField
’↑ここまではOKですが、以下が上手くいきません。
.AddDataField xlSheet.PivotTables("テーブル").PivotFields("数"), "データの個数 / 数",xlCount
.PivotFields("データの個数 / 数").Function = xlSum
.AddDataField xlSheet.PivotTables("PV_MECH").PivotFields("重量"), "デ
ータの個数 / 重量", xlCount

End With


【以下VB2005】 

With BOOK.Worksheets(SHEETNAME).PivotTables("PV_MECH")
.PivotFields("場所").orientation = Excel.XlPivotFieldOrientation.xlRowField
.PivotFields("名").orientation = Excel.XlPivotFieldOrientation.xlRowField
 ’↑ここまではOKですが、以下が上手くいきません。
'.PivotFields("数") = Excel.XlPivotFieldCalculation.xlPercentOfTotal '×
.PivotFields("数").orientation = .PivotFields("数") '?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

VB から Excel の操作って、VB 側では具体的な処理はしていなくって、Excel.exe に丸投げ


です。何が言いたいかって言うと、VB6.0 と VB2005 で基本的にコマンドは変わらないと
いうことです。
特に
> excel2000
てことは Excel 9.0 Object Library を参照するのだったと思うけど、全く同じライブラリを
使う事になるのでコマンドは全く同じでもいいくらいの話です。
VB が(VB6.0 も VB2005 も)色々と省略できてしまうので分からなくなる人が多いですが、
VB6 の方で省略されている名前空間を VB2005 では Imports で入れてしまうのも手です。

逆に VB6.0 → VB2005 で一番問題になるのが、プロセスが終了しない問題です。
http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm
実害があるので、プログラムが完成してから問題が顕在化して困る人も多いです。
提示のコードではプロセスが残って不思議ではないので、知らないのであれば勉強して
おくべきでしょう。

> 中身のデータ貼り付けのところがわかりません。
コードは分かっているわけだから、何が分からないのかもう少し明確に書くべきでは?
Excel のライブラリで定義されている定数の場所が分からないだけでは?
VB6 の方でコードを右クリックして[定義(D)]に飛ぶとか、もう最初からオブジェクト
ブラウザで検索して調べればいいのでは?
http://hanatyan.sakura.ne.jp/dotnet/Excel03.htm# …

この回答への補足

早速のご回答ありがとうございます。
またプロセスが終了しない件も補足アドバイスありがとうございます

理解不足と説明不足で申し訳ありません。

AddDataをオブジェクトブラウザで 検索したところ 下記ワードが見つかりました。

Excel.XlBuiltInDialog.xlDialogChartAddData

上記文をwith文から外し 文頭にもってきたところ、「式はメソッドではありません」 と出てきます。

次にPivotTableの後ろにもってきたところ、(文法上の?)エラーは無くなりましたが
実行したところ、「公開メンバ 'Excel' は型 'PivotTable' に見つかりませんでした。」
と出てきます。

安易ですが、'EXCEL'を外すと下記のメッセージでした。
公開メンバ 'XlBuiltInDialog' は型 'PivotTable' に見つかりませんでした。

ちなみに、下記のように記述すると一応データの入ったピボットテーブルは表示されます。
.PivotFields("数").Orientation = Excel.XlPivotFieldOrientation.xlDataField '○


Q AddDataField の VB.netでの 使い方がわかりません。

 何度も申しわかりませんが宜しくお願い致します。

補足日時:2012/03/01 14:45
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

結局力不足で EXCELにマクロを組み込みVBから、そのEXCELマクロを
実行することにしました。

ありがとうございました。

お礼日時:2012/03/07 22:24

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcel VBAで複数シートをコピーする

Excel VBAで複数のシートを新たらしいブックにコピーする方法が分かりません。

一応、Selectで全てのシートを選択し
コピーする方法は分かるのですが
出来ればSelectなどの画面遷移をプログラム内に含ませたくありません

シートは n件存在します。
ご存知の方がおられましたら
ぜひ、教えて頂けないでしょうか?

Aベストアンサー

すいません、勉強不足でした。
ただ単純に「全てのシートを選択」し「新規ファイルにコピー」という動作であれば、
sheets.Select
sheets.Copy
だけでできました。

QExcel ファイルに保存すると実行時エラーになる

こんにちは。宮本と申します。VB6(SP5)で、
プログラミングをしております。
下記の様にプログラミングをしましたが、どうしても
[実行時エラー’1004’ test_1.xlsにアクセスできません]と、なります。
c:\test.xls は、元々ある事を前提とし、c:\test_1.xlsに上書きをしたいのです。
宜しくお願い致します。

Dim wApp As Excel.Application
Dim wExl As Object

Set wApp = CreateObject("Excel.Application")

Set wApp = CreateObject("Excel.Application")
Set wExl = wApp.Workbooks.Open("c:\test.xls")

wExl.Worksheets(1).Cells(1, 1).Value = 3000

wExl.Application.Visible = False
wExl.Application.DisplayAlerts = False
wExl.SaveAs "c:\test_1.xls" <---ここで、エラー

こんにちは。宮本と申します。VB6(SP5)で、
プログラミングをしております。
下記の様にプログラミングをしましたが、どうしても
[実行時エラー’1004’ test_1.xlsにアクセスできません]と、なります。
c:\test.xls は、元々ある事を前提とし、c:\test_1.xlsに上書きをしたいのです。
宜しくお願い致します。

Dim wApp As Excel.Application
Dim wExl As Object

Set wApp = CreateObject("Excel.Application")

Set wApp = CreateObject("Excel.Application")
Set wExl = wApp.Workbooks....続きを読む

Aベストアンサー

Set wApp = Nothing
wExl.Close True

最後に追加すればOKだと思います。

QVBから参照できないCのDLLを使用する方法

Cで作成されたDLLがあるのですが、VBから参照設定しても「指定されたファイルへの参照は登録できません。」と怒られます。
そのようなDLLをどうしてもVBから使用したい場合はどうすれば良いでしょうか?

直接は無理だとしても、間に何かをかましてできると思うのですが、良い方法があれば教えてください。

ちなみに VB6 です。

よろしくお願いします。

Aベストアンサー

>あります。
>とりあえず、DLLファイルと同様に C:\WINNT\System32 フォルダへ格納しました。

となるとやはりVBから直に呼び出すことはできません。
DLLでもスタティックリンクで使うものがあり
VC++からは呼び出すことができます。
そこでVBから呼び出すには間にクッションをおく必要があります。
VB←VC++で作ったDLLを呼び出すDLL(クッション)←元のDLL

.hや.libはVC++でスタティックリンクする際に必要となる
ファイルでVBからは使用できません。

QVB.NETのDataGridで、選択行の特定の列の内容を取得したい

タイトルにあるとおり、DataGridを使用している場合、実行時に選択された行の特定の列の内容を取得するにはどのようにすればよいのでしょうか?

DataGridは複雑で、まだよくわかっていません。
よろしくお願いします。

Aベストアンサー

選択している行番号は、dataGrid1.CurrentRowIndexでわかります。
行、列を指定して各セルにアクセスするには、
dataGrid1(行番号,列番号)でいいので
dataGrid1(dataGrid1.CurrentRowIndex,列番号)
で選択されている行の特定の列の内容を取得できます。
註:番号は、0始まり

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

Qvb.netで画面のコントロールId名を変数で動的に制御し処理する方法

以下のような処理がしたいです。
実現方法をご存知でしたらご教授下さい。

画面のコントロールText1~Text3があります。
For~Nextでこのコントロールに値をセットしたいです。

For i = 1 To 3
  Texti.Text = i
  ※このiのTextの後ろのiの部分を1~3と動的に変更し、各Textに値を設定したいです。
Next

Aベストアンサー

こんにちは、webでは、findcontrolを使うみたいです。

いかに、参考URLから、引用すると
***********************************
Dim L, U, i As Integer
Dim tx As System.Web.UI.WebControls.TextBox
L = LBound(dat)
U = UBound(dat)
For i = L To U
'コントロール名を探し出す
tx = FindControl("TextBox" & CStr(i))
'見つかったコントロールのTextプロパティに代入
tx.Text = dat(i)
Next

******************引用終わり*******
このようにすると良いみたいです。
asp findcontrolで、検索すると、
結構ヒットするみたいです。

参考URL:http://natchan-develop.seesaa.net/

QVBAでループ内で使う変数名を可変にできないか。

次のような処理で・・・、
 Cnt_1 = Cnt_1 + 1
 Cnt_2 = Cnt_2 + 1
   :
実際には一つの変数(Cnt_1など)ごとに処理がもっとあるのですが、
変数はCnt_1からCnt_5まであり、すべて同じ処理をするので、変数名を
可変にして同じループで書けないかと思うのですが、可能でしょうか?

たとえば、
For I=1 to 5
 Cnt_I = Cnt_I + 1
Next I
と書くと、「Cnt_I」という変数の処理になってしまいますね・・。

なにかいい方法はないでしょうか?

Aベストアンサー

こんばんは。

配列変数を使えばいいでしょう。
変数を5個用意して、すべて1~5まで足すという処理の場合です。
Dim Cnt(4) As Integer
Dim i As Integer
Dim j As Integer
For i = 0 To 4
For j = 1 To 5
Cnt(i) = Cnt(i) + j
Next j
Next i
どうでしょうか。

Qマクロでピボットテーブルを作成するには?

現在、仕事の関係でエクセルを多用しており、
仕事を楽にするためマクロを勉強しています。

インターネットを駆使して、下記のコードを作ってみたのですが、
【】の範囲で「参照が正しくありません」とエラーが出てしまいます。
どこがおかしいかご教授いただけますでしょうか?

自動記録でベースを作った後、範囲の指定を
VBA上で行ったつもりです。
データの集計は「A」シートのA~G列まで、行は不定なので、
「A」シートの一番下までのデータを集計するようにしたいです。
縦に「要素」、内容に「金額」を集計するよう、
ピボットを記録しています。

Sub ピボットを行う()
'
Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select

【 ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"A!Selection.Address").CreatePivotTable TableDestination:="", TableName:= _
"ピボットテーブル1"】
ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
ActiveSheet.Cells(3, 1).Select
ActiveSheet.PivotTables("ピボットテーブル1").SmallGrid = False
ActiveSheet.PivotTables("ピボットテーブル1").AddFields RowFields:="要素"
With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("金額")
.Orientation = xlDataField
.Caption = "合計 : 金額"
.Function = xlSum
End With
End Sub

よろしくお願いいたします。

現在、仕事の関係でエクセルを多用しており、
仕事を楽にするためマクロを勉強しています。

インターネットを駆使して、下記のコードを作ってみたのですが、
【】の範囲で「参照が正しくありません」とエラーが出てしまいます。
どこがおかしいかご教授いただけますでしょうか?

自動記録でベースを作った後、範囲の指定を
VBA上で行ったつもりです。
データの集計は「A」シートのA~G列まで、行は不定なので、
「A」シートの一番下までのデータを集計するようにしたいです。
縦に「要素」、内容に「...続きを読む

Aベストアンサー

こんにちは。
>(SourceType:=xlDatabase, SourceData:="A!Selection.Address")
ここを
(SourceType:=xlDatabase, SourceData:= Selection.Address(external:=True))
と変更すればできます。

ついでに、SelectやActivateは選択状況に依存し、不安定です。
ActiveWorkbookは仕方ないのかもしれませんが

Sub sample()
  Dim r As Range

  With ActiveWorkbook
    With .Sheets("A")
      Set r = .Range("G1", .Range("A1").End(xlDown))
    End With
    With .PivotCaches.Add(SourceType:=xlDatabase, SourceData:=r.Address(external:=True))
      With .CreatePivotTable(TableDestination:="")
        .AddFields RowFields:="要素"
        With .PivotFields("金額")
          .Orientation = xlDataField
          .Caption = "合計 : 金額"
          .Function = xlSum
        End With
      End With
    End With
  End With
  Set r = Nothing
End Sub

などとしたほうが良いかも^ ^
QNo.2097393も参考にしてみてください。

こんにちは。
>(SourceType:=xlDatabase, SourceData:="A!Selection.Address")
ここを
(SourceType:=xlDatabase, SourceData:= Selection.Address(external:=True))
と変更すればできます。

ついでに、SelectやActivateは選択状況に依存し、不安定です。
ActiveWorkbookは仕方ないのかもしれませんが

Sub sample()
  Dim r As Range

  With ActiveWorkbook
    With .Sheets("A")
      Set r = .Range("G1", .Range("A1").End(xlDown))
    End With
    With .PivotCa...続きを読む

QDataTableから条件を満たした行を別のDatatableへコピーしたい

VC#2005とSQLServer2005ExpressEditionでWindowsアプリケーションを作成しています。

データベースの中から1つのマスタテーブルのデータを呼び出すのにTableAdapterを使ってDataTableにデータをバインドしました。
そこから条件を満たしている行をすべて抽出して同じ型のDataTableにデータをコピーしたいのです。

ですから、DataTableは2つ用意しています。1つは上記の通りデータをバインドしていますが、もう1つは宣言しただけなのでまだ空っぽの状態です。
DataTableにはカラムが3列あり、その中の1列をグループIDとしています。
条件としてはグループIDが同じであるということです。
やりたいことは条件を満たしている行をすべて抽出して空のデータテーブルにコピーすることです。

どなたかご存知の方いらっしゃれば教えてください。
よろしくお願いします。

Aベストアンサー

C#だったんですね … さほど変わりないと思いますが

お使いのコードが提示されていないのでこちらで適当な変数をでっち上げております
現在お使いのコードを支障の無い範囲で提示しましょう

//元のデータテーブルがdtSourceとすると
// テーブル構造をコピー
DataTable dt = dtSource.Clone();
DataRow r = null;
foreach( DataRow dtRow in dtSource.Select("選択するための文字列"))
{
  r = dt.NewRow();
  for( int n = 0; n < dtRow.ItemArray.Length; n++ )
  {
    r[n] = dtRow[n];
  }
  dt.Rows.Add( r );
}
といった具合になると思います

# 前回の投稿中のstSorceはdtSourceの単なるミスです

QVBA(エクセル)で自動的にボタンをクリックさせるには

いつもお世話になっております。
下記のことがしたいのですがどうやって良いのかがわからなくって困っております。

やりたいこと。
AブックとBブックが有るとします。(双方ともエクセルファイル)
エクセルのVBAで、Aブックのシート上のコマンドボタンを押すと
Bブックのシート上のコマンドボタンをクリックするという動きを
VBAでさせたいのですがどうしてもクリックさせることができません。

試したこと。
初めは、AのボタンをクリックするとBのボタンをセレクトして
SendKeysでENTERを送ってみたりしたのですがうまくいきませんでした。

何かやり方が有りましたら、お教えいただけませんでしょう。
宜しくお願いいたします。

Aベストアンサー

Privateスコープを変更しない場合、Application.Runメソッドを使う手もあります。
Application.Run "'C:\Book1.xls'!Sheet1.CommandButton1_Click"
※『Sheet1』の部分はシートモジュールのオブジェクト名になります。

ですが、Bブックのボタン_Clickの中味を標準モジュールに置いて、
AブックのボタンとBブックのボタンと、両方から実行できるようにしておくほうが良いような気もしますね。

(コマンドボタンが[フォーム]ボタンの事だったら、同じマクロを[マクロの登録]するだけの話?)


人気Q&Aランキング