Excel VBA 質問スレ Part51
■ このスレッドは過去ログ倉庫に格納されています
スレ立ての際は一行目に !extend:checked:vvvvv:1000:512 と入れてスレ立てして下さい ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※関連スレ VBAなんでも質問スレ Part2 http://mevius.2ch.net/test/read.cgi/tech/1432173164/ Access VBA 質問スレ Part1 http://mevius.2ch.net/test/read.cgi/tech/1328536426/ Excel総合相談所 126 https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/ ※前スレ Excel VBA 質問スレ Part50 http://mevius.2ch.net/test/read.cgi/tech/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 👀 Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) チョイ前に変数の宣言が話題になってたから俺も一ネタ言いたい 「redim で変数の宣言が出来る仕様はやめて欲しい」 変数名を間違えた時にエラーで気付けるように普段から変数の宣言を強制してるんだけど、 redim で配列を変更する時に変数名を間違えても 新たな別の変数扱いされてエラーにならないから気付かないことがある 配列変数でも宣言は dim 、要素変更は redim っていう風にしといてくれたらと願ってやまない Application.GetOpenFilename でファイルのパスを求められることが分かった Application.GetOpenFilename Workbooks.Open.Filename:=Application.GetOpenFilename ってできないことが意味がわらない あと Workbooks(Application.GetOpenFilename)ってやるとパス付のでエラーになってしまうこともわかった Workbookオブジェクトに適当な変数を宣言して iとする i = Application.GetOpenFilename i.worksheet()ってできない意味がわからない i = Workbooks.Open(filename:= ApplicationGetOpenFilename) i.worksheets() これならできる意味がわからない ()で戻り値をくくるのはわかる でもこの場合の戻り値はパス付戻り値であるから Applcation.GetOpen.... はいらないのでは?パス付戻り値ならば i = Application.GetOpenFilename でもできるのでは?WorkBookオブジェクト変数だから 誰か答えられる? わりと真面目に答えてくれ オブジェクト変数に直接パス付のファイル名をぶち込んでエラーになるのが意味わからない なんのためのオブジェクト変数なんだ Workbooks.Open(filename:= ApplicationGetOpenFilename) これもパス付のファイル名なのになんで格納できるんだ? まず型というものを理解してください つぎに、プロパティというものを理解してください つぎに、オブジェクトにはデフォルトプロパティというものがあるのを理解してください あと名前付き引数に対する理解も必要ですね VBAではSetでの代入とLet(を省略した)代入では意味が違うので、それもちゃんと区別してください いちいち全部ここで解説はせんが このぐらい理解すればたぶん答えはわかるだろ まじめに答えといてやるけど >オブジェクト変数に直接パス付のファイル名をぶち込んでエラーになるのが意味わからない たぶんお前がやってるのは、そのオブジェクト変数のデフォルトプロパティに代入しようとした で、そのオブジェクトがそれを受け入れないからエラーがでたんだろうな >Workbooks.Open(filename:= ApplicationGetOpenFilename) >これもパス付のファイル名なのになんで格納できるんだ? 格納の意味が分からん ApplicationGetOpenFilename(の結果)をたんにOpenの(filename)引数として渡してるだけ ApplicationGetOpenFilenameの結果がOpenのfilename引数として適当だからエラーが出なかっただけ パス付戻り値っていう表現が凄い Application.GetOpenFilenameの戻り値は、パス文字列か、パス文字列の配列か、ダイアログがキャンセルされたときに返されるFalseかのいずれかしかない パス付って、何にパスがくっついてると理解してるんだろう パスが戻り値そのものだろう >>414 意味がわからん 初心者相手に専門用語で勝った気になるなよ >>415 パスってのは ¥C:のことだろ? openメゾットの戻り値も¥C:ついてるのに WBオブジェクト変数に格納できる意味がわからない 専門用語でこたえるな わかりやすく答えろ 外人相手に口喧嘩して勝ち誇ってるやつと同じだわ workbookのオブジェクト変数のデフォルトプロパティってなんだよ そこを答えろ 答えろって言わないと答え出て来ねえのかよ ちなみにおれはVBA初めて3時間 ここまでの疑問が出るだけすごいと思うけど >>410 >Workbooks.Open.Filename:=Application.GetOpenFilename >ってできないことが意味がわ「か」らない Workbooks.Open Filename:=Application.GetOpenFilename なら動くんだが、それではダメ?(open と filename の間は半角スペース) 何故かと言えば言語の仕様として 引数はピリオドで繋ぐものではないからとしか言いようがない (workbooks はオブジェクト、open はメソッド、filename:=~ はその引数) >i = Application.GetOpenFilename >i.worksheet「s」()ってできない意味がわからない 変数i が workbook型だとして、Application.GetOpenFilename の戻り値はworkbook型ではない。 戻り値はvariant型なんだけど、キャンセル時に false になるだけで、ファイルが選択されていれば文字列が返される 複数ファイルが選択されてても文字列が配列で帰るだけ それに、i がworkbook型変数なので set を付けないとダメ i が variant型変数 なら文字列か false が帰るだけでヤッパリ workbook としての挙動はしない i.worksheet「s」() っていうのも、worksheetオブジェクトは 既に開いているブックのシートしか指定出来ないから、i がブックとしてオープンしてなきゃ当然ダメ >i = Workbooks.Open(filename:= ApplicationGetOpenFilename) >i.worksheets() >これならできる意味がわからない set i = Workbooks.Open(filename:= ApplicationGetOpenFilename) じゃないと動かないよ 理由は前述のとおり >>417 Openメソッドの戻り値はパスではなく、Workbookオブジェクトそのものだ 開いているブックの集まりであるWorkbooksコレクションオブジェクトに、引数Filenameで指定したブックを追加して、戻り値としてそのブックそのものを返す処理だ 何か根本的に勘違いしてるだろ君 >>420 お前がまだわかりやすいな ただし おれはすでに開いているファイルじゃないと操作できないとかは全部知っている オブジェクト型変数の前にsetステートメントを置くことも知っている つまり Application.GetOpenfilename = ファイルを開いた時は文字列が返される workbook型に返せないのか? 答えはパス付きの文字列で帰って来るためにノーだ これも知ってる Workbooks.Open filename:=Application.GetOpenfilename これも知っている しかし結果としては ファイルを選択で開いたパス付き文字列を開く という命令なはず 同じパス付き文字列なのにworkbook型に格納できないのが意味がわからない >>421 ん?なんで? msgboxで表示されてもパス付きになるよ? またも意味不明な現象が起きた 拡張子を指定しなかったのに開いた 拡張子を指定したらなぜかエラーが出た なんでだ? https://i.imgur.com/lqUNtRU.jpg >>418 オブジェクトには、特にプロパティ名を指定しないでアクセスする場合に、優先的に参照されるプロパティが決められていて、それをデフォルトプロパティと呼ぶ オブジェクト型に合わないデータを代入してしまう構文になっているときでも、データの型がデフォルトプロパティの型に適合していればVBAはデフォルトプロパティへの代入として解釈して処理を受け付ける >>421 Workbooks.Open(filename:= ApplicationGetOpenFilename) →\C:〜〜〜〜という文字列が返される ApplicationGetOpenFilename →これも同じ なぜ前者はWorkbook変数に格納できて 後者はできないんだ? >>425 そんなもん知ってるわ Rangeやcellsのvalueみたいなもんだろ? Workbookオブジェクトのデフォルトプロパティはなんだ? >>422 悪いけど>>410 の書き方じゃ分かってるようには見えない set を付けてない時点でこの人は分かってないんだなと判断されても仕方ない そして >Application.GetOpenfilename = ファイルを開いた時は文字列が返される も間違い Application.GetOpenfilename は、 あくまでもファイルのパス情報を文字列(或いは false)で返すだけで 実際にブックを開けることはしない だから正確に書くと Application.GetOpenfilename = ファイルを「選択した」時は文字列が返される というべきで、そのブックを開くためにworkbooks.open を用いる必要がある >>428 set オブジェクト変数を代入するとこに扱うステートメント >>428 ファイルを開いたっていうのは 選択したって意味なんだが オブジェクトとOPENメゾットで初めて開く こんなの知っている >>428 でもまだ不正確だった より正確に言うと Application.GetOpenfilename = 「開きたい(あるいは移動、コピー、改名、削除など何らかの操作をしたい)」ファイルを「選択した」時は文字列が返される ですね >>431 んなもんしってるわ キャンセル押されたらフェイルス ファイルを選択したらパス文字列 >>430 いや、それが分かってるなら何を問題にしてるのかがよく分からない それと「メゾット」じゃなくて「メソッド」ね 真面目に答えるんじゃなくて わりと真面目に答えるように >>418 ちなみにworkbookオブジェクトのデフォルトプロパティは存在しない 存在しないから当然、workbook型に合わないデータは代入できない >>435 じゃあなんで workbook.openのパス文字列は入るんですかねえ 質問の意味がわからないんですよね 何が疑問なのか、独自表現を用いずに、 set やなんかも省略せずに正しく動作するコードと 動作しない理由が知りたい動かないコードを書いてみてもらえます? >>426 workbooksは、workbookクラスではない 別のオブジェクトのクラスだ それから、さっきも書いたが、Openメソッドの戻り値は引数で指定されたパスを持つWorkbookオブジェクトなのであって、Openメソッドによってパス自体が戻ってくる訳ではない パスを返してくるApplicationクラスのGetOpenFilenameメソッドとは全く働きが違う プロパティやクラスや引数の名前で何となくbookとかfileとか付けばパス付のWorkbookオブジェクトが返ってくるものと混同してるようだが、きちんと区別しないといけない >>436 Openメソッドが要求する名前付き引数Filenameに、GetOpenFilenameで取得したパスを設定して、その結果新しく開いたWorkbookオブジェクトが返っているからだよ このFilenameはApplication.GetOpenFilenameメソッドの戻り値ではあるけど、Workbooks.Openメソッドの戻り値ではない Worksheets.Item(Index:=ActiveSheet.Name)みたいな処理と一緒だと言えば少しは分かるか? たぶんこの質問者は、コレクションを知らないタイプだな、 それから、式に含まれるプロパティ名やメソッド名をオブジェクトのクラス名と同一視しているタイプだろう たぶんハイパーリンクでパスが表現される事が多いところから、 パスが文字列とは異なるデータ型を持つ何かだと勘違いしてるだけじゃないの? >>441 workbooks.open filename:=Application.GetOpenfilename この場合はworkbooksオブジェクトに選択したパス文字列が格納されるのか? だからworkbook型に格納できるのか? >>444 ん? workbooks worksheets rows これはコレクションだろ? コレクションはオブジェクトの最上位 プロパティはオブジェクトの何? メゾットはオブジェクトに命令 違うか? >>446 君の言う「格納」は、コレクションへのオブジェクトインスタンスの追加、プロパティ値の設定、変数への代入、引数の受け渡し等がごちゃごちゃになっていると思う まず、Workbooksコレクションに、データの代入はできない WorkbooksコレクションはWorkbookオブジェクトの集まりを要素に持つコレクションオブジェクトだから それから、Workbooks.Open Filename:=Application.GetOpenFilenameという構文は、Workbook型の変数に値を代入しているわけではない Filenameという名前付きで定義されたOpenメソッドの文字列型の第一引数に値を渡していて、その結果としてOpenメソッドがWorkbookオブジェクトを返しているわけで、オブジェクト型変数への代入ではない >>447 コレクションは最上位じゃない 一番上にあるのはオブジェクト >>449 いやそんなのしってるんだけど dim i string dim wb workbook application.Getopen filename:=で目的のファイルを開く そしたら「¥:目的のワークブック.xlsx」が文字列として帰って来る workbooks.open filename:=目的のファイル これで初めて目的のファイルが開く ここで本題 どちらも目的のファイルのバス名が返ってきているのに set wb = application.GetOpen filename だとエラーで set wb = workbooks.open (filename :=目的のワークブック.xlsx) これならwbオブジェクト型変数に代入される意味がわからない これをはっきり答えろ わかりやすくな >>450 一番上 ↓ 最上 日本語やり直したほうがいい >>451 Set wb = Application.GetOpenFilename は、String型をWorkbook型のポインタへ代入しようとしてエラー吐いてる。 Set wb = Workbooks.Open(Application.GetOpenFilename) Set wb = Workbooks.Open("目的のワークブック.xlsx") は、OpenメソッドにString型変数を渡しているから機能する。 >>453 workbook型のポインタってなに? これがわかればすっきり >>447 コレクションはオブジェクトの最上位、という発想がそもそも間違い コレクションは子要素に追加されているデータやオブジェクトへのアクセス等を提供する、子要素からは独立したオブジェクトだ 更に、WorkbooksコレクションオブジェクトはWorkbookオブジェクトのみを要素に持つようにあらかじめ最適化された規定のコレクションオブジェクト >>453 WB型変数に文字列代入は不可 メゾットの戻り値の代入は可能ってこと? なんで? >>452 日本語だけ知ってても言語仕様を正確に説明する難しいんだよ コンピューター業界では「上位」などの言葉には特別な意味を持たせる場合もあるし、 とくに相手がド素人だと、言葉の意味から説明するのも面倒だから、あえて上位という単語は避けた上で なんとなく通じてくれそうな「上」って言い方をしたんだよ お前の態度が気に入らないからワッチョイ Spc7はNGするわ 人に何か質問する時は最後までていねいな言葉を使え >>457 うんこーwwwwwwwwwwうんこーwwwwwwwwww >>451 そもそもApplication.GetOpenFilenameはブックを開いてブックへの参照を返すメソッドじゃなくて、ユーザーにダイアログ画面上で選択させたファイルのパスを返すメソッドなんだが メソッド名で混乱してるだろ君 >>459 いやしってるけど キャンセルが押されたらフェイルスだし 選択したらパス名が返って来る 何回言えば気がすむんだよ Openメゾットはただブックを開くだけだろ? ただし 引数を戻り値として得られる つまり 開いたファイル名がOpenメゾット内にある 違うかい?いい線いってる? >>456 なんでも何もデータ型が一致するかどうかが問題であって、メソッドの戻り値の型は一致するってだけ。 たぶんJavaScriptから始めたせいで認識がおかしくなってるんだろうけど、 普通はデータ型が異なる変数同士の代入は出来ない。 この質問者みたいな人が言語仕様について思い込みや勘違いをしたまま共用マクロを組んだりすると、会社にとって迷惑なだけなんだよな 作ったマクロを他人と共有しないことを祈るのみ >>460 それ俺がきのう説明したことだよねw オブジェクト型変数にGetOpenFilenameから返った文字列型データやデータ配列を設定しようとしてるのがおかしいんだがw データ型とか一回学んだ方が良いと思うよ それから蛇足だけど、フェールスじゃなくて、フォルス、フォールス、ファルスの何れかの表記にしないと、Falseのことだと理解してもらえないことが多いと思うよ >>461 引数の文字列は戻り値にならない Openの戻り値はWorkbookオブジェクトの実体だ Workbookオブジェクトの実体とパス文字列はイコールじゃない それから、メゾットじゃなくてメソッドな あんまり特徴的な言葉づかいしてるとメゾット君と フェールス君とか呼ばれたりするかもしれないから気を付けなよ >>465 実体でなに?どころどころで補足質問しねえといけねえのかよ >>462 変数同士? workbook型あとは何? これも補足質問 >>464 データ型の参考ページは? 猿でもわかるやつ >>468 その言い方は猿に対して失礼だぞメゾット君 WordやPowerPointのVBAと違ってExcelは「Excel VBA データ 型」でググれば腐るほど情報が出てくるから、好きなページを読んで出直してきたらいいさ インスタンスもググってみたらいいよ >>466 Workbookの実体とは開いて実行しているエクセルブックのことだよ。ブックはVBAが管理しているメモリ上のデータではないってこと。そこにアクセスする為の情報だけがWorkbook型変数には格納されている。 これ以上はググったほうがいいな。メゾットちゃんには言葉だけでは通じないみたいだし。 どう考えてもこいつは型も文法も戻り値も理解できてないだけだろ インスタンスはお湯かけて3分で完成するよ (´・ω・`)b 体系だてた答えがほしいならオブジェクト指向あたりの本読んだ方がいいんじゃねえの 正確にはオブジェクト指向じゃないけどクラスとインスタンス(やそれにくっついてるメソッドやプロパティ)の関係を理解するにはそれがはや道だわ ここは教科書じゃないから >>470 ふーん 開いてから格納する これだけだよね?詰まる所は Openメソッドで開かないと workbook型に入らない それは結果に過ぎない ちゃんと原因や理屈を押さえないとまた同じことで詰むぞ >>477 それをわかりやすく教えて ほんとにわかりやすく ID:QIiUylbtpはVBA以外の言語知ってるの? それともExcel VBAで初めてプログラミングに触れましたって人? お前の学習レベルがわからないからお前でもわかるように説明できないんだ ここには、彼の疑問に答えられるような人はいない。 こんぴゅうたーのでんげんをいれるとどうしてえくせるがうごくのかをせつめいするのはむずかしい。 でんきにはつうでんしてるときとつうでんしていないときがあるのでそれをりようしてぜろといちをくべつできる。 ぜろといちをくべつできればにしんすうをりようして... 大体教えてもらう立場のやつがとる態度じゃないからまともに取り合ってもらえると思ってる時点で頭が悪い 初心者なのに態度悪いからNGにしたわ。 教えてもらう態度じゃないよね。子供ならまあ納得だけど。 そもそもWorkbooksに指定するのはエクセルファイル名じゃない。 ブック名だ。 開いたブックのブック名とファイル名が同じになるから勘違いしてる奴もいるかもしれんが。 同じだったらファイル名でええやんw何鼻息荒くしてんの?w >>485 恐らく>>484 はWorkbooks.Itemの引数について話してるんだろうだが、君にはそのあたりが分からんみたいだな >>453 をもとに考えてみた お金を入れるとカップにジュースが注がれる自販機を思い浮かべるんだ Set wb = 'ジュースが入るカップ Workbooks.Open( _'お金を判別してボタンが押されるとジュースを出す回路 Application.GetOpenFilename _'お金 ) →お金を入れてボタンを押したらカップにジュースが注がれる Set wb = Application.GetOpenFilename →カップに直接お金を入れて飲めないと騒ぐあほ どうだ!? >>451 お前バカだろ 変数wbはただの入れ物 workbook型しか入れられない入れ物にString型入れようとしてんだぞ? これでわからないならただのバカだから二度と来るな >>490 おまえのカアチャンは誰でも受け入れるのにwbって意外と固いんだな >>490 うん それはしってるよ でもworkbooks.Openでも同じだよね 文字列帰って来るよね application.getOpenfilename →あ.xlsxを選択 C:¥あ.xlsx が帰って来る workbooks.Open filename:=application.getOpenfilename(つまりC:¥あ.xlsx) ん?どっちもパス付きのブック名じゃねえの? ってことをいってる >>493 文字列として返ってきたから文字列型と思ってるなら、一回workbook型をウォッチに入れてみたら? ツリー形式でオブジェクトの、中身が見れるから全然別ものだとわかるはず >>492 バーカw "C:\うんち.xlsx"がworkbooks型の変数に代入できる分けないだろw まあデフォルトプロパティなんてものが罪なんだが てか、workbooks型のデフォルトプロパティってNameプロパティなんだな(Pathか?) はじめて知ったわ、使わんから Application.GetOpenFilename → 指定したファイルのパス【String型(正確にはVariant)】を取得 Workbooks.Open → filenameに【String型でファイルパスを指定】すると そのファイルを開いた結果の【Workbook型オブジェクト】を取得 Dim str as String Dim wb as Workbook str = Application.GetOpenFilename →OK str = Workbooks.Open(Application.GetOpenFilename) →NG Set wb = Application.getOpenfilename →NG Set wb = Workbooks.Open(Application.GetOpenFilename) →OK オブジェクトブラウザーを見ると勉強になるよ それぞれ、こうなっている Class Application Function GetOpenFilename() Class Workbooks Function Open(Filename As String) As Workbook >>486 違う。 新規ブックの場合はファイル名じゃないだろ。 理解出来て無い奴に理解出来る奴向けの説明をしても駄目だ。 たまたま同じになってもブック名はファイル名じゃ無い。 だからパス付きだろうがパス無しだろうがファイルはファイルだと考えても、それとは関係ないブック名は違う。 C:¥abcd.xlsxというファイルとブック名としてのabcd.xlsxとは何の関連も無い。 似たように見えるのはたまたまだ。 だからC:¥abcd.xlsxはブック名には成りようがない。 >>493 Application.GetOpenFilenaneで帰ってくるのは"C:¥あ.xlsx"という文字だけな。 Excelブックとは関係ないファイル名だな。 例えばメモ帳で適当に入力して保存したファイルでも取ってこれるだろ。 それに別に"C:¥あ.xlsx"はExcelじゃないと開けないというわけでも無いぞ。 そもそも"C:¥あ.xlsx"はApplication.GetOpenFilenaneで取ってきたからファイル名だろうけど、取ってきた後のその文字列は=ファイル名とは限らん。 Dim wb As Workbook Dim strFile As String strFile=Application.GetOpenFilename ってのはstrFileにたまたまApplication.GetOpenFilenameによってファイル名が入ったということで、 Set wb = Workbooks.Open(strFile) のstrFileがファイル名かどうかは分からん。 このー文はApplication.GetOpenFilenameのことなんか知らんからな。 このー文の意味するところはstrFileをファイル名と思って開いてみて、開けたらwbに格納するってこと。 短くわかりやすくまとめられるやついねえの? いくらVBAができたって引き継ぎができない奴は無能なんだが 俺もずっとROMってたけど こいつらの説明はマジで意味不明だわ お、良い線言ってんな って思ったらいきなりカタカナ語がでてきてググっても意味不明 こいつらマジもんのコミュ障すぎてイラつきしかない オナニー発言ばっかで答えがない Apllcation.GetOpen でaaaっていうエクセルを開く C:\aaa.xlsx が返ってくる しかしWB(Workbookオブジェクト変数にしている)では指定できない でも Workbooks.Open filename:=Apllcation.GetOpen これはWorkBook型に入る つまるところどっちもC\aaa.xlsxって文字列を返してんじゃねえの?何がちげえの?ってこと これいうの10回目ないい加減学習しろイラつくな こいつらのたとえ 子供がリンゴを指さす 「これなに?」 こいつら 「これは物質○○が含まれて○○っていう色素があって赤い、つまり栄養は○○がふくまれている ちなみにその栄養は○○って物質にも入っている」ドヤァ って感じ 見ててムカつくから発言したわ おれが聞きたいのは なんでワークブックスオープンで指定したファイル名文字列だとワークブック変数に格納できんだよって話 ゲットオープンはパスがついているから格納できないのはわかった わかりやすく答えろ 前にいた関西弁の荒しと同一人物なんだろうけど、健気にもちょっと勉強してきてるのが笑えるw >>501 無理。 軍事用にコンピューターというものが発明されてから今日までの歴史と仕組みを説明しなきゃならんから。 そして、君にそれを理解出来るだけの能力が有るとは思えないから。 大抵の人は全てを理解しているわけじゃ無いが、自分の利用している範囲ぐらいは理解している。 >>499 ん? >Apllcation.GetOpenでaaaっていうエクセルを開く これ間違い。 開かない。 ファイル名を取得するだけ。 >しかしWB(Workbookオブジェクト変数にしている)では指定できない ファイル名じゃないからな。 ブック名を指定する必要がある。 たまたま偶然ファイル名と同じだけどパス付きはブック名とは違うな。 >Workbooks.Open filename:=Apllcation.GetOpen これはWorkBook型に入る Workbook型に入ってるのはファイル名じゃない。 Set WB=Workbooks.Openの意味するところはfilenameに指定された文字列をファイル名と見立ててブックを開き、もし仮に運よく開くことができたらそのブックをWBに格納するという意味。 >指定された文字列をファイル名と見立ててブックを開き これが意味不明 GetOpenで指定したファイル名を返すんだろ? じゃあこれはファイル名になるじゃねえのか? ファイルを開かなかった場合はファルスがかえることはわかる >>505 GetOpenFilenameの文とWorkbooks.Openの文は別の文だろ。 プログラム組む奴はGetOpenFilenameで取得したものと違うものを入れることも出来る。 だから結果的に入ったのはファイル名でも、 Workbooks.Open自身はそれを前提にはしないだろ。 >>496 このレスの一番下がわかりやすいんじゃない? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる