CSVファイルから構造体にデータを取り込んでから、そのデータをExcelにセルを指定して取り込むことは可能ですか?
構造体には取り込めたのですが、そこからExcelにデータを遅れません。
アドバイス下さい!
お願いします!

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

A 回答 (2件)

プロジェクトの参照設定で


Microsoft Excel x.0 Object Libraryを指定
(x.0はエクセルのバージョンによって、違う数字です)

以下のコードでデータの出力が可能です。
Sub Main()
  Dim xlApp  As Excel.Application
  Dim xlBook As Excel.Workbook
  Dim xlSheet As Excel.Worksheet
 
  'エクセル起動
  Set xlApp = New Excel.Application
  '(1)ワークブックを開く場合
  xlApp.Workbooks.Open ("c:\test.xls")
  '(2)ワークブックを新規で追加する場合
  xlApp.Workbooks.Add
  
  '現在カレントのブックを対象とする
  Set xlBook = xlApp.ActiveWorkbook
 
  'カレントブックのシート1を指定
  Set xlSheet = xlBook.Worksheets(1)
  xlSheet.Select
 
  'エクセルへの出力方法(1)
  xlSheet.Cells(2, 3).Value = "あ"
  'エクセルへの出力方法(2)
  xlSheet.Range("B2").Value = "い"
 
  'エクセルアプリケーション表示
  xlApp.Visible = True
 
  '閉じる時の「保存しますか」を表示させない
  xlBook.Saved = True
 
  Set xlSheet = Nothing
  Set xlBook = Nothing
  Set xlApp = Nothing
End Sub


構造体は独自で宣言した構造ですよね。それはエクセルじゃなくても、独自の構造体は他への流用は難しいと思います。
エクセルには一つずつ書き込むか、構造体ではなく配列にして、エクセルに出力する時に範囲指定をして、まとめて出力する方法があります。

'エクセルへの出力方法(2)をちょっと改造して
Range(開始のセル,終了のセル).Value = 配列変数
といった書式です。
    • good
    • 0
この回答へのお礼

ありがとうございました。
この通りにやって無事解決しました。

お礼日時:2001/11/26 14:33

構造体をEXCELは理解してくれないでしょうが。



構造体のメンバーをCHR(9)で連結して送信すればよかったような記憶があります。
    • good
    • 0

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

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

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

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

Qフェッチでデータが上書きされます

こんにちは。perl + html + mysqlのコーディングで悩んでいるので質問させてください。
複数フィールド+複数件(例えば13フィールド+3件)のデータがテーブルに存在する時、SELECT文でそのデータを取得したいとします。
分からない所はフェッチの部分なのですが、

$i=0;
while($selectdata[$i]=$sth->fetchrow_arrayref(
$i++;
}

----[中略]-----

for($i=0;$i<$rows;$i++){
print "[SELECTデータ->$i]\n";
for($j=0;$j<13;$j++){
print "$selectdata[$i][$j]\n";
}
print "<BR>\n";
}

表示されたデータが3件とも、3番目のデータが表示されます。
フェッチで取得したデータを配列にいれる段階で、上書きしているような気がするのですが、具体的にどこが悪いか分かりません。
ご教授お願いいたします。

こんにちは。perl + html + mysqlのコーディングで悩んでいるので質問させてください。
複数フィールド+複数件(例えば13フィールド+3件)のデータがテーブルに存在する時、SELECT文でそのデータを取得したいとします。
分からない所はフェッチの部分なのですが、

$i=0;
while($selectdata[$i]=$sth->fetchrow_arrayref(
$i++;
}

----[中略]-----

for($i=0;$i<$rows;$i++){
print "[SELECTデータ->$i]\n";
for($j=0;$j<13;$j++){
print "$selectdata[$i][$j]\n";
}
...続きを読む

Aベストアンサー

いや、
>$i=0;
>while($selectdata[$i]=$sth->fetchrow_arrayref(
>$i++;
>}
これを

my @selectdata;
while ( my $array_ref = $sth->fetchrow_arrayref ) {
push @selectdata, [ @{$array_ref} ];
}

みたいな感じで受け取ったリファレンスを一旦デリファレンスして、
その要素を含む新しい無名配列を生成すれば良いと思いますけど。

QCSVから構造体へ代入

お世話になります。
Private Type TestRecord
Col1 As String * 255
Col2 As String * 255
Col3 As String * 255
End Type
Sub ボタン1_Click()

Dim FName As String
Dim FileNo As Integer
Dim LineData As String
Dim TestRec() As TestRecord

FileNo = FreeFile
'選択したファイル名の取得
FName = Application.GetOpenFilename("CSV ファイル (*.CSV),*.CSV")
If FName = "False" Then
Exit Sub
End If

Open FName For Input As #FileNo

Do Until EOF(FileNo)
i = i + 1
Line Input #FileNo, LineData
ReDim TestRec(i)
TestRec() = Split(LineData, ",")
Debug.Print buf
Loop
Close #FileNo
End Sub

ファイルの中身
"テストID1","テスト姓1","テスト名1"
"テストID2","テスト姓2","テスト名2"

以上のコードを実行するとTestRec() =~の部分で型が一致しません
とエラーが出てしまいます。
よき解決方法があれば教えてください。宜しくお願いします。

お世話になります。
Private Type TestRecord
Col1 As String * 255
Col2 As String * 255
Col3 As String * 255
End Type
Sub ボタン1_Click()

Dim FName As String
Dim FileNo As Integer
Dim LineData As String
Dim TestRec() As TestRecord

FileNo = FreeFile
'選択したファイル名の取得
FName = Application.GetOpenFilename("CSV ファイル (*.CSV),*.CSV")
If FName = "False" Then
Exit Sub
End If

Open FName For Input As #Fil...続きを読む

Aベストアンサー

Split()はString配列を返してきます。
ですので、受け取る側がString配列でないので
”型が一致しません”と怒られるのです。

Str() as String
Col as Collection
Do Until EOF(FileNo)
i = i + 1
Line Input #FileNo, LineData
Str() = Split(LineData, ",")
Debug.Print buf
Col.Add(Str)
Loop
Close #FileNo

ReDim TestRec(i)
vnt as Variant
lCnt as Long

For Each vnt In Col
TestRec(lCnt).Col1 = vnt(0)
TestRec(lCnt).Col2 = vnt(1)
TestRec(lCnt).Col3 = vnt(2)
lCnt = lCnt + 1
next

QiPhone「データの取得方法」について

こんにちは。先々月くらいにiPhoneを購入した者です。
iPhoneの「データ取得方法」について質問があります。
予想外にパケット通信料の請求が多かったため、サファリや天気など通信
を必要とするアプリを使用しないようにし、「データの取得方法」をフェ
ッチの15分ごとに変更しました。ただ、「データの取得方法」のプッシュ
とフェッチの違いがよく分かっておらず、プッシュをONにしたままが通信
の節約になるのか、それともフェッチの15分間隔(若しくは30分)が良い
のか分かりません。メールの量は送受信併せて1日30~40で、使わない時
は全く使いません。ただ緊急を要するメールもあるので手動でのメール
取得は考えていません。
前述したように、プッシュとフェッチどちらがパケットの節約になるのか
教えていただきたいと思います。その他パケット通信節約のための小ネタ
などがあれば教えてください。
よろしくお願い致します。

Aベストアンサー

ExchangeServerやMobileMeなど、サーバ側から自動的に送られてくるメールがプッシュメール、通常のメールのように自分から取りに行くメールがフェッチです。
プッシュであれば一定時間ごとにメールボックス確認に行く手間がないため、その分安くはなります。
が。通常のメールをプッシュで使うことはできないので、基本的に選択肢はあってないようなものです。
ExchangeServerやMobileMe使ってなければ、回答としては変わらないってことになります。

ただ、基本的に通信をおこないまくる携帯なので、パケット通信はかかるもんだと思っておいたほうがいいです。

Q構造体→文字列→構造体 をする方法

VB6.0の話です。

 不特定の構造体を文字列(String)に格納し、これを最初の構造体に戻す事はできませんか?

 具体的には「共有メモリを使い構造体を文字列にして格納>別ウインドウで文字列を取得して構造体に戻す」と言う事をやりたいんです。
 共有メモリに不特定の構造体をいれる方法でもいいんですが…VALIANTだとサイズが大きすぎて実用性がありませんし、違う主旨の質問をするのも良くないので回答はあくまで「構造体→文字列→構造体 をする方法」と言う事でお願いします。

Aベストアンサー

APIを使えば出来ます。

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (cStr1 As Any, cStr2 As Any, ByVal iLen As Long)


構造体→文字列
Call CopyMemory(strB, ByVal typeA, Len(typeA))

文字列→構造体
Call CopyMemory(typeA, ByVal strB, Len(typeA))

ただし構造体のメンバに配列があると使えません(VBの配列はメモリを連続してとらない為、メモリーリークします)。

また構造体の中身は string *5 などの固定長である必要があります。

以上です。

QPL/SQL内の共通関数の引数にフェッチしたレコードごと渡すのは可能?

カーソルでレコードを検索し、フェッチします。
その後、INSERTする共通関数を呼ぶのですが、
フェッチしたレコードの値でINSERTしたいのです。
引数で1コずつ渡すと数が多いので、フェッチしたレコードごと引数で渡せないかと
それって可能ですか?

Aベストアンサー

こんにちは。

 共通関数の引数にカーソルのレコード型(cursor_name%ROWTYPE)を
使用すればよいと思います。
ただこの場合は、汎用性に乏しいのですが・・・。

 よって個人的にはINSERT先のテーブル名のレコード型が
お勧めです。[テーブル名%ROWTYPE]
 カーソルのレコードから移し変える処理が必要になりますが、
登録処理が簡単に記述できますネ。
(INSERT INTO TAL_NAME VALUE record_type;)

Qtextデータをexcelに取り込む

VBA初心者です。
テキストファイルのデータをEXCELに自動取り込みしてcsv形式で保存したいのですが、テキストデータが65536行を超えているのでWorkbooks.OpenTextでは65537行以後が取り込めません。インターネットで調べた方法FileSystemObjectでテキストデータを1行ごとに取り込もうと思ったのですが、「ユーザー定義型が定義されていません」のエラーメッセージが表示されて旨くいきません。FileSystemObjectの使い方が良く解らないので誰か教えてください。
なお、テキストデータは1行に8フィールド有りますので、取り込んだデータはフィールドごとに8列に分けたいのですが、その方法も解りません。
テキストデータサンプル(1行分)
2004/1/5101 i 10787 10862 1078510825 726690000
以下に試みた方法を記述します。
Option Explicit
Sub READ_TextFile3()
Const cnsFILENAME = "D:\Test\test1.txt"
Dim FSO As New FileSystemObject ' FileSystemObject
Dim TS As TextStream ' TextStream
Dim strREC As String ' 読み込んだレコード内容
Dim GYO As Long ' 収容するセルの行
Set TS = FSO.OpenTextFile(cnsFILENAME, ForReading)
GYO = 1
Do Until TS.AtEndOfStream
strREC = TS.ReadLine
GYO = GYO + 1
Cells(GYO, 1).Value = strREC
Loop
TS.Close
Set TS = Nothing
Set FSO = Nothing
End Sub

VBA初心者です。
テキストファイルのデータをEXCELに自動取り込みしてcsv形式で保存したいのですが、テキストデータが65536行を超えているのでWorkbooks.OpenTextでは65537行以後が取り込めません。インターネットで調べた方法FileSystemObjectでテキストデータを1行ごとに取り込もうと思ったのですが、「ユーザー定義型が定義されていません」のエラーメッセージが表示されて旨くいきません。FileSystemObjectの使い方が良く解らないので誰か教えてください。
なお、テキストデータは1行に8フィールド有ります...続きを読む

Aベストアンサー

参照設定しない場合は As Objectで宣言して置きます

Dim TS as Object
Const ForReading = 1
Set TS = FSO.OpenTextFile( csnFileName, ForReading )

といった具合にします

参照設定をすれば メソッドや定数などが インテリセンスで入力可能ですが DLLのバージョンが違うなど理由で全ての環境で同じソースで動作が出来ない場合があります
そのような場合に 上記のように記述する事があります

開発時は参照設定をして開発を行い、完成後に AS ObjectとCreateObjectに置き換えます

Qデータハザードについて(パイプライン)

こんにちは。コンピューターアーキテクチャのパイプラインの項目の勉強をしていて、データハザードについて分からない問題があったので、質問させていただきます。

以下の二つのパイプラインの動作がよくわかりません。


基本的にはフォワーディングによって解決するデータハザードですが、メモリアドレス生成のときはフォワーディングは間に合わないので、結果の格納(W)が終わらないと命令フェッチ(F)ができないそうです。つまり
add r1, r2 .r3    F D E W
lw r4, dpl(r1)         F X X DEW

となるそうです。しかし
ld r2, c(r1)
subi r1, r1, 4
のように「ロード命令の次に算術命令」という順番ですと、ハザードは生じないそうです。


下の場合は上と違いr1のデータを更新するだけなのでフォワーディングによって改善ができるという解釈でよろしいのでしょうか?
上は本に書いてあったものなのですが、下のはインターネットから調べたものなのであっていない可能性があるので質問しました。

ちなみに両者ともロード命令の場合なのですが、ストア命令でも同じような振る舞いになるのでしょうか?

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

こんにちは。コンピューターアーキテクチャのパイプラインの項目の勉強をしていて、データハザードについて分からない問題があったので、質問させていただきます。

以下の二つのパイプラインの動作がよくわかりません。


基本的にはフォワーディングによって解決するデータハザードですが、メモリアドレス生成のときはフォワーディングは間に合わないので、結果の格納(W)が終わらないと命令フェッチ(F)ができないそうです。つまり
add r1, r2 .r3    F D E W
lw ...続きを読む

Aベストアンサー

「データハザード」ってのは, 端的にいうと「ある命令で得られた結果をそのあとの命令で使うために, 前の命令が終わるまで『あとの命令』の実行を止めなきゃならない」って状態.

ここに挙がっている例だと, 上のやつは add で得られた r1 を次の lw で使うから, 「r1 が得られるまで lw を実行できない」ということになる. ところが下の場合には ld の結果である r2 はそのあとで使わないから, ここで見えている分についてはハザードは生じていない (さらにあとの命令で r2 を使っていたら, ld とのタイミングでハザードが起きるかもしれん). あるいは,
ld r1, c(r2)
subi r1, r1, 4
なら明らかにハザードが起きる.

そして, はっきりいうと「ロードの場合はメモリからレジスタにデータを移すので算術命令のデータがメモリに書き込まれるまではストールしてしまう」というのは何をいっているのかよくわからん. もっというと「算術命令のデータがメモリに書き込まれる」とか「算術命令がメモリにデータを書き込む」とかの意味がわからん. どういうこと? どうせ MIPS かなんかの RISC なんだろうから, そもそも「算術命令の結果」がメモリに書き込まれることはありえないよ.

それぞれの命令を実行するために「確定していなければならないデータ」がなんなのか, そしてそれらが「どのタイミングで確定するのか」を確認してください. ここの例だと「add の結果がどこで出てきてどのタイミングにフォワーディングできるのか」とか「メモリアドレスをどのタイミングで生成するのか」とか, です.

とはいえ, 上の例で「どのステージが同時に起きているのか」がわからないんだよね.... add の D と lw の F が同じクロックと思っていい?

参考URL:http://akademeia.info/index.php?%A5%D1%A5%A4%A5%D7%A5%E9%A5%A4%A5%F3%A5%CF%A5%B6%A1%BC%A5%C9

「データハザード」ってのは, 端的にいうと「ある命令で得られた結果をそのあとの命令で使うために, 前の命令が終わるまで『あとの命令』の実行を止めなきゃならない」って状態.

ここに挙がっている例だと, 上のやつは add で得られた r1 を次の lw で使うから, 「r1 が得られるまで lw を実行できない」ということになる. ところが下の場合には ld の結果である r2 はそのあとで使わないから, ここで見えている分についてはハザードは生じていない (さらにあとの命令で r2 を使っていたら, ld とのタイミングで...続きを読む

QEXCEL VBAの構造体検索について

エクセルVBAを友人に頼まれ修正しているのですが、
構造体内検索ができません。

ネットを検索しても解決にはつながらなかったので質問させていただきました。
excelは2010、OSはwindows8です。

よろしくお願いします。

Aベストアンサー

#既に種々の回答が付いていますが、お示しのコードの「図」を拝見して考えられることを少し。


●1)先ず、「p=array.indexof(str,"い")」のところが赤くなっていますが、これはコンパイルエラーですよね。
 「array」という言葉は予約語(Array 関数)であるため、変数としては使えないはずです。
 試しに、「Dim array as Object」などと書こうとすると、「array」の部分が選択された状態で、「コンパイルエラー: 修正候補: 識別子」と表示されます。
http://officetanaka.net/excel/vba/error/compilation_error/error_3.htm


●2)次に、「indexof」という関数自体についてですが、
Sub Macro1()
  Dim myAL As Object
  Set myAL = CreateObject("System.Collections.ArrayList")
  For i = 1 To 3
    myAL.Add Mid("あいう", i, 1)
  Next i
  p = myAL.indexof("い", 0) + 1
  MsgBox p & "番目"
End Sub
みたいな使い方なら動かすことはできなくはありません。

 しかし、pucho3338 さんがお示しのコード
p = indexof(str, "い")
に書かれているような、第1引数が「配列」、第2引数が「配列の要素」となるっているものが、どの言語の [IndexOf メソッド] なのかが判りかねます(言語によって引数の数や種類が異なる)。
http://social.msdn.microsoft.com/Search/ja-JP?query=indexof&ac=4

 しかも、次行には、
p = array.indexof(str, "い")
というように、関数の前にオブジェクト(array)が配置されていますが、(1)で書きましたように、この行も動かないはずです。

 この2行を拝見しただけでも、まともに動くコードとは思えませんので、これは、「友人に頼まれ修正」する前のコードではなくて、pucho3338 さんご自身が、修正時点でつまづかれたところだけを抜き書きされたコードではないかと存じますが、いかがでしょうか?


●3)この「コンパイルエラー: Sub または Function が定義されていません。」エラーが出ないようにするためには、下記のいずれかの処置がされている必要があるかと存じます。
  ・何かのライブラリに参照設定を施す。
  ・[CreateObject 関数] で ActiveX オブジェクトへの参照を作成する。
  ・別途、下記のようなユーザー定義関数が定義されている。

Function indexof(myArr, element)
  For i = 0 To UBound(myArr)
    If myArr(i) = element Then Exit For
  Next
  indexof = i + 1
End Function


●4)しかし、
p = array.indexof(str, "い")
という書き方から見ると、求める「p」は「2」ではないかと存じますが、その「答え」が欲しいだけでしたら、わざわざ関数を作らなくても、
p = Application.Match("い", str, 0)
でイケルかと存じますが、実は、「IndexOf メソッド」だけではなくて、「Sort メソッド」や「Contains メソッド」などが使いたいというようなことでしたら、
http://social.msdn.microsoft.com/Search/ja-JP?query=arraylist&refinement=108%2C117&ac=4
に検索された「ArrayList クラス」を使うことになろうかと存じます。

#既に種々の回答が付いていますが、お示しのコードの「図」を拝見して考えられることを少し。


●1)先ず、「p=array.indexof(str,"い")」のところが赤くなっていますが、これはコンパイルエラーですよね。
 「array」という言葉は予約語(Array 関数)であるため、変数としては使えないはずです。
 試しに、「Dim array as Object」などと書こうとすると、「array」の部分が選択された状態で、「コンパイルエラー: 修正候補: 識別子」と表示されます。
http://officetanaka.net/excel/vba/error/compilation_...続きを読む

Q「スーパーフェッチ」と「プリフェッチ」の違い

Vistaで「スーパーフェッチ」機能とはよく使用するアプリケーションをメモリにプリロードするとありますが、XPの「プリフェッチ」機能にも似たような記載がありました。
この両者の機能で決定的な違いは何処でしょうか?
ご存知あれば教えて頂ければ幸いです。

Aベストアンサー

どのデータをプリロードするかを選択する戦略が賢くなったということです.

XPでは単に最も最近使ったデータを優先的に選んでいましたが,Vistaでは今までの履歴を学習してより最適な(次に必要になりそうな)データを選ぶようになりました.

参考URL:http://pc.watch.impress.co.jp/docs/2007/0226/mobile366.htm

Q【VBA】ExcelマクロでCSVファイルに保存したデータが""で囲まれてしまう

添付図のような、Excel2003で作成した表内のデータを
CSVで保存するマクロを作成したのですが、
図のように、CSVファイルに「""」で値が囲まれた状態で、
保存されてしまいます。

下記にマクロを記載しますので、
どうすれば文字列が「""」で囲まれずに、
カンマ区切りだけのデータで出力されるのか、
ご存知の方おられましたら、ご教示お願い致します。

Sub csv保存()
Dim フォルダ名 As String
Dim パス名 As String
Dim ファイル名 As String
Dim データ As Variant
Dim 行数 As Long, 列数 As Integer
Dim i As Integer, j As Long, k As Long

ファイル名 = "test.csv"
フォルダ名 = "csv"
パス名 = ActiveWorkbook.Path & "\" & _
フォルダ名

'csvフォルダが存在しなければ作成する
If Dir(パス名, vbDirectory) = "" Then
MkDir パス名
End If
ChDir パス名

Open ファイル名 For Output As #1

For i = 1 To Worksheets.Count
Worksheets(i).Activate
Worksheets(i).Cells(1, 1).Select
ActiveCell.CurrentRegion.Select
行数 = Selection.Rows.Count
列数 = Selection.Columns.Count

For j = 1 To 行数
For k = 1 To 列数 - 1
データ = Selection.Cells(j, k) _
.Value
Write #1, データ;
Next k
Write #1, Selection.Cells(j, 列数) _
.Value
Next j
Next i
Close #1
End Sub

添付図のような、Excel2003で作成した表内のデータを
CSVで保存するマクロを作成したのですが、
図のように、CSVファイルに「""」で値が囲まれた状態で、
保存されてしまいます。

下記にマクロを記載しますので、
どうすれば文字列が「""」で囲まれずに、
カンマ区切りだけのデータで出力されるのか、
ご存知の方おられましたら、ご教示お願い致します。

Sub csv保存()
Dim フォルダ名 As String
Dim パス名 As String
Dim ファイル名 As String
Dim データ As Variant
Dim ...続きを読む

Aベストアンサー

Write # は文字列を""で囲んで出力する仕様になっています。
そのまま出力したければ、Print #を利用すればよろしいかと。
ただし、Printの場合は区切り文字(カンマ)を自動で出力してくれませんので、併せて出力する必要があります。

For j = 1 To 行数
  For k = 1 To 列数 - 1
    データ = Selection.Cells(j, k) .Value
    Print #1, データ; ",";
  Next k
  Print #1, Selection.Cells(j, 列数).Value
Next j

なお、いらぬおせっかいですが、ドライブが複数ある環境下だと、
 ChDir パス名
だけでは必ずしもcvsフォルダ内に、ファイルが作成されるとは限りません。
 Open パス名 & "\" & ファイル名 For Output As #1
のように、フルパスで指定しておいた方が確実かと…


人気Q&Aランキング

おすすめ情報