Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5861 / 13646 ツリー ←次へ | 前へ→

【48400】非レコード形式のExcelをADOで扱いたい syn 07/4/16(月) 12:46 質問[未読]
【48402】Re:非レコード形式のExcelをADOで扱いたい Kein 07/4/16(月) 13:05 発言[未読]
【48437】Re:非レコード形式のExcelをADOで扱いたい syn 07/4/17(火) 15:09 質問[未読]
【48427】Re:非レコード形式のExcelをADOで扱いたい ウッシ 07/4/17(火) 11:28 発言[未読]
【48439】Re:非レコード形式のExcelをADOで扱いたい syn 07/4/17(火) 15:55 質問[未読]
【48440】Re:非レコード形式のExcelをADOで扱いたい ウッシ 07/4/17(火) 16:01 発言[未読]
【48499】Re:非レコード形式のExcelをADOで扱いたい syn 07/4/19(木) 15:12 質問[未読]
【48500】Re:非レコード形式のExcelをADOで扱いたい ウッシ 07/4/19(木) 16:01 発言[未読]
【48513】Re:非レコード形式のExcelをADOで扱いたい syn 07/4/20(金) 11:26 質問[未読]
【48517】Re:非レコード形式のExcelをADOで扱いたい ウッシ 07/4/20(金) 11:56 発言[未読]
【48520】Re:非レコード形式のExcelをADOで扱いたい syn 07/4/20(金) 12:56 質問[未読]
【48521】Re:非レコード形式のExcelをADOで扱いたい ウッシ 07/4/20(金) 12:59 発言[未読]
【48524】Re:非レコード形式のExcelをADOで扱いたい syn 07/4/20(金) 13:51 質問[未読]
【48525】Re:非レコード形式のExcelをADOで扱いたい ウッシ 07/4/20(金) 13:59 発言[未読]
【48527】Re:非レコード形式のExcelをADOで扱いたい syn 07/4/20(金) 14:30 お礼[未読]
【48456】Re:非レコード形式のExcelをADOで扱いたい ハチ 07/4/18(水) 11:34 発言[未読]
【48493】Re:非レコード形式のExcelをADOで扱いたい syn 07/4/19(木) 11:13 質問[未読]
【48496】Re:非レコード形式のExcelをADOで扱いたい ハチ 07/4/19(木) 13:29 発言[未読]
【48498】Re:非レコード形式のExcelをADOで扱いたい syn 07/4/19(木) 15:05 質問[未読]
【48501】Re:非レコード形式のExcelをADOで扱いたい ハチ 07/4/19(木) 16:36 発言[未読]
【48518】Re:非レコード形式のExcelをADOで扱いたい syn 07/4/20(金) 11:59 お礼[未読]

【48400】非レコード形式のExcelをADOで扱いたい
質問  syn  - 07/4/16(月) 12:46 -

引用なし
パスワード
    はじめまして。VBA初心者です。

 やりたいことは、
1.インポート元を閉じた状態でインポートしたい。
そこで、ADOというものが使えたらと思いました。

2.でも、インポート元のブックは、1ブック=1シート=1レコードになっており、取得したいデーター欄が、項目名の右にあったり、下にあったり、きちんとした表にはなっていません。

 自分では

Private Sub Connect()

  Dim strDBPath As String

  strDBPath = ThisWorkbook.Path
  strDBPath = strDBPath & "\test.xls"

  Set objADOCon = CreateObject("ADODB.Connection")

  objADOCon.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
          "DBQ=" & strDBPath & ";"

End Sub

Sub Main()

  Dim strSQL As String
  
  Call Connect

  strSQL = "select * from [Sheet1$A1:J2]"
  Set objRS = objADOCon.Execute(strSQL)
  [A2].CopyFromRecordset objRS
  
  Call DisConnect

End Sub

などと、格闘してみたのですが、レコードセットおよびレコードの設定部分が、「やりたいこと 2.」にあった方法がわかりません。

質問に先立ち、【9098】は読んでみましたが、特に「やりたいこと 2.」の部分につき、ご教授ください。

【48402】Re:非レコード形式のExcelをADOで扱いたい
発言  Kein  - 07/4/16(月) 13:05 -

引用なし
パスワード
   >取得したいデーター欄が、項目名の右にあったり、下にあったり
それでも、まさか1000行も離れたところに入力しているようなことは
ありませんよね ? だったら
>1ブック=1シート=1レコード
の条件を考えると、普通にリンクで引っ張る方が簡単でしょう。
その場合「ここまでの範囲なら確実にデータがある」と思われるところまでを
作業シートにリンクして、Findメソッドを使うなどして目的のデータを探せば
良いと思います。検索の手がかりについては、そちらの具体的なデータ・サンプル
が提示されれば回答できると思います。

【48427】Re:非レコード形式のExcelをADOで扱いたい
発言  ウッシ  - 07/4/17(火) 11:28 -

引用なし
パスワード
   こんにちは

元のコードからすると、

Sub test()
  Dim strDBPath As String
  
  strDBPath = ThisWorkbook.Path
  strDBPath = "='" & strDBPath & "\[test.xls]Sheet1'!A1"
  
  With Range("A1:J2").Offset(1)
    .ClearContents
    .Formula = strDBPath
    .Value = .Value
  End With
End Sub

こんな感じで出来そうですけど?

【48437】Re:非レコード形式のExcelをADOで扱いたい
質問  syn  - 07/4/17(火) 15:09 -

引用なし
パスワード
   >普通にリンクで引っ張る方が簡単でしょう。
 実は、それも素人の私にはわかりません。【6477】を読んでみたのですが、GetOpenFilenameで取得したデータ元を指定したいのでさらに困難になっています。今回の挑戦は私には荷が重かったようですが、よろしくご教授ください。

>Findメソッドを使うなどして
 今回はデータ元の位置関係自体は各ファイルとも一定なので大丈夫そうです。
ありがとうございます。

【48439】Re:非レコード形式のExcelをADOで扱いたい
質問  syn  - 07/4/17(火) 15:55 -

引用なし
パスワード
   >  strDBPath = ThisWorkbook.Path
>  strDBPath = "='" & strDBPath & "\[test.xls]Sheet1'!A1"

 「元のコード」が私のやりたいケースと正確にあってないものを書いてしまったのが悪いのですが、【48437】にも書いたように、実は、GetOpenFilenameでデータ元のパスを取得したく、この例だとtest.xlsまで取得されるのですが、これと教えてもらった方法との組み合わせ方がわかりません。

 また、データ元のばらばらに並んだ、1つまたは複数のセルを、まとまりごとに個別に指定するのもこのやり方でよいのでしょうか。
 
 表題の質問以前の問題かとは思いますが、よろしくお願いします。

【48440】Re:非レコード形式のExcelをADOで扱いたい
発言  ウッシ  - 07/4/17(火) 16:01 -

引用なし
パスワード
   こんにちは

前提条件の話になってしまうのですが、
GetOpenFilenameで指定するデータ元のシート名は「Sheet1」で統一されていますか?

リンク式の場合
> "\[test.xls]Sheet1'!A1"
このようにブック名、シート名、セル位置が必須になります。

>また、データ元のばらばらに並んだ、1つまたは複数のセルを、まとまりごとに個別に
>指定するのもこのやり方でよいのでしょうか。
これもブック毎にデータ位置は違うのでしょうか?

【48456】Re:非レコード形式のExcelをADOで扱いたい
発言  ハチ  - 07/4/18(水) 11:34 -

引用なし
パスワード
   ▼syn さん:

横から失礼します。

>1.インポート元を閉じた状態でインポートしたい。
>そこで、ADOというものが使えたらと思いました。

そもそも、なぜインポート元を閉じた状態でインポートしたいのでしょうか?
VBA初心者と書かれていますので、おとなしく開いたほうが良いと思いますが。

>2.でも、インポート元のブックは、1ブック=1シート=1レコードになっており、取得したいデーター欄が、項目名の右にあったり、下にあったり、きちんとした表にはなっていません。

1ブックのデータをExcel上の1レコード(1行)にしたいとすれば、
各ブックのデータは255個以下でないとできませんが、
そのあたりはどうでしょう?
また、この内容からだとインポート元のブックには「項目行」が無さそうな気がします。
項目行の無いExcelブックをDBデータとして取り扱うのは
非常に難しいと思います。

【48493】Re:非レコード形式のExcelをADOで扱いたい
質問  syn  - 07/4/19(木) 11:13 -

引用なし
パスワード
   >横から失礼します。
 とんでもないです。ありがとうございます。

>そもそも、なぜインポート元を閉じた状態でインポートしたいのでしょうか?
>VBA初心者と書かれていますので、おとなしく開いたほうが良いと思いますが。
 ・【9123】を読んだら、私のケースとの異同もよく分からないまま、
「たぶんリンク貼付では無理」とあったのを読んで、ADOかな、とおもった。
 ・インポート元が200〜300ファイルあるので、早くなるかなと思いました。
 ・できれば、インポート先も閉じていたいのです。
 ・こういう処理はVBScriptのほうが向いているのでしょうか。それともVBScriptではできないのでしょうか。 こういう処理の必要な場面が多いのですが、何を勉強すればよいのかさえわかりません。この点についても知りたいと思っています。
 ・また、インポート元のファイルが処理対象のファイルか否かをチェックしたいのですが、リンクの方法で、インポート元のファイルを開く前、あるいは、インポート先のセルにリンクを貼る前に、インポート元のファイルのセルの値を取得することはできるのでしょうか。


>1ブックのデータをExcel上の1レコード(1行)にしたいとすれば、
>各ブックのデータは255個以下でないとできません
 255個以下です。

>また、この内容からだとインポート元のブックには「項目行」が無さそうな気がします。
 項目行は2行目に対して1行目のみが対応したものとして存在します。ですが、3行目以下は1行目とは対応していません。
 擬似的に1行目を項目行として .fields("項目") で取り出すとか、1レコード(1行)の何番目(列)で取り出すとかはできるのですが、それ以外の方法は、やはりないのでしょうか。また、1列を1レコードとすることなどはできないのでしょうか。
 よろしくお願いします。

【48496】Re:非レコード形式のExcelをADOで扱いたい
発言  ハチ  - 07/4/19(木) 13:29 -

引用なし
パスワード
   ▼syn さん:
>>横から失礼します。
> とんでもないです。ありがとうございます。
>
>>そもそも、なぜインポート元を閉じた状態でインポートしたいのでしょうか?
>>VBA初心者と書かれていますので、おとなしく開いたほうが良いと思いますが。
> ・【9123】を読んだら、私のケースとの異同もよく分からないまま、
>「たぶんリンク貼付では無理」とあったのを読んで、ADOかな、とおもった。

9123を確認してみましたが、
ichinoseさんの書かれているコードは、「エクスポートする」コードです。
リンク式で、開いてないブックに書き込む(エクスポートする)ことは無理。
ということです。

その後に
>本当は、両方開いて、値を移す方法が一般的だし、簡単だし、・・・
とも書かれてます。

> ・こういう処理はVBScriptのほうが向いているのでしょうか。それともVBScriptではできないのでしょうか。 こういう処理の必要な場面が多いのですが、何を勉強すればよいのかさえわかりません。この点についても知りたいと思っています。
>・また、インポート元のファイルが処理対象のファイルか否かをチェックしたいのですが、

ExcelとExcelのデータを処理するなら、ExcelVBAで良いと思います。

複雑な処理を組み上げるコーディング力があるのなら、できるかもしれません。
自分にはできませんし、正規化されてないデータをADOで処理しようとはしません。

【48498】Re:非レコード形式のExcelをADOで扱いたい
質問  syn  - 07/4/19(木) 15:05 -

引用なし
パスワード
   ありがとうございました。リンクではできました。

ただ、
>> ・また、インポート元のファイルが処理対象のファイルか否かをチェックした
>>いのですが、リンクの方法で、インポート元のファイルを開く前、あるいは、イ
>>ンポート先のセルにリンクを貼る前に、インポート元のファイルのセルの値を取>>得することはできるのでしょうか。
についてはどうでしょうか。もしご存知なら教えてください。

【48499】Re:非レコード形式のExcelをADOで扱いたい
質問  syn  - 07/4/19(木) 15:12 -

引用なし
パスワード
    ありがとうございました。
 ファイルまでのパスを、「フォルダーまで」と「ファイル名のみ」に分ける方法に手間取っていたのですが、Len・InStr・Right等を使って、リンクではできました。
 ただ、【48498】に質問した点についてはどうでしょうか。もしもご存知なら教えてください。

【48500】Re:非レコード形式のExcelをADOで扱いたい
発言  ウッシ  - 07/4/19(木) 16:01 -

引用なし
パスワード
   こんにちは

見逃してましたm(__)m

>GetOpenFilenameでデータ元のパスを取得したく

Sub test()
  Dim strDBPath As String
  Dim v     As Variant
  
  v = Application.GetOpenFilename("エクセルブック(*.xls),*.xls", , , , False)
  If VarType(v) = vbBoolean Then Exit Sub
  
  strDBPath = "='" & Replace(v, Dir(v), "[" & Dir(v) & "]") & "Sheet1'!A1"

  With Range("A1:J2").Offset(1)
    .ClearContents
    .Formula = strDBPath
    .Value = .Value
  End With
  
End Sub

こんな感じです。

>データ元のばらばらに並んだ、1つまたは複数のセルを、
>まとまりごとに個別に指定するのもこのやり方でよいのでしょうか。
出来るはずです。

ADO等でDBとして扱える形式では無いようなので、リンクでデータを取得する方が
うまく行くと思います。

>ただ、
>> ・また、インポート元のファイルが処理対象のファイルか否かをチェックした
>>いのですが、リンクの方法で、インポート元のファイルを開く前、あるいは、イ
>>ンポート先のセルにリンクを貼る前に、インポート元のファイルのセルの値を取
>>得することはできるのでしょうか。
>についてはどうでしょうか。もしご存知なら教えてください。

Application.ExecuteExcel4Macro(ほぼリンク式)
で調べられますけど、リンクで判定に必要なデータだけインポートして判断しても
いいのではと思います。

【48501】Re:非レコード形式のExcelをADOで扱いたい
発言  ハチ  - 07/4/19(木) 16:36 -

引用なし
パスワード
   ▼syn さん:
>ありがとうございました。リンクではできました。
>
>ただ、
>>> ・また、インポート元のファイルが処理対象のファイルか否かをチェックした
>>>いのですが、リンクの方法で、インポート元のファイルを開く前、あるいは、イ
>>>ンポート先のセルにリンクを貼る前に、インポート元のファイルのセルの値を取>>得することはできるのでしょうか。
>についてはどうでしょうか。もしご存知なら教えてください。

??質問の意味が良くわかりません。
対象か判定する基準がなんなのかわかりませんが、

1、判定に使うセルだけにリンクを貼る。
2、リンクされた値を確認する。
3、対象なら残りのリンクを貼る。

といった処理かと思います。

私としては、「1つづつ開いて処理する」がオススメと書いてますので、
「開かないで」に拘るのなら、他の方の良きアドバイスをお待ちください。

【48513】Re:非レコード形式のExcelをADOで扱いたい
質問  syn  - 07/4/20(金) 11:26 -

引用なし
パスワード
   >  strDBPath = "='" & Replace(v, Dir(v), "[" & Dir(v) & "]") & "Sheet1'!A1"
 私が苦闘してかいたLen・InStr・Right等を使う方法では8行もかかったのに、見事です。助かり&勉強になりました。ありがとうございます。


>  With Range("A1:J2").Offset(1)
>    .ClearContents
>    .Formula = strDBPath
>    .Value = .Value
>  End With
 やりたいことを具体的に書かせていただくと、実は、
インポート元の、A2:J2、B3,E3,G3、B5,H5、B6,H6、B7,E7,G7、B8,H8、B9,H9 のセルの各データーを、
インポート先に、1行の各セルに、上の順番で並べたいのです。
>>このやり方でよいのでしょうか。
と書いたのも、上の教えてもらった方法を、私のケースにうまく効率的にあわせる方法がわからないのです。例えば上のコードの場合、すべてA1の値にならないということがいまひとつ実感できないレベルなのですので教えてください。


>Application.ExecuteExcel4Macro(ほぼリンク式)
>で調べられます
 ありがとうございます。今回のみならず、知っていると今後とても有用に思えます。

>けど、リンクで判定に必要なデータだけインポートして判断しても
>いいのではと思います。
 自分以外の者が使用するので、エラー・キャンセル処理に便宜かなと思ったのです。確かにおっしゃるとおりではあります。

 またも質問ですがよろしくお願いします。

【48517】Re:非レコード形式のExcelをADOで扱いたい
発言  ウッシ  - 07/4/20(金) 11:56 -

引用なし
パスワード
   こんにちは

>インポート元の、A2:J2、B3,E3,G3、B5,H5、B6,H6、B7,E7,G7、B8,H8、B9,H9

>インポート先に、1行の各セルに、上の順番で並べたいのです。
「,」「、」の違いが気になるのですが、こんな感じでしょうか?

Sub test1()
  Dim strDBPath As String
  Dim v     As Variant
  Dim m     As Variant
  Dim mArray  As Variant
  Dim i     As Long
  Dim j     As Long
  Dim r     As Range
  
  v = Application.GetOpenFilename("エクセルブック(*.xls),*.xls", , , , False)
  If VarType(v) = vbBoolean Then Exit Sub
  
  strDBPath = "='" & Replace(v, Dir(v), "[" & Dir(v) & "]") & "Sheet1'!"

  mArray = Array("A2:J2", "B3", "E3", "G3", "B5", _
          "H5", "B6", "H6", "B7", "E7", "G7", "B8", "H8", "B9", "H9")
          
  i = Cells(Rows.Count, 1).End(xlUp).Row + 1
  Rows(i).ClearContents
  j = 1
  For Each m In mArray
    For Each r In Range(CStr(m))
      With Cells(i, j)
        .Formula = strDBPath & r.Address
        .Value = .Value
      End With
      j = j + 1
    Next
  Next
End Sub

インポートデータを1セルずつ処理してますので、その値で必要なデータかどうかの
判定処理も入れられますけど、どのセルで判定するのか分かりませんので何もして
ません。

【48518】Re:非レコード形式のExcelをADOで扱いたい
お礼  syn  - 07/4/20(金) 11:59 -

引用なし
パスワード
   >??質問の意味が良くわかりません。
>対象か判定する基準がなんなのかわかりませんが、
 基準は、自分以外の者が使用するため取り込みたいファイルとは関係がないファイルが選択される恐れがあるので、取り込みたいファイルなのか否かという点でした。GetOpenFilenameで、MultiSelectをTrueにして複数ファイルを選択させているためです。

>1、判定に使うセルだけにリンクを貼る。
>2、リンクされた値を確認する。
>3、対象なら残りのリンクを貼る。
>といった処理かと思います。
 それをしない方法はないものかということでした。【48500】でウッシ様に教えていただきました。

>私としては、「1つづつ開いて処理する」がオススメと書いてますので、
 リンクでも「開かないで」済むと分かったので、リンクで一向に構いません。
 また、
>「開かないで」に拘るのなら、
 こだわってませんし、ADOにもこだわってはいません。「できないならできない」と納得したかったので最初、質問しただけです。「できない」ということを自分で発見・検索するのは、「できる」ということを発見・検索するより困難ですから。


 結構ツリーが長くなるまでいろいろとありがとうございました。特に、
>9123を確認してみましたが(【48496】)
等、ご親切にどうもありがとうございました。

【48520】Re:非レコード形式のExcelをADOで扱いたい
質問  syn  - 07/4/20(金) 12:56 -

引用なし
パスワード
    感動的にうまくいきました。実際に書いていただいて本当にありがとうございます。
 ただ、実は、A(列)にはそのファイルへのハイパーリンクを張りたいので、
B(列)から貼り付けたいのですが、またもその手の加え方すら分かりません。
i =  以下が特に分かってないのですが、変更例だけでも教えてくだされば、後はいったん自分の頭で解読してみようと思いますので、よろしくお願いします。

>判定処理も入れられますけど、
各データ自体は今回は判定不要なので大丈夫です。

【48521】Re:非レコード形式のExcelをADOで扱いたい
発言  ウッシ  - 07/4/20(金) 12:59 -

引用なし
パスワード
   こんにちは

j = 1

j = 2

に変更するだけです。

【48524】Re:非レコード形式のExcelをADOで扱いたい
質問  syn  - 07/4/20(金) 13:51 -

引用なし
パスワード
   >j = 2
>に変更するだけです。
そうですよね。

すると、実は、
varFilename = Application.GetOpenFilenameで、MultiSelect:=Trueにして、
For Next で繰り返しているのですがそことの整合性がとれていないとおもうのですが、自分では解明できません。
ここはどうなりますか。誠に申し訳ないですがお願いします。

【48525】Re:非レコード形式のExcelをADOで扱いたい
発言  ウッシ  - 07/4/20(金) 13:59 -

引用なし
パスワード
   こんにちは

>varFilename = Application.GetOpenFilenameで、MultiSelect:=Trueにして、
>For Next で繰り返しているのですがそことの整合性がとれていないとおもうのですが、自分では解明できません。
>ここはどうなりますか。誠に申し訳ないですがお願いします。

行はA列の最終行を取得してその1行したにして有りますので「For Next」でファイルの
処理が終了した時点で「i = i + 1」とでもすればいいです。

また、列は「For Next」でファイルが変わった時点で「j = 2」に初期化すればいいです。

【48527】Re:非レコード形式のExcelをADOで扱いたい
お礼  syn  - 07/4/20(金) 14:30 -

引用なし
パスワード
   >行はA列の最終行を取得してその1行したにして有りますので
 A列のハイパーリンクはまだ記述していなかったので、それで上書きされ続けていたことが見えていませんでした。お騒がせしてすみません。

 一応これで一段落したので、疑問点が出てきたらまた新規に質問させていただきたく思います。

 ウッシ様には、本当に感謝しています。大変ありがとうございました。 

5861 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free