[[20090702145217]] 『変数の書き方』(U) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『変数の書き方』(U)

こんにちは

下記の参照する値を変数にしたいのですが

初心者のため上手く書けません。

宜しくお願い致します。

C:\Documents and Settings\xxx\xxxx\[xxx.xls]xxx'!$A$23

Dim www As String

www = C:\Documents and Settings\xxx\xxxx\[xxx.xls]xxx'!$A$23


 自己削除
 (seiya)

 こっちかと思ったりして。。。。?
www = Application.ExecuteExcel4Macro("'C:\Documents and Settings\xxx\xxxx\[xxx.xls]xxx'!R23C1")

 (HANA)

有り難うございました。(U)

 Uさん
 私の投稿は自己削除しましたが
 もしそれで満足なら、
 www は Variant 型でなければならないはずです。

 私は、変数の書き方
 ということだったので

 String型の場合は " Double quaote で挟んでやる必要があります。

 www = "'C:\Documents and Settings\xxx\xxxx\[xxx.xls]xxx'!$A$23"
 先頭の ' も忘れてますね?

 セルに数式を挿入するときなどは、このようにしてください。
 (seiya)

 To,seiyaさん

 >www は Variant 型でなければならないはずです。
 該当するA23セルが文字列で無い場合を想定してですか?

 (HANA)

 もともと、セルのデータは Variant型ですよね?
 ExecuteExcel4Macro method を使用するということは、少なくとも私は、その返してきた
 値を何かの計算・比較等に使用する目的があるものと想定しますので
 Variantであれば、その後の処理も IsError, TypeName, VerType 関数等で判別が楽になると思います。
 説明になりますか?
 (seiya)

 A23に何が入って居たとしても、文字列として使いたい場合は
 Stringで良いんじゃないですか?
 (・・・エラー値だったら、型が違うと 怒られますが・・・)

 A23には何が入っているのか とか、その後の使用方法 とか
 詳しいことは分からないので何とも言えませんが。

 「Variant 型にしておいた方が良い」と有れば
 又印象は違うと思いますが

 「Variant 型でなければならない」では
 他は絶対駄目
  例えば エラーに成って動かないでしょ とか
 な感じが有ります。

 (HANA)


 HANAさんがそう思うならそれでよいのでは?
 私は、質問者のUさんに対して回答したまでのことです。

 [変数の書き方]、という質問に
 C:\Documents and Settings\xxx\xxxx\[xxx.xls]xxx'!$A$23
 に対して
 ExecuteExcel4Macro で回答が付くとは思いませんでしたし。
 (seiya)

 これを見た人や、Uさんが
 「そうか、Variantじゃないと【駄目なんだ】」
 と思ったら、それは間違った認識に成ると思いますが?

 私が「こんな時は、Variantじゃないと駄目なんだって」って
 言い始めたら、
 >HANAさんがそう思うならそれでよいのでは?
 と言うだけの問題では無くなってくると思いますが?

 もっと詳しく話しが進んで、今回はVariantじゃないと駄目だね
 と結論が出たのならまた別の話で。

 (HANA)

 質問は [変数の書き方]で 
 www = C:\Documents and Settings\xxx\xxxx\[xxx.xls]xxx'!$A$23
 が提示されている。
 即ち、String型の変数に C:\Documents and Settings\xxx\xxxx\[xxx.xls]xxx'!$A$23
 という「文字列」を代入して他に使用するという意味にしか取れない。

 一方、
 C:\Documents and Settings\xxx\xxxx\[xxx.xls]xxx'!$A$23 の値を
 ExecuteExcel4Macroで取得するのはまったく別の問題。

 セルに文字列の「数式」を計算させれば、エクセルの Auto-casting で
 Variant/String, Variant/Double 等に自動で変換されるるけど
 元来 Variant型の値を取得するのに、あえてString型にする根拠が理解できない。
 どうしてもString型にしたければ、CStr(www) で済むはず。
 (seiya)

 私は
 >下記の参照する値を変数にしたい
 と
 >www = C:\Documents and Settings\xxx\xxxx\[xxx.xls]xxx'!$A$23
 で「変数にセルの値を入れたいのか」と思いましたけどね。

 ご質問さんの言葉が不確かな事について
 とやかく言っても仕様が無いと思いますが。

 色々な受け取り方が出来ないような質問文を書いてもらうのが良いとは思いますが
 色々に受け取った人が、色々なコメントを載せておけば
 当たる確率も高くなると思います。

 今回こんな話しに成っているのは
 「でなければならないはず」と言う語尾に関してです。
 seiyaさんが、ご質問文をどの様に受け取られたか と言う話しでは当然なく。

 >元来 Variant型の値を取得するのに、あえてString型にする根拠が理解できない。
 って事は、↓の様な事は普通しないって事ですか・・・?
    Dim www As String
    www = Range("A1").Value

 私は今まで「A1セルは文字列だから、String」と、
 安易に変数の型を決めてましたが。。。

 (HANA)


 私は、今までそのようにした記憶がありませんし、するべきでないと思います。
 ユーザー入力が必ずコードを書く側でデータを入力するとは限らないし、
 それを期待するべきでないと思います。
 もちろん、全てのエラー処理を含んだコードは書いてはいませんが、
 少なくとも、データ型のミスマッチでDebugしてしまうとか、後の処理がより複雑
 にならないようには心がけています。
 (seiya)

 途中参加すいません。

 Dim www As String
 www = Range("A1").Text
 はありですか?

 (ROUGE)

 それはもちろんありですよね?
 (seiya)

 ってことは、こういうのもだめですね。
    Dim tbl As Variant, www As String
    tbl = Range("A1:B1").Value
    www = tbl(1, 1) & tbl(1, 2)

 先のものを「www = Range("A1").Text」
 に切り替えるのは割と覚えていられそうですが。。。

 (HANA)

 & で連結した時点でString型になりませんか?
 (seiya)

 ん?
 さっき試した時は  エラーになりましたが。。。

 後でもう一度やってみます。

 (HANA)

 確認しました。
 矢張り駄目ですね。

 この場合(&でつなげようとした場合)
 wwwの型をVariantにしても駄目な様です。
 (実行時エラー13 型が一致しません。)

 ちなみに、A1セルに=NA()を入れてみました。

 (HANA)

 ん?
 違う種類のものを同じ土俵で考えていすね...

 まず、私は a(i, 1) & a(i, 2) のような意味のない連結はしません。
 必ず z = a(i, 1) & ";" & a(i, 2)
 というような連結をします。

 配列変数 a はVariant, その要素もVariant
 従って、Error を Error として保持
 故に、IsError 関数等で処理ができる。
 If (Not IsError(a(i, 1)) * (Not IsError(a(i, 2))) Then

 一方
 www As String
 www = Exec......(...)
 Variant で受ければ、その後の処理が楽になるのに、
 何故あえて String 型にこだわるのかわからないだけ。
 (seiya)

 >もしそれで満足なら、
 >www は Variant 型でなければならないはずです。
 なので ≠Variant 型でなければならないはずです。
 じゃないんですかね

 消されちゃったのでわからないですが…

 HANAさんも
 >こっちかと思ったりして。。。。?
 >www = Application.ExecuteExcel4Macro・・・・・
 と先を読んで回答しているわけですからseiyaさんのVariantに対する意見に異見を述べるのはいささか
 不細工かなとか…

 1傍聴者としては後の話を聞く限り(難しい説明でわかりにくいけど)seiyaさんの意見のほうが筋が
 通っているようにも見えます。
 もちろん、質問に対してわかりやすく明解な回答をしていただけるHANAさんのほうが私のような未熟者
 には助かります。

 教授のseiyaさんと先生のHANAさん見たいな構図で仲良くしてほしいなというのが本音ですかね…。

 済みません、それでは話を戻したいのですが、seiyaさんが
 >www は Variant 型でなければならないはずです。
 と書かれたのは
   1.実行時エラーをさけるため
   2.何が得られたか確認が簡単なため
 ではないのですか?

 (HANA)

 厳密に言うときりがないけど

 ExecuteExcel4Macro で値を取得する際に注意すべきことは、

 1) ファイルが存在するか
 2) ファイルの中に該当シートが存在するか

 等の確認処理をした上で、値の取得をすべきだと思います。
 それらのエラーを処理した上で、尚且つ結果がエラー値だった場合は
 Variant型で受けておけば、容易に判別処理できる。

 ということです。

 別問題とは、そのような意味も含めています。
 (seiya)

 私がこだわっている部分は
 「でなければならない」と書いてある点ですが
 その点は、お酌み取り頂けていますか?

 変数は、適切な型を指定して使用しなければならない
 変数は、適切な型を指定して使用すべきである

 両者は同じ物では無いと思います。

 それも含めて
 >HANAさんがそう思うならそれでよいのでは?
 と言う事であれば、単なる言語感覚の違いだと思います。

 (HANA)


 「www は Variant 型でなければならないはずです。」と書いてあるところはありますが、
そのなかの一部分を取り出して文句をかかれてるようにしか見えません。
 この文章は書かれた方が「Variant 型でなければならない」と解釈していらっしゃることがうかがえます。
読んだ人に強制するものでもないし
 取説に書いてある言葉なら慎重に選ばれるべきでしょうが・・・・・
( 面白いことになってますね@野次馬)


 Uさん、ご迷惑をおかけして申し訳ありませんでした。
 おそらく、ここのスレ主さんだと思いますが別HNで同じような質問をされ、回答が付いています。

 HANAさんのコード化に関する知識の習得速度には目を見張るものがあり、感心するばかりです。
 変数の宣言でデータ型を指定する場合は、特に現在の環境下ではメモリー使用量を気にするよりも、
 後の処理をより容易にすべく指定すべきだと思います。

 例えば、今回のような ExecuteExel4Macro では、実際のファイルは見えません。
 シート上の数式で処理しようとしたときに、ファイル名が不備だった場合は、Excelが
 ダイアログを表示して教えてくれます。

 VBAだと、Dir関数でファイルの存在は確認できますが、シート名の確認をする際には
 Variant型で受け取れば、容易に判断できます。
 もっとも、閉じたファイルから全シート名を取り出して比較する方法もありますが、
 そんなことをしなくても

 On Error Resume Next
 www = ExecuteExcel4Macro("........R1C1")
 で実行時エラーが出たら、シート名が違う
 IsError(www)
 で実際に返った値がエラー
 と判断できます。

 少し、違うかもしれませんが
 x = Application.Match(.....)
 というようなときは、Error値を受け取れるようにVariantで指定しますよね?
 (seiya)


 えっと
 >後の処理をより容易にすべく指定すべきだと思います。
 「べき」ですよね?
 「でなければならない」ではなく。

 という、上で
 ( 面白いことになってますね@野次馬)さんが書かれているように
 >そのなかの一部分
 に対してのコメントです。

 ユーザーは何をするかわかったもんじゃないから
 エラー処理は必要だ に異議を唱えている
 とか
 今回の型が 絶対Stringで良い と主張しているわけでもありません。

 が、どうやら
 >単なる言語感覚の違い
 の様です。

 (HANA)

 ここは国語の学校だったの?
[[20090704151804]]
 (seiya)

 エクセルの学校だからじゃないんですか?

 (HANA)

 ま、とにかく質問者さんの問題は解決したようなので
 この辺にしておこうか。
 (seiya)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.