VBから、csvファイルを取り込んで、Accessのテーブルに格納したいので
すが、Input# でうまくいきません。
csvファイルは、基本的に,区切りですが
1)値の両端を"でくくる。
2)値として"がある場合は、""に変換する。
という仕様です。(ExcelでCSVファイルを作るときと同じ)
3)先頭13列が、上記のような仕様
  さらに14列目から290列目までは数値データで、値を""でくくらない。
データ例として、
"aaa","""値""",""",,","""値2,,""","bbb",・・・"ccc",0,1,2,・・・,276
=== ====== ==== ========== === === = = = ===
 1 2 3 4 5 13 141516 290
1の値:aaa
2の値:"値","
3の値:",,
4の値:"値2,,"
5の値:bbb
としてテーブルに取り込みたいです。
Access2000では、255列以上は取り込めないため、
14列目以降の値を9個ずつ別レコードに分けています。
つまり、22列のテーブルにレコード化しています。
レコード1:列1~13の値+列14~22の値
レコード2:列1~13の値+列23~31の値
・・・
255列の制限は仕方ないとしても、上記のようなCSVファイルを
VBでAccessテーブルに取り込む良い方法を教えてください。

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

A 回答 (3件)

すいません。

ちゃんと読んでませんでした。もう一度。

"aaa","""値""",""",,","""値2,,""","bbb"
をSplitでばらすと

配列0の値:"aaa"
配列1の値:"""値"""
配列2の値:"""
配列3の値:
配列4の値:"
配列5の値:"""値2
配列6の値:
配列7の値:"""
配列8の値:"bbb"

となりますので、配列0番目から順にダブルクゥオートの数
をチェックしていくことになると思います。
配列0はaaaでOK
配列1も""値""でOK(後で""を"に変換する必要あり)
配列2は"が一つなのでおかしい。
よって、配列2と3をカンマでつなぐ。(""",)
でもまだおかしいので、配列2と3と4をカンマでつなぐ。(""",,")
配列2,3,4は"",,でOK
・・・
という風に処理していくことになるかと思います。

どうでしょうか?
    • good
    • 0

アクセスのVBAで取り込むという意味だと思いますがいかがですか?



このような場合、LineInputで1行ずつ取り込んで、ロジックで分割していきます。
Instrで、「""」「",」「"",」などの位置を調べて、データを切り出すことができます。

まず、行頭が「"」だけか「""」なのか。
フラグをセットするといいかと思います。
If Instr(strLine,Chr(34) + Chr(34)) = 1 then
intFlg = 1 '2個でくくられている
Endif
とかですね。

次に、「",」か「"",」の前までがデータになるので、その位置を調べて、1つ前までをMid()などで切り出します。

次のデータを切り出すには、文字検索の開始位置を指定する方法か、前の処理済の部分をRight()でカットしてしまう方法で対処します。

データの中に「,"」や「,""」が含まれる場合は、うまく対処できない可能性があります。
(データフィールドの終わりと同じ文字列になってしまうため)

それにしても大変ですね。
列数が長いときは、テーブルを分けて関連付けしてしまうといいんじゃないかと思いますが、アクセス自体はほとんど使ったことがないのでよくわかりませんです。
    • good
    • 0

VBのバージョンが6.0だと仮定して・・・



1.CSVファイルをLine Inputで読み込む。
2.読み込んだデータをSplit関数で配列に取り込む。
3.後は好きなようにテーブルにINSERTする。
の繰り返し。

としてはどうでしょうか?
(VB6.0でない場合は2のSplit関数は使えませんが・・・)
    • good
    • 0

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

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

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

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

Qテーブル入れ子にしたらNNではダメ?

赤い背景画像を使ったHTMLにテーブルを3個入れ子で載せました。
下のテーブルのセルに白色、中のテーブルのセル色にグレー、一番上のテーブルのセルに白色を指定しました。

そこへラジオボタンをつけたのですが、本来、枠がない丸いボタンのところに赤の枠ができてしまいます。
IEでは問題ないのですが、NN4.7で確認したらこうなっていました。

デザインを変えずに回避する方法があったら教えてください。
また、NN6.*~だったらOKということはありますか?

Aベストアンサー

こんにちは!

<input type="radio" name="address" value="menber" checked style="background-color:#FFFFFF;">

と style="background-color:#FFFFFF;" を追加してください。

NN6は分かりませんが4.7と7で確認しました。

Mac 側は確認していません・・。

QExcel VBAでグラフ作成。A,C列をx値, B,D列をy値にした複数プロット

ExcelのVBAでグラフをChartType = xlXYScatterLinesでグラフを作っています。仮に各列10行でAからF列までデータがあるとします。
Set chartObj = ActiveSheet.ChartObjects.Add(170, 170, 280, 170)
With chartObj.Chart
.ChartType = xlXYScatterLines
.SetSourceData Worksheets(1).Range("A1:F10"), _
PlotBy:=xlColumns
.HasLegend = False
End With

上記のようにしてしまうと、x値がA1:A10で、y値がB1:B10,C1:C10・・・・のプロットが5本作成されてしまいます。

以下のようにするにはどうすればよろしいでしょうか。
第一のプロットはx値をA1:A10, y値をB1:B10としてグラフを作成します。次にこのグラフにx値をC1:C10, y値をD1:D10とした第二のプロットを追加、同様に第三はx値をE1:E10, y値をF1:F10としてプロットを追加したグラフを作成したいのですが、このようなグラフはVBAで作成可能でしょうか。

本番のグラフは行数と列数はいろいろな場合があるので、行数と列数のパラメータに任意の値を代入し、Forループで様々な形態に対応できるものを作りたいと考えています。

ExcelのVBAでグラフをChartType = xlXYScatterLinesでグラフを作っています。仮に各列10行でAからF列までデータがあるとします。
Set chartObj = ActiveSheet.ChartObjects.Add(170, 170, 280, 170)
With chartObj.Chart
.ChartType = xlXYScatterLines
.SetSourceData Worksheets(1).Range("A1:F10"), _
PlotBy:=xlColumns
.HasLegend = False
End With

上記のようにしてしまうと、x値がA1:A10で、y値がB1:B10,C1:C10・・・・のプロットが5本作成されてしまいます。

以下のようにするにはどうすれ...続きを読む

Aベストアンサー

Dim chartObj As ChartObject
Dim r As Range
Dim i As Long

Set chartObj = ActiveSheet.ChartObjects.Add(170, 170, 280, 170)
Set r = Worksheets(1).Range("A1:F10")
With chartObj.Chart
  .ChartType = xlXYScatterLines
  .HasLegend = False
  For i = 1 To 5 Step 2
    With .SeriesCollection.NewSeries
      .XValues = r.Columns(i)
      .Values = r.Columns(i + 1)
    End With
  Next
End With

Set r = Nothing
Set chartObj = Nothing

...こんな感じ。
普通に手作業で作成するものをマクロ記録すればヒントになるでしょう。
後から系列を追加すればいいわけです。

>本番のグラフは行数と列数はいろいろな場合があるので...
...に対応させる一例としては以下。

Const MN = 1 'データ開始行
Const MX = 10 'データ個数
Dim chartObj As ChartObject
Dim x, y
Dim z As Long
Dim i As Long

x = VBA.Array(1, 3, 5) 'x値の列
y = VBA.Array(2, 4, 6) 'y値の列
Set chartObj = ActiveSheet.ChartObjects.Add(170, 170, 280, 170)
With chartObj.Chart
  .ChartType = xlXYScatterLines
  .HasLegend = False
  For i = 0 To UBound(x)
    With .SeriesCollection.NewSeries
      .XValues = Cells(MN, x(i)).Resize(MX)
      .Values = Cells(MN, y(i)).Resize(MX)
    End With
  Next
End With

Set chartObj = Nothing

Dim chartObj As ChartObject
Dim r As Range
Dim i As Long

Set chartObj = ActiveSheet.ChartObjects.Add(170, 170, 280, 170)
Set r = Worksheets(1).Range("A1:F10")
With chartObj.Chart
  .ChartType = xlXYScatterLines
  .HasLegend = False
  For i = 1 To 5 Step 2
    With .SeriesCollection.NewSeries
      .XValues = r.Columns(i)
      .Values = r.Columns(i + 1)
    End With
  Next
End With

Set r = Nothing
Set chartObj = Nothing

.....続きを読む

QNN4.7 テーブルの背景を表示出来ますか?

至急教えて欲しいのですが、ネットスケープ4.7でhtmlを確認中ですが。
テーブルへ背景を埋め込むと表示されないようです。
この現象は、NN4.7では無理なのでしょうか?
どなたか助けてくださいm(_ _)m

Aベストアンサー

NN4.7では <table bgcolor="~"> や <table background="~"> は正式にサポートされています。
(Win. Mac. 共にNN4から正式サポート)

但し、NNの仕様でテーブルの各セル内が背景以外何もない場合は背景が表示されません。

おそらく、背景が表示されていない部分は、文字も画像も入れていないのではありませんか?

そのときには、各空白のセルに相当するソース部位に「&nbsp;」(&は実際には半角です)を記述しておきます。
「&nbsp;」(&は実際には半角です)は、空白を表す特殊な記号で、ブラウザには表示されません。

Qエクセル A1の値と同じ値の入ったB列のC列の計

A1=10 D1=37
B C
10 15
11 10
10 12
12 1
10 10
A1と同じ値をB列から探し其の行のC列の値の合計をD1に表示したいのです
ご教授ください

Aベストアンサー

数式でやったほうが簡単ですが ・・・
=SUMIF(B1:B5,A1,C1:C5)
または
=SUMPRODUCT((B1:B5=A1)*1,C1:C5)

どうしてもVBAでというなら
標準モジュールに
Function mySum(rCnd as range, vSelect as variant, rSum as Range) as variant
  dim nCount as Long
  nCount = rCnd.rows.Count
  if nCount <> rSum.rows.Count then
    mySum = "---"
  else
    dim vC, vS
    dim n as Integer, value
    vC = rCnd.value
    vS = rSum.Value
    for n = 1 to nCount
      if vC(n,1) = vSelect then
        value = value + vS(n,1)
      end if
    next
    mySum = value
  end if
end Function
D1セルに =mySum(B1:B5, A1, C1:C5) といった数式を記述
といった具合です … 簡易なエラーチェックしかしていません

数式でやったほうが簡単ですが ・・・
=SUMIF(B1:B5,A1,C1:C5)
または
=SUMPRODUCT((B1:B5=A1)*1,C1:C5)

どうしてもVBAでというなら
標準モジュールに
Function mySum(rCnd as range, vSelect as variant, rSum as Range) as variant
  dim nCount as Long
  nCount = rCnd.rows.Count
  if nCount <> rSum.rows.Count then
    mySum = "---"
  else
    dim vC, vS
    dim n as Integer, value
    vC = rCnd.value
    vS = rSum.Value
    for n = 1 to n...続きを読む

QIE6/NN7.1のテーブルのheight="100%"

テーブルの高さの指定 height="100%" なんですが、
IE6とNN7.1で100%で表示されません。

下記の記述に間違いはありますでしょうか?
もしかしたら初歩的な問題なんでしょうか?


ちなみにIE5.5 MacのIE5.2では表示されました。
困っています。
宜しくお願いいたします。

ーーーーーーーーーーーーーー
<table border="0" cellspacing="0" cellpadding="0" height="100%">
<tr>
<td valign="top">上</td>
</tr>
<tr>
<td valign="bottom">下</td>
</tr>
</table>
ーーーーーーーーーーーーー

Aベストアンサー

HTML4.01の規格(仕様)では、tableに使えるアトリビュートは、summary、align、widthです。
heightが有効になるほうが特殊だと思ったほうがよいとおもいます

QA列にある文字データで△△を含むセルの値をB列に□□にして置き換えしたい

A列に文字データが100行まであります。
   A           B  
1 ミカンを食べた     ZZ
2 イチゴを食べた     XX
3 西瓜を食べた      YY
4 ミカンを捨てた     ZZ
5 西瓜を拾った      YY
6 ミカンを無くした    ZZ
7 西瓜を貰った      YY
8 イチゴをあげた     XX

それを表のようにB列(任意の列)に置き換えたいです。
イチゴを含むセルはB列にXXをミカンはZZみたいな感じです。
A列のセルには同じ文字列は(今のところ)含みません。
文字の一部を置き換えて変換し、それを繰り返すところまではできましたが、上記のことがができません。
VBAを使って一発で変換したいのですが教えていただけますでしょうか?

Aベストアンサー

こんな感じでよい?

Sub test()
Dim a
Dim b
Dim i, j
a = Array("ミカン", "イチゴ", "西瓜")
b = Array("ZZ", "XX", "YY")
For i = 0 To UBound(a)
For j = 1 To Cells(Rows.Count, 1).End(xlUp).Row
If InStr(Cells(j, 1).Value, a(i)) > 0 Then Cells(j, 2).Value = b(i)
Next j
Next i
End Sub

参考まで

QNNでテーブルの枠線(BORDER)の設定は?

NN6です。
BORDERを使用したいのですが、NNではうまくいきません。
<TABLE>タグにあてはめるとだめだときいたので、TDにあてはめようとしているのですが…。

HEAD内で
TDにBORDER-STYLE="SOLID; BORDER-COLOR:GRAY;"
としました。これをTD CLASS=***
としているのですが、一向に線は出てきません。
どのように直せばいいのでしょうか?

Aベストアンサー

とりあえずダブルクォーテーションは不要なので削除しましょう。

BORDER-STYLE=SOLID; BORDER-COLOR:GRAY;

それでも出なかったらボーダーの太さも明記しておきましょう。

BORDER-STYLE=SOLID; BORDER-COLOR:GRAY;BORDER-WIDTH:1pt;

Qエクセル A列の値によって、B列の入力規則を変更

エクセル2007を使用しております。

下図のように、【カテゴリー】A列が「野菜」の場合、【種類】B列で野菜の種類が表示され、プルダウンの中から選択、【カテゴリー】A列が「果物」の場合、【種類】B列で果物の種類が表示され、プルダウンの中から選択…

ということをしたいのですが、A列の値によって、B列のプルダウンに表示される内容を変えるには、どういった方法が一番よいか、教えていただけないでしょうか。

INDEX、MACH関数、リストボックスやコンボボックスなどのサイトを見たのですが、上手くできず、勉強不足で申し訳ありませんが、急を要するためお力を貸していただけましたら幸いです。

どうぞよろしくお願いいたします。

Aベストアンサー

例えばシート1のA列に野菜と入力してB列で売るダウンリストを表示させるためには次のようにします。
シート2にデータベースとしてA1セルに野菜と入力して下方に野菜の名前を並べます。その後にそれらの範囲を選択してから「数式」タブの「名前の定義」をクリックします。名前の窓には野菜と表示されていると思います。空白の場合には野菜と入力します。同様に果物についてもB1セルに果物と入力して下方に果物名を入力したのちに「名前の定義」を行います。
そこでシート1に戻ってB1セルから下方のセルを選択してから「データ」タブの「データの入力規則」で入力値の種類では「リスト」を選び元の値の窓には次の式を入力してOKします。

=INDIRECT(A1)

これでA列に野菜を入力することで野菜のリストがB列に表示されます。

QIE(5.5)とNN(4.7)のフォントサイズについて。

フォントサイズがデフォルトのままだと、IE(5.5)とNN(4.7)とではフォントサイズが違うのです。
IEの方でフォントサイズを「小」にするとNNと丁度良いサイズになるので、
IEでアクセスしたときには強制的にフォントサイズを「小」に変更することなど出来ませんでしょうか?
CSSで「12px」とかにしたんですけど、やはりIEでサイズが「中」になっていると
微妙にサイズが違ってしまうのです。
また、テーブル内のフォントのサイズも同じように変更したいのでNNに対しては融通が利かないのです。
なにとぞお知恵をお貸しくださいませm(_ _)m

Aベストアンサー

これはJavaScriptとの併用である程度解決つきます。
ブラウザによって使用するCSSファイル(この場合は外部ファイルにします。拡張子『.css』)を用意し、<head>~</head>タグ内にブラウザの判別のスクリプトを書く形です。

IE用とNN用で別々のCSSを用意する事によって、かなり近い状態で表示されるはずです(それでもWindows/Mac、他のバージョンを考えると完全に一致させる事は至難の技ですが・・・)。

JavaScriptでのブラウザ判別については、ここの『JavaScirpt』の方で見つかったので、そのリンクを。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=186603

QExcelで、A列、B列の値を新しいシートに3行ごとにどんどん貼り付け

Excelで、A列、B列の値を新しいシートに3行ごとにどんどん貼り付ける。

という事をしたいのですが、VBAを始めたばかりなので上手く書くことが出来ません。

例)

   A列   B列
  101  りんご 
  102  ぶどう
  103  オレンジ
  104   桃
  105  バナナ
     ・
     ・
     ・

これを別のシートに

   A列   B列
  101  りんご
(2行あける)
  102  ぶどう
(2行あける)
  103  オレンジ
(2行あける) 
  104   桃
(2行あける) 
  105  バナナ
     ・
     ・
     ・

と表示したいのです。
現在は下記のようなリンクで表示していますが、
件数が少ない時は4件から多い時は800件と幅があります。
出来れば表の一番下(空欄になる部分)まで繰り返し処理をしたいと思っています。
セルの中身が表示されるならリンクでもコピーでも構いません。

現在のマクロ
Sub Macro2()

Worksheets("Sheet2").Select
Range("C11").Value="=Sheet1!A2"
Range("C14").Value="=Sheet1!A3"
Range("C17").Value="=Sheet1!A4"
Range("C20").Value="=Sheet1!A5"
Range("C23").Value="=Sheet1!A6"

Range("H11").Value="=Sheet1!B!"
Range("H14").Value="=Sheet1!B2"
Range("H17").Value="=Sheet1!B3"
Range("H20").Value="=Sheet1!B4"
Range("H23").Value="=Sheet1!B5"

End sub

45行分まで書いたところで途方に暮れております。
よろしくお願いいたします。

Excelで、A列、B列の値を新しいシートに3行ごとにどんどん貼り付ける。

という事をしたいのですが、VBAを始めたばかりなので上手く書くことが出来ません。

例)

   A列   B列
  101  りんご 
  102  ぶどう
  103  オレンジ
  104   桃
  105  バナナ
     ・
     ・
     ・

これを別のシートに

   A列   B列
  101  りんご
(2行あける)
  102  ぶどう
(2行あける)
  103  オレンジ
(2行あける) 
 ...続きを読む

Aベストアンサー

Sheet1のデータ数を取得する方法が判らないのか、ループを回す発想が無いのか……と、言った所でしょうか。

Sheet1のA列の空欄までの行数は、↓これで求まります。
Sheets("Sheet1").Range("A1").End(xlDown).Row

あとは、その行数分ループを回してSheet2に値を入れて行けば良いです。

やりたい事と、現在のマクロが一致していないので、やりたい事の方を実現するサンプルを提示します。適当に変更してください。

Sub Sample()
 Dim nTotal, i
 nTotal = Sheets("Sheet1").Range("A1").End(xlDown).Row 'Sheet1の最終行

 With Sheets("Sheet2")
  .Columns("A:B").ClearContents 'Sheet2のA、B列をクリア
  For i = 1 To nTotal
   .Cells(i * 3 - 2, 1).Value = Sheets("Sheet1").Cells(i, 1).Value
   .Cells(i * 3 - 2, 2).Value = Sheets("Sheet1").Cells(i, 2).Value
  Next i
 End With
End Sub

Sheet1のデータ数を取得する方法が判らないのか、ループを回す発想が無いのか……と、言った所でしょうか。

Sheet1のA列の空欄までの行数は、↓これで求まります。
Sheets("Sheet1").Range("A1").End(xlDown).Row

あとは、その行数分ループを回してSheet2に値を入れて行けば良いです。

やりたい事と、現在のマクロが一致していないので、やりたい事の方を実現するサンプルを提示します。適当に変更してください。

Sub Sample()
 Dim nTotal, i
 nTotal = Sheets("Sheet1").Range("A1").End(xlDown).Row 'Sheet...続きを読む


人気Q&Aランキング