今どき
Application.ScreenUpdating = False
なんてしないよね?
するよ?
ただExcel2013,2016対策でその一文で済まないことが出てきたけど・・・。
>>6
するでしょ
セルへの書き込みいちいち描写すんの? >>7-8
最近では自分はほとんどしなくなった
要所要所でしか書き込まないからちょうどいい進捗確認になる。 >>6
そうね
recordset張り付けがほとんどだから 確かに高速化する過程で描画とかあんまり関係無くなるよな
でも昔作ったクラスを流用してるから計算と警告止めるついでに描画が止まる
まあ確かにあんまりパチパチ書き込みせんな
めんどくさくて適当に作ったときは使う
前スレ>>988
>最新のプログラミング技術って今は何なんだろうな。
操作するだけで勝手にプログラムを書いてくれる技術。
これ以上のものはないんじゃないの。 >>14
実は20年前にExcelは時代の最先端を進んでいたということかっ!? マクロレコーダーならEmacsやVimのほうが歴史が古いと思うぞ
モジュールのエクスポートってエクスプローラにドラッグ&ドロップするだけでいいんだな。
今まで律儀にプロジェクトから右クリックメニューからエクスポートしてたわw
マジかw
めっちゃ便利じゃねえか!
もしかしてインポートも?
>>19
Yes.
さっき多数の.basモジュールをExcelからPublisherに移動させるときに気づいた。 質問です。
今日になって、いつも使用しているマクロの途中でExcelがハングアップするようになりました。
環境はWindows 7 pro 32bit、Excel 2010
発生するタイミングをトレースしたところ、Workbook.Open()メソッドでした。
全体的なフローとしては、
001.xlsxを読取専用で開く
→データを解析
→閉じる
→条件を観たした時、001.xlsxを書き込み可で開く※ココでエラー発生
となります。
・閉じた後のメモリの開放が不完全なのかと思い、Set WB = Nothingをしましたが効果はありませんでした。
・2回目に書き込み可で開く直前に、001.xlsxを空の新規ファイルに差し替えましたが、同様のエラーが出ました。
・他のPCも同様にダメでした。
(Windows10 Excel2016で試した場合はハングアップしない代わりに、Open直後でマクロが強制終了されたかのような状態になりました。)
※初回は大人の事情でどうしても読取専用で開く必要があります。
※関係あるかは不明ですが、昨日Windowsの更新がありました。
皆様の知恵をお貸し下さい。よろしくお願い致します。
とりあえず、簡単にこれとか試すのは?
これが通るなら元の2行目の何かがいけない。
001.xlsxを読取専用で開く
→ たとえば1+1を計算して見る
→閉じる
→001.xlsxを書き込み可で開く
とりあえず困った時はdoeventsを間にかます
nothing の次ぐらいに書いてみたらどないだ?
質問です
VBEでマクロを修正後実行しても再コンパイルされず
修正前のものが実行される時があります
強制的に再コンパイルさせる方法ってないでしょうか
>>24
> 修正前のものが実行される時があります
気のせいだと思うけど、もし本当にそうなら、VBEのメニューの「デバッグ->VBAプロジェクトのコンパイル」でコンパイルできる。 >>25
ありがとうございます
メニューの目の前にあったとはw はずかしい
時々エラーを修正してもエラーが続いて「なんでだーー」と嵌り、
再コンパイルされてないとやっと気づいでexcelの再起動で対処
面倒くさくていらついていました >>22
書き忘れて申し訳ないのですが、上記の処理を連番になっているファイルに対して順番に実行するようになっており、処理する順番を色々並び替えた結果、発生する周回数はランダムで一定以上重い処理が続いた後に起こる傾向がありました。
一応空のファイルを100個用意して回してみましたが、軽い計算では発生しませんでした。
>>23
なるほど!DoEventを試してみます。 >>26
変数を未定義のまま実行して、デバッグ中に未定義だった変数を定義すると停止しても永久にエラーが出るようになるね。
やってしまったら、エクセル再起動か該当の変数を使ってるマクロを切り取りして一度コンパイルを通す必要があってめんどくさい。
だから実行前には必ず手動でコンパイルするような癖がついたわ。 コンパイルっていうけどさ、それで何か実行ファイルが出来るっていうわけじゃないよね?
文法エラーや未定義の変数のチェックには役に立ってるけど
>>28
マジですか
未定義でばっと作ってデバッグ修正、後から定義することがよくあるのできっとそれですね
うちのシステムがおかしくなってきてOSの再インストールが必要かと思ってました >>21 開けないファイルを右クリック→プロパティ→ブロックの解除 VBAで未定義変数の問題なんてあるの?
必ず初期値は決まっていると思ってたけど。
>>32
Option Explicit を付けたら変数の宣言を強制されるよね。それでその変数のスペルミスをすれば当然エラーになるよね
少なくとも俺はそのつもりで書いているんだけど >>33
ああ、宣言してないってことか。
未定義を未初期化の意味にとってた。
スマソ >>25
マジであるよ。
俺の場合、「Msgbox ""」の文を行ごと消したのに、
延々メッセージボックスが出続けた事があった。
保存して開き直したら直ったけど。 >>35
それってステップ実行したらどうなるんだろう
幽霊が出てくる? >>17
プログラムコードの線引きをどこでしてるのかわからないけどExcelで実現できてることと同じだよ 一時期、「仕様書書くだけでプログラムを自動生成してくれるソフト」みたいなのが夢物語として頻繁に語られた事あったな。
「金が無限に湧いてくる壺」みたいなもんで、本質的にあり得ないし、あったとしても誰にも公開しないだろっていう。
>>38
> Excelで実現できてることと同じだよ
違うでしょ
> たとえば現在行を消してキルリングに入れるにはC-a C-k C-kを使います。
の操作は
> (fset 'kill-current-line "\C-a\C-k\C-k")
になるけど欲しいのは
> (defun kill-current-line () "現在行を削除する"
> (interactive)
> (move-beginning-of-line 1)
> (kill-line nil)
> (kill-line nil))
だし
そのために elmacro.el なんてものがある
http://emacs.rubikitch.com/elmacro/ > 本質的にあり得ない
仕様書のレベルによるでしょ
状態遷移表からコードを生成するツールは大昔から使われてるし、UML からコード生成する Rhapsody なんてものもある
まあ >>39 は Excel みたいなソフトが欲しいって入れたら Excel のソースコードが出るような奴を想定してるんだろうけど w VBAが他言語と比較して下に見られるのはどうしてだろう。
他はCとHaskellしか触ってないから他言語はちら見だけど、OOPを使わないからどれも同じに見える。
むしろ、会社のPCにはエクセルは大体入ってるからコンパイラなしでスクラッチで書けて具合がいい。
また、Office系を動かすにはこれしかないんじゃないの?
30年以上前の話だけど、当時のパソコン雑誌(アスキーとかI/Oとか)には
投稿プログラムの16進ダンプリストが何ページにもわたって掲載されていた。
それを読者が手打ちで打ち込んでゲーム遊んだりしてたわけだが、
何の脈絡もない数字とアルファベットの羅列をひたすら打ち込む作業は
ドラクエの復活の呪文どころではない大変さだった。
一人でやってたら辛すぎるんで、
何人かで分担を決めて打ち込んで後でマージするんだけど、
それでも辛いことにはかわりない。
ダンプリストの端に付いてるチェックサムだけを入力して
ダンプリストを生成するようなプログラムが出来ないものかと
本気で考えていた。
>>42
このスレでVBAの悪口を言っていたのはC言語処理系しか触った事無くて文法的に拒絶反応起こしていた奴らだな。
C言語処理系があまりにも氾濫しすぎていて、プログラム言語といえばC言語の文法って考えちゃってるんだと思う。
だから異なる文法の言語は全て本格的でない、オモチャみたいなものに見えるんじゃないの。 >>44
この原因もあるけど、使い手がピンきりってレベルじゃないのもある
オブジェクト指向サポートしてないし、製品の付属品ってこともあって軽んじられるのは多少仕方ないよね
まあ俺は使うしかないから使うんだけど >>42
言うほど下には見られてないんじゃないか? >>29
> コンパイルっていうけどさ、それで何か実行ファイルが出来るっていうわけじゃないよね?
コンパイルするとP-codeと呼ばれる中間コードに変換される。
メニューからコンパイルすると、Bookを保存するときにそのP-codeも含めて保存されて、次回からはコンパイルが不要になる、みたいなことをどっかで見た記憶がある。(嘘かも) >>44
関係ないけど昔
「2chで悪口が頻繁に言われればMicrosoftも対応せざるを得なくなるよな」
と本気で言ってるやつがいた VBAはコレクションを扱うのにいちいちループ処理が必要なのがめんどい。
デフォで高階関数実装してくんねーかなあ。
高階関数って使ったこと無いけどちょっと調べた限りだとクラスを多用すれば似たような書き方に近づけそう
>>40
何が違うって言いたいのか理解できないんだけど
操作内容をプログラムとして利用可能な状態で記録できてないの? >>42
汎用言語じゃなく基本的にOfficeでしか動かないにもかかわらず
ループ処理や配列処理で低いレイヤーを意識した90年代的コーディングが必要だから
あとVBAerの質の問題 あーあとWindowsプログラミングでC++かVBかっていう時代に
VBはアマチュアでC++がプロみたいな印象があってその名残もあるかもね
C#かVB.NETかっていう時代になってもなぜかVB.NETは馬鹿にされがち
>>52
> 何が違うって言いたいのか理解できないんだけど
>> (fset 'kill-current-line "\C-a\C-k\C-k")
これは単にキーシーケンスを記録/再生してるだけでしょ
例えば条件判断して動作を変えようとしたら Emacs のキーマクロ再生ルーチンに手を入れる必要がある
>> (defun kill-current-line () "現在行を削除する"
>> (interactive)
>> (move-beginning-of-line 1)
>> (kill-line nil)
>> (kill-line nil))
これなら Lisp と Emacs のキーバインドがわかってる人なら条件判断でもループでも組み放題ってこと >>55
上の方でも動くのは動くんだろ?
自動生成にそこまで精度は求めない >>56
動けばいいというならもうなにも言う必要はないね VBAerの質っても初心者が多いってだけでしょ。
敷居が低い以上しかたのない話だね。
>>58
プログラマーじゃなくてマクラー止まりがほとんどだからな VB系列メインの人材って吐き気がするほど低品質なコードを生産するから業界全体で悪いイメージが定着してるんだよ
そして坊主憎けりゃ袈裟まで憎いの理論でVBまで悪者になってしまった
>>55
後者のほうがコードとしては使いやすいとか読みやすいのは理解できるが
前者でも条件判断だろうがループだろうが別に使えるし
必要ならキーシーケンスにバインドされてるコマンドに変換することもできる
本質的な違いがあるようには思えないわ >>58
うーんそうじゃなくて、例えば他の言語もバリバリに使えるけど目的に応じてVBAも書くっていう人がまず少ないでしょ?
それに経歴の長い人でもメンテ不能な独善的コードを書く人が他の言語に比べて相対的に多いと思う
逆に誰でもメンテできるように仕様書やテストコードもきちんと整備して、わかりやすく読みやすいコードのかけるVBAerは超レア
※個人の感想です >>62
保守性が高く、仕様書とテストコードが完璧で、分かりやすく読みやすいコードを書ける人材が、
他の言語では掃いて捨てるほどいるというのか・・・。 計算結果を出力する以下の行でエラーでたま〜に止まる。
ws_out.Cells(LastRow_out + 1, 1).Resize(200, 12) = Out
エラーの内容は”アプリケーション定義またはオブジェクト定義のエラーです。”というもの。
エラーが出るとVBEが立ち上がってるからF8で逐次実行すると何もなかったように無事に書き込まれる。
そこで、On Error GoTo ErrorHandlerを追加し、
以下のように再帰で再び書き込もうとすると数回エラーは出るもののその後は無事に書き込めるという訳わからんことになっています。
(続く)
途中が書きこめない・・・なんで?
つまり、ws_out.Cells(LastRow_out + 1, 1).Resize(200, 12) = Out
で、無事に書き込めるときもあれば、書きこめないときもある。
その違いが全くわからないという状況なんです。
今のところはエラー出たら何度も書き込みをトライして無事書きこめている状況です。
なんか気持ち悪いのでエラー発生の原因を知りたいのです。
どなたかアドバイスを宜しくお願いします。
なぜか、On Error GoTo ErrorHandlerの内容が書きこめない・・・
>>64です。
なんか書きこめないので画像ですみません。
>>63
「完璧」って急にハードル上げるなよ
会社や使ってる言語にもよるだろうけど
例えばそこそこの経験があるRuby使いが10人いれば少なくとも3~5人は
メンテできるように仕様書やテストコードもきちんと整備して
わかりやすく読みやすいコードのかける人っていう印象
VBAだと20人に1人いるかどうか(※あくまで印象)
VBAerの質というよりVBAと他言語の文化の違いかもね >>64
アプリケーション定義のエラーってセルのアドレス指定がおかしいんじゃねえかと
0とか指定してんじゃね? >>61
> 前者でも条件判断だろうがループだろうが別に使えるし
どうやってやるの?
具体的に書いてみて
> 必要ならキーシーケンスにバインドされてるコマンドに変換することもできる
それが elmacro.el
そもそも○○すればできる
って言い出したらそりゃなんでもありありだよ VBAのBがいけない。
VCAだったら誰もバカにしないだろう。
>>71
やるなら他でやってくれ
既にVBAの話題じゃなくなってる >>71
ググるなりEmacsスレに行くなりお好きにどうぞ
別にelmacroみたいな追加パッケージが必須なわけじゃないんだよ VBAは自分の仕事を効率化するためにだけ使ってる人が多いと言うことでは?
他人に引き継がせるのを想定していないのに、業務上引き継ぎを求められる時に問題となるのではないかと。
普段からエレガントなコードを心がければ別に自分用だろうがなんだろうが引き継ぎに問題はないはずなんだが…
VBAは使い捨てだから自分用だからという理由を免罪符にして雑で汚いコードを書く人ばかりだから困る
他の言語では丁寧に美しいコードを書く優秀な人ですらVBAになると所詮はVBAだし適当でいいだろと開き直る
VBAは人を堕落させるなにか不思議な力がある
>>79
レガシー環境だとエレガントに書こうとしても理解してもらえない だいぶ前から特定のソースコードが書き込めないし、エラーすら出ない
なぜかNGワード判定すらスルーされて、原因を絞り込もうとすると連投エラーだけは出て絞り込みも困難
2ちゃんねるのCGIのバグだと思うけど、どうすりゃいいんだ
>>82
ダブルクォーテーションでエラー出てたことあったしその辺の関係じゃないかな 多義的な形容詞を具体例を示さずに不用意に使う人間はそういう人間なのだと思ってる。
コードを書き込むとエラーすら出ずに書き込め無いことがある
2chとはそういうもんだと諦めるんだな
不便だと思うなら他のコミュニケーションサイトを使おう
>>75
君はいつも自分の無知を棚に上げて嫌味な物言いだよね
煽っても教えてあげないから
つかEmacsユーザーなら少しググればすぐ分かるだろ
レコーダーで記録したマクロをきれいなコードにするには
大なり小なり編集が必要なのはどのツールでも同じ
Excelは違うと思ってるんなら別にそれでもいいんじゃない >>66
これってほんとに成功するケースと失敗するケースで何も条件変わってないの?
書き込もうとしてる値とか対象とかActiveSheet/Selectionとか
intermittentなエラーってあまり聞いたことがない >>70
>アプリケーション定義のエラーってセルのアドレス指定がおかしいんじゃねえかと
>0とか指定してんじゃね?
いや、エラーで止まる度に各変数の値は確認していますがそんなことはないんです。
その証拠にエラーで止まって変数確認したすぐ後にF8押すと問題なくその行が実行されるんです。
変数は書き換えてないのに・・・
殆どの場合は問題ないんですが稀に止まるという気持ち悪い状況なんです。
他に考えられる原因ってありますかね? >>87
条件は変わってないはずです。もっとよく考えてみますが。
昨日もエラーでてましたが変数など書き換えずに書き込みを数度繰り返し無事書きこめました。
アクティブシートを切り替えても普段は正常に書きこめます。
書き込む値についてはあまり気にかけていませんでしたが、
エラーで止まった後にF8で問題なく実行できるので値が原因ではないような気がしますがどうなんでしょう?
>ws_out.Cells(LastRow_out + 1, 1).Resize(200, 12) = Out
のOutは標準モジュールでPublic Out(1 To 200, 1 To 12)で宣言しているものです。
型指定なしの宣言です。 Win8やWin10はアプリを終了してもすぐにプロセスが消えないことがあるんで、
条件が完全に同じかどうか使用者でもわかってない場合がある
恥ずかしいのは後出しで「きれいなコード」とか言い出したアホなんだけど w
> 別にelmacroみたいな追加パッケージが必須なわけじゃないんだよ
と言ってどうするのかと思ったら
> レコーダーで記録したマクロをきれいなコードにするには
> 大なり小なり編集が必要なのはどのツールでも同じ
とか笑えるわ
>>85
書き込んだのに書き込めないとはこれいかに emacsのことは知らないし今のところ興味もないんです
>>93
もうみっともないな
Emacs知らないのに無理して突っかかる必要ないだろ 他人にまで突っかかるようになったらおしまいやね w
>>90
今の環境はWin7 + Office2010 です。 >89
>Outは標準モジュールでPublic Out(1 To 200, 1 To 12)で宣言しているものです
リトライしたときにOutが戻す値が変わってるんじゃね
戻り値一回変数に受けて、エラーが出たときと出ないときで比べてみれば?
最近エクセルVBA勉強し始めたど素人です。
どなたか教えてください。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_listbox.html
↑のページに書いてあるコードを参考に検索フォームを作ってます。
検索するデータを配列mydataに格納して、検索で一致したデータをmydata2に格納するコードについてなのですが、
If myData(i, 2) Like "*" & TextBox1.Value & "*" And myData(i, 7) Like "*" & TextBox2.Value & "*" Then
上記コードは、テキストボックス1で2列目、テキストボックス2で7列目を検索していますが、
テキストボックス1で2列目〜7列目まで範囲を広げて検索をかけるようなコードにできないものでしょうか?
mydataのなかにrangeやcells等入れて試してみたんですが、なかなかうまくいきません。
どなたかご教授ください・・・ >>88
そら大した証拠になってない
その処理でエラーの場合明らかにワークシートかセルにたいしておかしな値を指定してるのが問題だろう
そもそもどういう処理の流れでってのがわからんとなんとも言えないのだがな
まあ、とにかく問題の切り分けだ
エラーで止まってから確認するんでなく処理の流れで確認しないとダメなこともあるんでDebug.Printか.Assert入れて各変数およびオブジェクトの値やら型やら全部確認してみて
そしたらおかしなところで止まるからそれが原因 iで縦をなめてるのなら同じように横をなめればいいよ
2列目と7列目を固定で検索してるのはどこかわかれば見当つくと思う
>>102
for i = iの最初 to iの最後
for j = 2 to 7
if myData(i,j) like テキストボックスの値 then
処理
next j
next i
恐らくiはループ変数だと予想したんだが、間違ってないよな?
聞くときはその辺もちゃんと書いてくれないとエスパーにしか答えられなくなるぞ >>102
>最近エクセルVBA勉強し始めたど素人です。
だったら、こんな難しいのじゃなくて、
Excelのフィルタ機能を使っている所をマクロ記録して、
改変するほうが簡単。 >>102
氏名は2列目じゃなくて1列目、住所は7列目じゃなくて6列目にしないといけないのでは?
つまり
If myData(i, 1) Like "*" & TextBox1.Value & "*" And myData(i, 6) Like〜 likeなんて関数があるんだね。全部自作してたわ。
>>109
どう見ても氏名は2列目で住所は7列目なんだが…
初心者にデタラメ教えてどうする。
>>110
関数と演算子の違いくらいわかろうぜ >>111
オッ、今はセル範囲.Value で取れる配列が 1オリジンなんだな!!!
素で間違えていたわ。スマソ >>102
自分のプログラムではセル範囲からとった配列を0オリジン(LBound = 0)に変換する関数を10年くらい使っていて
無意識のうちにそれがデフォルトの仕様だと思いこんでいた。
>>109は忘れてください。すまんこって >>111
arityが2の中置関数だよ、演算子は。関数の方が概念として広い。
こういう感覚がないのだな、プログラマって。 関数型プログラミングが難しいと言われてるのも分かった気がする。
配列の上下限を設定できる言語使ってのにわざわざ変換するとか意味わからん...
>>118
複数の配列を扱うプログラム中では下限を統一しとかないと面倒でしょ >>116
概念として 関数⊃演算子 なのはわかる。
ただVBAで関数と演算子は使い方が明確に区別されてるから、
VBAでLikeや四則演算を関数と呼ぶには物凄く違和感がある。 >>120
そのために下限を設定する機能があるんだが... >>121
+ を関数って呼ぶようなアスペの相手するなよ >>122
Option Base をどうしようと
範囲.ValueのLBoundはで1SplitのLBoundは0じゃなかった? >>123
まあこの世に数学がまずあってプログラム言語はそこから派生すると考えれば
演算子は関数の一種だし、そう考えなければ別物だし >>124
あと VBA.Array も Option Baseと関係なしに LBound=0 だね。
(Array はOption Baseの指定通りになる) >>88
それって結構よくあることだと思うんだが。
PC再起動すれば直る。
っちゅうか、それエラーって認識なの?
確かにエラー表示だけどさ。
あれだろ、ステップ実行はできるんだけどやたら止められる奴だろ。
止まってもF5で続行できるけどすぐ別の所で止まる。
んで、止まった場所見てもおよそエラーとは考えられないようなの。 >>126
基本は0だけどvarArry=Range("C3:P250")みたいなのは1からになるだろ。
で、混在するから素直にLbound使う。
上記のようなことしないなら0使うな。 >>128
混在して厄介だから統一するために
「セル範囲からとった配列を0オリジン(LBound = 0)に変換する関数を使う」
という話なんだが。
つまりvarArry=Range("C3:P250")としたあとすぐにLBound(varArry)を0にチェンジしておけばそのあと楽だ、ということ。 >>129
よくわからんな。
Lboundのまま使わんの? >>130
すごく単純化して言うと、関数の引数が ArrayA と ArrayB で、
For i : ArrayC(i) = ArrayA(i) + ArrayB(i)
みたいにして作った ArrayC が返り値だとして、
ArrayA と ArrayB のLBoundが違っていたら単純に面倒な上にArrayC のLBoundを
何にするかが問題になる。
だから全部0に統一したい。 Option Base で 0 にしときゃいーだろとめんどくさそうな流れ全然見ずにw
>>133
Option Base = 0 にしといてもExcel VBAの仕様で範囲.Value のLBoundは強制的に 1になっちゃうんだよ。 ABの境界チェックして違ってたらエラー
同じならCも揃えて返せば良いだろ
形の違う行列を加算するのは100円と100グラムを加算するようにおかしな行為なんだよ
素人ってこういう当たり前の感覚もないんだな
つうかまあそもそも配列をそのまま使うのがトラブルの素なんだけどな
>>135
形も長さも同じでLBoundが違うだけでもおかしいな行為なのかよ?
その感覚の方がおかしい 例えばArrayAはテキストファイル由来の配列データでLBound=0
ArrayBはワークシート由来の配列データでLBound=1
同じ大きさだとして、これを比較して何か結果を返す関数なんていくらでも考えられるだろ?
>>136
もうすでにどっちの下限使うかで判断付かなくなってるだろ
何も悩まず自然な定義が出来ない時点でその処理はどこかがおかしいんだよ
こういうコードに対する感覚って大事だぜ >>138
だから0に統一すると言っているじゃないか >>137
それはフォワードオンリーなシーケンスとしてABを抽象化してシーケンス比較する時の話だろ
行列の加算と全く意味合い異なるんだが素人には同じに見えるのか? >>138
コードに対する感覚っていうことなら
Option Base 0 と設定しているのに 範囲.Value のLBoundが 1になるのがおかしい、
が正解なんじゃないか?
製品の仕様に文句付けても実りがないから、0に統一する関数を自分で作るというのはとても真っ当だと思うけどね。 >>139
それはお前のルールだろ
世の中には1ベースの方が自然な人も沢山いるんだよ
どうしても違う形の行列を加算したいなら配列とオフセットを渡すようにしなさい >>141
アプリケーション側で指定したOption Base 0にライブラリ側が従う義理はない
当然ライブラリにそれを求めて達成できなければおかしいと考えるお前がおかしい >>140
シーケンスがどうとか関係なく出来上がった結果の配列を処理するときの話だぞ?
出来上がった配列を引数に取る関数が、その配列の由来がどこかなんて気にしないだろ。
加算:ArrayC(i) = ArrayA(i) + ArrayB(i)
と
比較:If ArrayA(i) < ArrayB(i) Then〜
で何の意味合いの違いがあるというのか? 配列の加減を統一する関数の発想はなかったな
まあ最近はあんまり配列使わんけど
>>144
ソースがファイルだろうがシートだろうがメモリだろうが同じ話だよ
行列の加算なら形が違うのはおかしい
形が同じならおかしくない
シーケンスの比較なら形が違ってもおかしくない >>138
Function FuncX(配列A, 配列B)
という関数があって、配列Aと配列Bが同じLBoundであるべきだ、っていうのはまあその通りさ。
俺が言っているのは、FuncXのユーザーがふたつの配列を渡したいんだけど、片方はLBound=0で他方はLBound=1のとき困るから
LBoundを0に変える関数を用意してあげる、っていう意味だぞ? そもそもな
102のmydataの型は配列ではなくrange
そのため1スタート
その他の表にとらわれない型は0スタート
これだけの話
>>148
エラーにする
オフセットを指定するようにする
配列ではなく別の抽象コンテナを作って配列をラップする
下限が違うのに勝手に下限を揃えて処理をするなんて直感に反するよ >>149
2つの配列の各次元の下限上限が同じならそれらを同じ形とする >>151
それは単に不便だ。
セル範囲由来の配列を使う場面は多い。
>>152
俺の定義は違うな
「2つの配列の各次元のサイズが同じならそれを同じ形とする」だ >>151
「勝手に」とか「直感に反する」とかいうのがまさに主観的過ぎてついていけませんね 「配列とオフセットを渡すようにしなさい」
とかいうのも微妙におかしな主張であるな
>>155
伝統的で直感に反することなく要求を満たしている方法の筈だが?
無論最初にあげたようにエラーにするのが最も安全だ
とはいえオーバーヘッドを避けたい場面もあるからな >>156
どうでもいいよ。
単に「不便だ」、と言っている。
ユーザーにとってLBoundが違うだけでFuncXが使えないのが不便と感じるなら
LBoundを0に変える関数を用意したから使ってね、というだけのこと。
もしくは 範囲.Value をラップして LBound=0の配列を返す関数を用意するとか。
「勝手にLBoundを変えるな」とか「直感に反する」とかどうでもいいや。俺はな。 なるほど
様々な視点があるからモノは準備はしておいて
使うかどうかは利用者に任せるよってスタンスなのね
>>158
それなら別にいいぞ
勝手に変換かけたりクライアント視点で直感的でない法則で比較したりしなければな
そういうことをやると後々不便になるから あいも変わらず上から目線の嫌味な人ばっかりだね
こういう人たちが目につくからVBAerって嫌われるんだろうな
>>158
俺は君の感覚のほうが普通だと思うぞ LBoundなんて飾りなんですよ。
LBound=0の配列xのx(0)とLBound=1の配列yのy(1)は相対的に同じ位置なんだし。
また恐ろしくどうでも良いことでやりあってるなw
むしろ誰か>>150へ突っ込んでやれw >>132
はあ?
何が面倒なの?
全く面倒じゃ無いだろ。
ArrayCのLBoundは0にするだろ。
お前は基本0始まりじゃ無かったのか?
お前のルールでは範囲.Valueの時だけだろ1始まりにするのは。 プログラムに普遍的な解法なんてないから(あったら自動化されてるから)、
せめてケースを限定して取り扱い方を議論してくれ。
>>132
普通に i を 0 ベースにして
ArrayC(i+LBound(ArrayC)) = ArrayA(i+LBound(ArrayA)) + ArrayB(i+LBound(ArrayB))
ってやればいいだけでしょ
面倒なのはわかるけどそんな箇所がはそうたくさんにならないだろ
> ArrayC のLBoundを
> 何にするかが問題になる。
何が問題なのかさっぱりわからん そんなことより朝起きたらステップ実行で止まったままの状態だった
そもそも、アドバンスドフィルタで済むことを、
何で複雑にやろうとするんだよ。
>>121
>>125
関数と演算子って何が違うん?
基地外じゃないけど糖衣構文なだけで一緒に見えるが。 >>169
処理的にも概念的にも同じものだけど、
初心者に教える際に同じものとして教えてしまうと、
+ A,B
Ary = "A,B,C,D" Split ","
等の表記が何故出来ないのかっていう疑問にぶつかっちゃうからじゃない? >>169
同じだと言えば同じだし
違うと言えば違う
比較項目を決めないと意味がないよ >>170
出来てもおかしくないし採用するしないの違いだけ >>169
「VBAでは」演算子のことを普通は関数って呼ばないでしょって話。
>>170が書いてくれた理由にて。
Common Lispみたいな言語なら別に違和感ないんだけどね。 関数は呼び出せる
演算子は呼び出せない
関数は名前がある
演算子は名前がない
Common Lispだと演算子っていうよりシンボルか。
あと、リファレンスなんかではOperatorとFunctionって別個の項目に書かれてない?
VBAのその辺のリファレンス見たことないけどw
>>175
名前の有無って言い方はおかしい
機能と文字列が対応してるって意味では同じ
記号だって文字列のうちだし、例えばAnd演算子なんか英単語そのもの
結局はオペレータとオペランドを並べる順番だとか、わかりやすさだけの問題
最後は宗教か哲学の話に行き着く >>177
コンパイラの動作を考えれば分かるでしょ
関数は名前をつけて他から参照できるように処理する
演算子はその場で計算されるか対応するニーモニックに置き換えられる
関数と演算子じゃやってる事が全く違うんだよ
Andが英単語とかトンチンカンな事を言うな >>179
結局はコンパイラにどこまで処理させるかっていう設計上の問題に過ぎない
たとえば足し算を
Plus(a, b)
みたいな関数的な書き方にしようと思えば相互に変換可能だし得られる結果も等価
結局は慣れ、あるいは宗教 >>181
相互に変換不可能
CallByNameは演算子を使えないぞ >>179
Variant に対する演算は1命令じゃできなくて内部の処理ルーチン呼び出すから関数とやることはたいして変わらんよ
C とかなら一部の関数はインライン展開したりもするし >>183
だからそれはシンタックスの問題
C++ なら演算子を関数のように呼び出したりもできる >>185
operator +は関数のように扱えるが+演算子はそうではないだろ
つうか今はVBAの話だらな? 「関数と演算子の区別がつかない」と言っている人向けの解説を模索すべきであって、
「僕の考えた最強の分類」を語るべきでは無い。
なんかすごく難しい話になってるけど、関数と演算子の区別なんて、「リファレンスの区分がこうなってるから」で終わりだよね
VBAに限って、どう違うかわからない人のために説明すると、
「言語を作った人がそう決めたから」「丸暗記するかマニュアルを見るしかない」
てことになる
あんまり合理性はなく、むしろ歴史的な理由の方が大きい
結局は人間が適当に、あるいはリソースが少なかったために仕方なく決めたこと
言語によって使える演算子は違うし、関数だって初期のMS-BASICでは使えないか貧弱だった
なんか盛り上がってる・・・
>>101
そうですね、Outの内容を確認してみます。
リトライ前後でOutの内容は同じはずと思いこんでてやってませんでした。
>>103
了解しました。変数の内容を確認してみます。
debug.assert って初めて知りました。なんか便利そうです。
>>127
よくあることなんですか?再起動しか解決方法はないんですか?
できればコード修正でエラーを防ぎたいのですが・・・ どうせ >>116 辺りが引っ込みつかなくなって暴れてるだけだろ w >>186
> operator +は関数のように扱えるが+演算子はそうではないだろ
何を言ってるんだ?さて
operator は演算子を定義するキーワードだぞ
> つうか今はVBAの話だらな?
と言うなら >>188 (>>178) で終わりだろ >>197
いやほんとやり直してきた方がいいよ
君の知ってるc++っておかしいから >>198
どこがおかしいのかも指摘できないなら黙ってろ >>200
低能のやり口乙
レス番示して引用してみ >>202
で、どこがおかしいのかも書けないのかよ
バカですか? >>204
やっぱり具体的に指摘できないのな w
どうせそのまま逃げ回るんでしょ >>205
既に具体的に書いてあるじゃん
なんで見ないふりするのよ 「演算子である」は「関数ではない」を導かないから水掛け論だ
VBA での関数/演算子の話なら >>188 で終了 VBAのクラスにもOperatorキーワード欲しかったな。
あれ?
勝者はいないのかな?
時間掛けてなにも分からずw
IsNumeric(Date)とIsNumeric(Now)がFalseなのが気に食わない
>>217
日付時刻型は数値に変換はできるけど数値ではないだろそりゃ >>218
IsNumeric(Empty)とIsNumeric("999")はTrue
IsNumeric(Null)とIsNumeric(Nothing)はFalse
これでDate型がNumericでないのは気に食わない >>219
も一つ忘れてた
IsNumeric(True)とIsNumeric(False)もTrue お前が気に食わなかろうとどうだろうと知ったこっちゃない
文句いいたきゃMSに言え
>>221
だからこういう場所で言ってんじゃんかよw >>223
さあ。
気に食わないから呟いただけで、賛同者がいなくて話題が続かなければ引っ込むまでさ >>217
じゃあさ、
CLng(#2017/3/21#) = CLng("42815") = 42815
なんだけど、お前は #2017/3/21# と"42815"のどっちが「数値らしさ」が上だと思う? Dim V As Variant
V = "12345"
?IsNumeric(V) ・・・Trueになる
V = #1/1/2017#
?IsNumeric(V) ・・・Falseになる
これで困る場面を必死に考えたけど、全く思い当たらなかった。
普通は日付かどうかはVarType()かTypeName()で判定するし、実際どんな時に気に食わないんだろうか。
仕様が気に入らない=>VarTypeの存在を知らなかっただけ?
>>225
見た目上で言えば"42815"の方が#2017/3/21#より整数らしい。それはそうだ。
#2017/3/21#がどんな整数になるかは変換してみるまでわからない。
しかし"型"で言えば常に数値変換できる日付型の方が値によっては数値にならない文字列型より
「数値らしさが上」だろうね。
>>226
IsNumeric=Trueが相応しい型は
Integer, Long, Double, Single, Currency, Date, Boolean だろう。
それを判定するたの条件がめんどくさいじゃないか。 >>228
おまえの考える「ふさわしさ」とVBAの仕様は異なってるってだけの話
おまえのふさわしさを発揮したければそのルールを採用している言語で開発すればいい
このスレはVBAの質問スレだ
おまえの理想を語る場ではない >>230
これまでの流れを見てこういう発言をしてるんだがね。。。 てゆうかさ、
「IsNumeric(日付型)はTrue であるべきだ」
に賛同の声が集まらないことに驚きを禁じ得ないねw
IsNumeric(#1/1/2000#)がTrueになるべきなら、IsDate(1)もTrueになるべきだな。
・・・そして混沌へ。
質問です。
常に前面配置したユーザーフォームのテキストエリアに、他ブックも含めて現在選択しているセルの値をリアルタイムで反映させたい。
他ブックは、数千単位であって、全部にマクロをかけない。また、他ブックの名前は統一されていない。
ThisWorkbook に、
Private Sub Workbook_Open()
UserForm1.Show vbModeless
End Sub
Sheet1 に、
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
UserForm1.TextBox1.Text = Cells(ActiveCell.Row, ActiveCell.Column)
End Sub
上記で、開いたブックのシート内なら、リアルタイムで書き込める。でも、このselectionchangeイベントは、そのシート内のセル選択にしか反応してくれない。
また、ユーザーフォームのコマンドボタンに、
Private Sub CommandButton1_Click()
Dim telno As String
telno = ActiveWorkbook.ActiveSheet.Cells(ActiveCell.Row, ActiveCell.Column)
UserForm1.TextBox3 = telno
という風に書き込めば、ボタンを押すことで他ブックのセルを選択していても、そのセルの値を書き込める。
ボタンを押さなくても、他ブックのセルを選択することで、リアルタイムに数値を書き込む方法を教えてくだせぇ。
>>237
Cellsオブジェクトなどは、ブック、シートを省略すると自動的にActiveWorkbook、ActiveSheetが対象となる。
つまり、ヒントをあげるとするなら
Dim WB as Workbook
For Each WB in Workbooks
Debug.Print WB.ActiveSheet.Cells(ActiveCell.Row, ActiveCell.Column)
Next
とすると、現在選択中のアドレスがA1なら開いている全ブックのアクティブシートのA1に記載された値がイミディエイトウィンドウに出力されます。 >>239
ApplicationレベルでSelectionChangeイベント拾える? イベントに頼らずタイマーで無限ループするか
SheetがActiveになったタイミングでコードを注入するかどっちかかな
>>236
IsNumeric(Empty) → True
Empty = 0 → True
IsEmpty(0) → False
すでに混沌 >>上
今日はもうおうち帰る。上で書いてあること明日試して、上手くできなかったらまたくるます。
SheetがActiveになったタイミングでコードを注入するってのは、メインのブックに戻ってきたときって
ことかな?
ユーザーフォームを最前面に表示しているから、ユーザーフォームを置いているメインのブックはアクティブにはならないんですよね
>>243
SheetChangeとかApplicationレベルのイベントを活用する >>237
ボタンの代わりにタイマーとかで更新しまくればいいんじゃね タイマーなんて勧めるなよ
最後の最後の最後の手段だろ
何度読んでも、ISナメックに脳内変換されてしまう。
>>239
ありがとう。できたわ。詳しい仕組みはよくわからんけど、意図したとおりに動いてるからいいか。
まさかVBAでオブジェクト指向するとは思わんかったっすわ。
ところで、他ブックからの参照なんて、デフォルトで対応していていいと思うんだけど、あえてしてないのは、
何かデメリットなり不都合なりがあるからなのかね? 教えて239! >>251
俺も最初気持ち悪いとは思ったけど、そういうもんだと覚えるしかないで。
「他ブックからの参照がデフォルトで対応していない」って思った理由が良くわからないけど、
VBAのオブジェクトはApplication>Workbook>Worksheet>RangeやShapeなど・・と階層構造になっているので、モジュールで省略したらすべてActive〜になる。
ThisWorkbookモジュールでRangeと書くとThisWorkbook.ActiveSheet.Rangeと同等になるし
SheetモジュールのRange()はMe.Rangeと同等になる。
VBAのイベント名は固定で勝手に関連付けされるからワークブックの指定なんて出来ないし、強引に他ブックのイベントを拾おうと思うとClassでWithEventsで一風変わった形式になるのも止む終えないかなと思う。 どこかの段階で、イベントを所有者をたどって上に伝播するかどうかが決められたはずだけど、相当早い段階でそれは決まったんじゃないかと思う。
最初のバージョンのVBA(Excel 5.0時代)がすでにそうだったのかも。
イベントが上に伝播すると、上に伝播されると困るところでそれを止めるというコードをいたるところで書かなければならない羽目になったりする。
(javascriptのpreventdefault()とか)
>>253
>Lotusマクロはワークシートのセルに長々と入れられたキーストロークの並び以外の何物でもなかった
んでもねぇ、Lotus123ユーザーだったら分かると思うけどOffice向けソフトウェアとしての出来は圧倒的にLotusが優れていたよ。 なるほどねぇ。 SelectionChangeの引数に0−2くらいで適応範囲指定できるようにしたらええのに、
とか思ったんだけど、たしかに親子関係考えるとおかしいのかもね。
superさんは偉いということですか。
なんにせよ、やりたいことはできたから良しですわ。ありがとん
>>256
Superと言えば、VBAではRange.Parentでシートオブジェクト取れるし、Range.Parent.Parentでブックオブジェクト取れるで! 会社で「今後はエクセル形式で書類を提出してもらう」と言われ、ブラック企業勤めの俺は涙目で
デンコードーに走った。「Microsoft Excel」と書かれたパッケージを見つけて値札を見たら「3,480」に見えたので
即座にレジに持って行ってビックリ、34,800円!
「えっ、そんなに高けえの?」と店員に言ったら苦笑いしながら「ロータスのこれ、良いですよ。マイクロソフトオフィスとの互換性
もバッチリだし」と言われて買ったのがLotusSuperOffice2000だった。7,980円だったと思う。
何が良いって、シート関数がエクセルとはくらべものにならないぐらい優れていて、エクセルのSUMIFとか「なんでこんなクソ高いシロモノが条件一つしか指定出来ねえんだよ」と言いたくなるほどの出来だった。だって、単純な集計処理だったらANDでいくらでも条件をネストできるんだからマクロなんて必要なかったんだ。エクセルだったら当時は二つ以上の条件で合計を出す時は
配列数式?でやるかマクロを書くしか無かった。
個人的な意見だが、ビル・ゲイツは天才営業マンで商人としては凄かったんだろうがソフト屋としては二流なんじゃねえかと。
不味い食い物ばっか売ってるイオングループが日本の小売業界トップなのと被るね。
会社に個人のMcIntoshを持ち込んで得意気にExcelを使ってるやつがいたなあ
Range.Parent.Range.Parent.Range.Parent.Range.Parent.Range
範囲選択したセルを画像として保存したい。またグラフも画像として保存したいんだけどいい方法ないかな?
Excel2016使ってます
ネットのマクロいろいろめしてみたけどうまくいかなかった
惜しかったのがあったけど範囲選択したところが拡大されて画像化されちゃった
>>260
With使う時は自身への参照を持っていてくれると綺麗にまとまる場合が多いんだよな。
全てのオブジェクト型に自己参照"This"を実装してほしいくらい。 よくわからないけど、
エクセルとロータスにも、
プレステとサターンみたいな争いがあったということですね。
よくわからないけど。
>>258
Joel on softwareみりゃわかると思うけど、BillGはクソ細かい仕様まで把握していた
ゲイツはExcelとLotusでは西暦の起点が違うことを把握していた
(LotusのチームはビットシフトでごまかしてたがExcelチームはキチンとした、程度の意味)
こりゃプログラマだ >>265
これもやってみてうまく動かなかったけどもう一度やってみる!
ありがとー! >>257
へぇ〜、そうなんだ。こんなどうでもいいネタにまで付き合ってくれてどうも。
割といろいろできるのんね。所詮ベーシックでしょ、と思ってたわすまんのVBA VBAにもともと入ってる定数をあらわす変数の名前って簡単に調べる方法はありますか?
たぶんF2で利用できるオブジェクトブラウザかどこかに載っているのだと思うけど。
・色
黒はvbBlack、赤はvbRedと暗記してるけど、オレンジとか水色とかマイナーな色たちはいちいち調べないといけない。
・Endで移動する方向
→あっ、これはオブジェクトブラウザですぐ見つかった
などなど。
オブジェクトブラウザの下の蘭でクリックできるものがあればEndのように簡単にみつかるけど
そうでないことがよくあったので。
上の話はいまWordのVBAやってて
RangeのメソッドCollapseには引数が必要でその引数にはWordの元からある定数を指定しないといけない。
でもWordのオプジェクトブラウザの下の蘭には単に「Sub Collapse([Direction])」としか書いてなくクリックできない。
でもここのDirectionにはwdCollapseStartかwdCollapseEndを入れる必要がある。
その調べ方は?
というところでつまづいてて、そういやExcelでもこういう困り方をしたことは多々あったなと思って。
>>269
オブジェクトブラウザでEnumかなんかで調べたら出てこない?
色ならvbColor列挙体じゃなかったっけ
うろおぼえですまんけど >>270
IDEでCollapseとタイプしてF1
RTFM >>271
ありがとうございます。
はい、excelだとオブジェクトブラウザの左のクラスのところで「XlRgbColor」を調べると
無数の色の定数が知ることができます。
でもそれは色だから簡単に調べることが出来ました。
オブジェクトブラウザでvbRedで検索したらたどりつけたから。
でもそれは色だから簡単に分かったけど
そうじゃない場合はその列挙体に相当する「XlRgbColor」みたいなのをどうやって探すかというのが質問の焦点です。 >>272
F1押してからCollapseとタイプでは?(ワラ。
あとRTFMとは? you are Really Tallented Fantastic Mathmatician? >>273
列挙体、定数の具体的な値(vbRedとか)で検索すれば出てくるっしょ
MSDNで検索しても出てくると思うし >>274
> F1押してからCollapseとタイプでは?(ワラ
笑ってる暇があったら、試してみたらどうかね >>275-276
いやさっきのWordの例だとwdCollapseStartやwdCollapseEndを忘れてるから検索のしようがない。
こんな場面はExcelのVBAでもいままでに何回もあった、という話なのですが。
そりゃ色だと知ってるものがあれば検索するという技は使えますが。 >>273
1.大半の列挙体の名前はエクセルなら「xl」、ワードなら「wd」+メソッド名なので、予想して入力してCtrl+Space
2.1に失敗したらオブジェクトブラウザでメソッド名か、引数名で検索
3.普通にメソッド名でググる
マクロの記録から生成したのであれば、何らかのメンバ名が分かってるわけなので、「wdCollapseStart」をオブジェクトブラウザで検索すれば一発出でるね >>280-281
みんなわたしのやりたいことがわかっていないようだ。
オレはExcelやWordでいろんな作業をするとき数秒から1分くらいでやりたいわけ。
そのときVBAでコードを書いて一瞬で処理したいわけだ。
その一瞬ですますためにコードの引数などで定数の名前を忘れたときに簡単に調べる方法を聞いている。
マニュアルとか検索は、全くの初心者がはじめて事柄を学ぶときに有効。
いま聞いてるのは、やりかたや処理は分かってて、定数の名前を瞬時に知る方法。 なんじゃあそりゃ
自分で勝手にライブラリ作るしかなくねえかそんなの
一覧を取得する方法ならググりゃ出てくるが
ある程度はクラス名とか定数名でわかるように作ってあるんだからもうそっから先はじぶんで工夫する以上のことはできないだろ
本来はCollapseの定義が
Sub Collapse([Direction]) じゃなくて
Sub Collapse([WdCollapseDirection]) になってればいいんだけどね
オブジェクトブラウザでCollapseで検索にするかDirectionで検索するか
Collapseで検索すれば一番最初にWdCollapseDirectionが出てきた
>>282
> マニュアルとか検索は、全くの初心者がはじめて事柄を学ぶときに有効。
マニュアルの使い方も知らなかったくせに、何言ってんだか。
> 定数の名前を瞬時に知る方法。
F1で瞬時にマニュアルが開き、すぐにこう書かれてるのを目にするだろう。
> 指定範囲または選択範囲を解除する方向です。WdCollapseDirection定数は、
> 次のいずれかをすることができます: wdCollapseEndまたはwdCollapseStartです。
> 既定値はwdCollapseStartです。
RTFM? ggrks >>282
いや、だから一瞬で知りたいときは、wd+メソッド名頭文字打ってCtrl+Spaceだってば。
初見じゃないならこれぐらいできるだろ
それすら暗記できないならおとなしくF1押してマニュアル読んどけ
馬鹿でも10回も繰り返せば覚えるだろう 図形を作成すると同時にその図形にハイパーリンク設定ってどうすればよい?
コード例があればうれしい
>>287
っマクロの記録・・・
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 233.25, 234, 274.5, 146.25).Select
ActiveSheet.Hyperlinks.Add Anchor:=Selection.ShapeRange.Item(1), Address:="C:\aaa.xls" >>288
Selectしなくても動いたわ
ActiveSheet.Hyperlinks.Add Anchor:=ActiveSheet.Shapes.AddShape(msoShapeRectangle, 233.25, 234, 274.5, 146.25), Address:="C:\aaa.xls" >>288
Select Selectionを使わずにオブジェクト変数をつかって書くとどうなりますか notesのvba詳しい人いないかな…
Excel vbaでNotesのメールは作れるんだけど添付ファイルが上手くいかない…
新規メールだと出来ないとかなんとか…
エクセルファイルがZIPであることを利用した裏技はない?
あるとナイス。
>>292
エクセル内にいっぱい貼ってある写真や図があれば
それをzipにして回答すればjpgファイルとして一括で取り出せる。 >>292
圧縮解凍専用ソフトで再圧縮してファイルサイズを減らして自己満足 windows シリーズ office シリーズ filemaker シリーズ 最近行い商品についてのキャンペーン, japansoftware.net
裏技ってバグなんかの、仕様書(説明書)内に明記されていない動作を利用した行為だろ。
>>298
実際にやるとほとんど使い物にならないけどね
>>299
説明書には書いてないけど仕様書はわからんな
昔 Excel にあったイースターエッグなんて仕様書なしでできるとは思えないし
てかどこから裏技が? ActiveSheet.Activate という命令が必要になる日が来るとは思わなかった
>>292
既出もあるけど
・バイナリエディタでDPB="〜"をゴニョゴニョ
・WinMergeなどのツールで差分比較
・普通に開くと破損して書式設定などが消滅してしまうファイルの復元
・良くないファイルをxlsxに埋め込んでバラマキ
・埋め込みの画像の一括抽出
ZIPだから〜と言うより、内部構造がXMLだから汎用ソフトが使えるので色々できるようになったとも言う 画像のように表1の黄色のデータ部分を参照してグラフ1を作成するコードを教えてください。
>>304
やりましたが、そのまま実行しても上手く出来ませんでした
>>305
営業と事務の合計なんですけど、機密保持のため適当に数字を打ってるのでおかしなことになってますが、気にしないでくださいw 簡単そうてかなりめんどくさい。
セルA1に数値を入れると、セルB1からある数値が帰るシートがあります。
この時以下のプログラムを簡単にできないだろうか
ただしkは変数で、初期値0とします。
1)
いまA1に値k-0.1,k,k+0.1をそれぞれいれ、B1の値が最大になるときのA1を次のkにする。
1)に戻る
どなたかお願いします。
B1の返ってきた値で条件分岐してkに代入するようにしてループ回せばいいんじゃね?
B1の返る条件が分からないから詳しくはわからんけど
プログラミングセンスのない俺がそのまま書いてやったぜ 異論は認める
Sub Main()
Dim i As Long
For i = 1 To 10000
Call saidai
Next i
End Sub
Private Sub saidai()
Dim k As Double, k1 As Double, k2 As Double
Dim b1_1 As Double, b1_2 As Double,b1_3 As Double
Calculate
k = Range("A1").Value
k1 = k - 0.1
k2 = k + 0.1
b1_1 = Range("B1").Value
Range("A1").Value = k1
Calculate
b1_2 = Range("B1").Value
Range("A1").Value = k2
Calculate
b1_3 = Range("B1").Value
If b1_1 > b1_2 And b1_1 > b1_3 Then
Range("A1").Value = k
ElseIf b1_2 > b1_1 And b1_2 > b1_3 Then
Range("A1").Value = k1
ElseIf b1_3 > b1_1 And b1_3 > b1_2 Then
Range("A1").Value = k2
End If
End Sub
>>308
sude codeだけど
A1 = x
B1 = f(x)
の場合
foo = [a, b, c]
bar = [f(a), f(b), f(c)]
A1 = foo[bar.index(bar.max)]
ただA1の値を新しくするやり方だと
終了条件がないとずっと回ってるかもね 312さんごめんなさい
313さんぐらいのシンプルさが欲しいのですわ
>313
もう少し詳しくお願いします。
>>303
wwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwww
つい今日、俺もそんな表からグラフ作らされたわwwwwwwwwwww
作りにくいったらありゃしないwwwwwwwww >>315
配列[f(a), f(b), f(c)] の要素の最大値がf(c)なら f(c)のindexが2なので
配列[a, b, c]のindexが2の値をとってc
最大値が2つ以上になった場合どうしたいかによっては違う方法のほうがいいかも
違う方法の一つとしては
[(a, f(a)), (b, f(b)), (c, f(c))]みたいな形にして最大値に対応する入力値を取得するとか
(a, f(a))の型は配列、ディクショナリ、ユーザー定義型とかを使う 説明下手で申し訳ないんだけど
すでに開いているブラウザをアクティブにして、プルダウンメニューを選択するものを作りたいんだけどどうしたらいいんだろう・・・
AppActivateでアクティブにするとこまでしか作れてない・・
プルダウンの選択って難しいかな?
使いたいページが3フレーム構造のページなんだけど、何かいい方法ないかな
<select name="month" />
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
<label for="month">月</label>
たとえばボタンクリックしたらAppActivateでアクティブにして、monthの2を選ぶみたいなコードって作れないかな・・
>>320
sendkeysでプルダウン選択できる?
無知ですまん・・
できるとしたらコードの書き方教えて欲しい
321に貼ったmonthの月を選択するプルダウンなんだが >>322
Alt+Tabでウィンドウ切り替え
Tabでフォーカス移動
↓↑カーソルキーでリスト選択
リストの選択肢が半角なら頭文字の入力で一発で飛べる
いっぺん自分でキーボードだけでブラウザを動かしてみ
それをそのままSendKeysで飛ばせばいいだけ >>323
その方法ではできたんですが、他の方法はないでしょうか?
それだと最後にクリックした場所によってはぜんぜん違う動きをしてしまうので
なるべく確実な方法を取りたかったです、説明不足ですいません
キーボード操作ではなくて直接プルダウンをいじれるコードってないですか >>323
それか、毎回ブラウザをActiveにした場合に同じ場所へ戻ってTABで移動したりはできないですか?
ページの上部をクリックした場合と下部をクリックした場合では挙動が全く違ってしまうので。それを解決したいんですがいい方法が思いつかなくて・・・ >>324
ページを開く作業とセットで、VBAを起動する前にクリックする場所も決めておく
ブラウザだとリストを選択したあと検索とか送信とか、何かボタンを押して次のページに飛ぶだろ
その次のURLを直接指定するという方法もある
URLの最後にnameとvalueを並べて書けば入力したことになるから >>319
ブラウザが IEなら IEオブジェクト使えばいいんじゃね? >>329
>>>319
>ブラウザが IEなら IEオブジェクト使えばいいんじゃね?
それ使えば今開いてるページをアクティブの状態にして、プルダウン選んでくれる??
できたらコード教えて欲しい getelementsbynameで対象オブジェ決めてvalueかselectedindex書き換える
ドロップダウンリストは開かないけど
VBAでエクスプローラーの特定フォルダーを開こうとしています
Dim trag As String
Fol = "c:\myhome\hage\"
Shell "C:\Windows\Explorer.exe" & Fol, vbNormalFocus
エクスプローラーは開くのですが、ディフォルトのフォルダーで開きます。
どこが悪いのでしょうか?
>>333
空白が足りないとかアクセス権がないとか >>330
間違いなくできると思うがWebペ−ジの仕様にもよる。
今ちょっと時間無いんでコード示すとしたら夜になってからだな。
既に開いてるならShellオブジェクトだね。
分かってて使ったりするけど人に対してはSendkeysは絶対に使ってはいけないと俺は言うね。 >>333
はい。これで動くはず
Dim trag As String
Fol = """" & "c:\myhome\hage\" & """"
Shell "C:\Windows\Explorer.exe" & " " & Fol, vbNormalFocus >>330
ここで答え聞くより普通にググれば大量に資料出てくるんだから応用聞くと思う
キーワード 「vba IE操作」など >>340
横だけど
Fol = """c:\myhome\hage\"""
Shell "C:\Windows\Explorer.exe " & Fol, vbNormalFocus
じゃダメなの?
もしくは一行で
Shell "C:\Windows\Explorer.exe ""c:\myhome\hage\""", vbNormalFocus
ではダメなの? >>342
間違ってるところが分かるように意図的にこうしてるのが分からない?
ベタ打ち1行ならそれでいいよ >>344
じゃあ試しに "C:\"だけにして試してみなよ。
で、次に"C:\myhome\"という感じでパスを増やす。
それと、最後の\が不要だったカモシレナイ。
ついでに、 fso.FolderExits(パス)とかで、”本当に!”パス打ち間違えてないか確認したら? エクセルにはまって以降、
デザエモンはすっかりやらなくなってしまった。
http://home.att.ne.jp/zeta/gen/excel/c04p04.htm
を参考にVBAで音を鳴らすプロシージャを作成していますがエラーを解決できません。
どこをどう直せばいいでしょうか?
上記URLの"メモリ上のバッファから再生〜"で紹介されているコード:Public Function ReadSoundBuffer()を、
再生するファイルを引数で渡すように変更したのですがエラーが出てしまいます。
"Visual Basic でサポートされていないオートメーションが変数で使用されています。" コードは以下の通りです。どこがまずいでしょうか?
Option Explicit
Public Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" ( _
ByRef pszSound As Byte, _
ByVal hmod As Long, _
ByVal fdwSound As Long _
) As Long
Public Const SND_ASYNC = &H1
Public Const SND_MEMORY = &H4
Public Snd_1() As Byte, Snd_2() As Byte, Snd_3() As Byte
Public Sub test() '←これを実行すると・・・
Call ReadSoundBuffer(Snd_1, "C:\RSSを取得(SSD)\wav files\1分 安値.wav")
'Call ReadSoundBuffer(Snd_2, "C:\RSSを取得(SSD)\wav files\2分 安値.wav")
'Call ReadSoundBuffer(Snd_3, "C:\RSSを取得(SSD)\wav files\3分 安値.wav")
PlaySound Snd_1(0), 0, SND_ASYNC + SND_MEMORY
'PlaySound Snd_2(0), 0, SND_ASYNC + SND_MEMORY
'PlaySound Snd_3(0), 0, SND_ASYNC + SND_MEMORY
End Sub
Public Function ReadSoundBuffer(SndBuf, strFileName)
Dim WrkSndFile As String
Dim WrkNumber As Long
WrkSndFile = strFileName
WrkNumber = FreeFile()
Open WrkSndFile For Binary As WrkNumber
ReDim SndBuf(LOF(WrkNumber))
Get WrkNumber, , SndBuf '←ここでエラー。"Visual Basic でサポートされていないオートメーションが変数で使用されています。"
Close WrkNumber
End Function
>>349
引数の型指定がされていないからじゃない?
Public Function ReadSoundBuffer(SndBuf, strFileName)
↓
Public Function ReadSoundBuffer(SndBuf() As Byte, strFileName) >>352
あー、エラーでない すごいー
今まで呼び出される側の引数の型を省略すること多かったし、引数が配列のときに()を省略しても問題がおきたことなかったのに・・・
どういうときに省略で問題でてくるんだろ??? MSDNでGet ステートメントの説明を読んだがわかりにくいのう
>>355
触れてはいけない話題でしたか、すいません
論争は望んでなくて、呼び出される側に、どんなとき()が必要でどんなとき引数の型指定が必要か知りたかっただけなんです >>359
MSDNのここじゃないかな
↓
メモ
Get ステートメントを使用して、バリアント型 (Variant ) の配列をディスクから読み取ることはできますが、
Get を使用して、配列が含まれるスカラーのバリアント型 (Variant) を読み取ることはできません。
また、Get を使用して、オブジェクトをディスクから読み取ることもできません。 そのMSDNに
「バリアント型 (Variant) の VarType を識別する 2 バイトが読み取られた後に・・・」って記述があるじゃろう。
SndBuf() As Byte と書かないと、ByRef SndBuf As Variant と解釈されるが、その場合上記の
VarTypeは、要素の型を表す本来の値(Byteなら17)と VT_BYREF(0x4000) の bit or になるんだよ。
「VT_BYREF」ってのは他の型の値を参照してますよ、ってフラグ。
多分Getステートメントはそういう状態に対応していないってことなんじゃないかな。
何も考えずに型を書けばいいだけ
Variantなどというクソに頭を悩ませる必要はない
Variantはどうしても必要なとき以外は使わないってのが基本でいいと思う
あやまってbyte型じゃない値を入れても型が違うよってエラーが出てくれるから問題箇所も発覚させやすい
Byteより大きい値を入れる可能性があるなら関数の使い方を考え直さないと
Variantを使わないとコピペの嵐になるときとかがそうだな
>>364
でも結局関数の中で型を確定させるよね、その場合も
オブジェクト指向サポートしてる言語だとオーバーライドだっけ?なんかゴニョゴニョ出来るみたいだけど エラーの出る場所が違うだけで、Variant型使わなければ防げるエラーなんてないんだけどね。
>>367
たとえば ByRef a As Long に Long じゃない変数を代入しようとするとコンパイルエラーになる。 Sub test()
Dim i As Integer
i = 5
Dim a(i) As String
End Sub
---------------------
これがダメなのはルールとして分かりましたわ。
でもこれをダメというルールにしてしまった理由はなんですか?
>>368
Long型以外の値が紛れ込む余地があったら実行時にエラーになるし、
Long型以外の値が紛れ込む余地が無かったらVariant型でもエラーにならないだろ。 >>369
実行時に値が確定してるかどうかの差じゃないの。
Const i = 4
Sub test()
Dim c(i) As String
Debug.Print UBound(c)
End Sub
だとエラー出なかったし。 >>370
余地?
俺は引数の型についてVariantかそうじゃないかの話をしてるんだけど? >>372
そうか。するとコンパイルエラーがどうこうというレスだけだと君の主張がよく分からないな。
俺は引数の型がVariant型かどうかについて限って話してるわけではないから、もしかして違う話題かな? >>369
理由もなにも固定長配列と動的配列の違い。
つまりメモリ確保のタイミングの問題だね。
Dim(定数)は固定長配列なんだから、当然変数を渡したら「定数式が必要です。」となる。
Dim (定数)はプロシージャに入って初めて通過したときにメモリを確保する。
トレースで矢印を動かして再度Dim(定数)を通っても変数は初期化されない。
Dim() As Stringと書いた場合はメモリを確保しないが、ReDim(i)を通るたびにメモリを再確保する。
トレースで矢印を動かして再度ReDim(数値)を通ると変数は初期化される。
一度固定長配列として宣言した変数は、動的配列にすることはできない
Dim b(10) As String
ReDim b(i)
エラー「配列は既に宣言されています。」
これでいいだろうか コンパイルエラーと実行時エラーだったらコンパイルエラーの方が未然に防げるだろ
値によって変わるんじゃなくて型チェックの時点で防げるんだから
さすがにこれは明白すぎるぞ
>>371,374
そういうことを聞くたいんじゃなくて、>>369のコードを駄目ということにした理由が知りたいんじゃないかな。
別に駄目じゃなくてOKということにしてもいいのに、なんで駄目というルールにしたんですかという疑問。
俺は知らないけど。 変数宣言するのに変数を使えるのはなんか気持ち悪いから
コンパイルの時にチェックしてるんじゃないの、知らんけど
>>377
なるほど!と思って試してみたら、範囲外エラーは実行しないとエラーにはなりませんでした。
dim a(5) as long
a(6) = 1 ' <- コンパイルではエラーにはならない コンパイルエラーってあんまり頼りにならないんだよね。
コンパイルエラーで分かるものって実行時エラーでも分かるけど、その逆ってないし。
>>379
コンパイルできないのに実行できるコードがあるわけないだろ >>379
言ってることが意味不
VBAのコンパイルエラーは言語仕様に合ってて、機械が翻訳可能か検証してるだけだし、
実行時エラーは実際に実行した時のメモリアクセスやらなんやらのエラーだろう。
確かに>>378の文はコンパイルエラーで拾ってほしいけど、VBAにそこまで期待してはいけない。 VBAはコンパイラが貧弱すぎるからVBAしか使わない人達はいまいち静的型付けの御利益を実感できないんだろう
他のまともな静的型付け言語を体験するともうVBAに嫌気がさしてくるよ
>>379
確かに気休めにしかならない
func(ByRef x As Long)
があるとして、
Dim a As Variant : a = 5
func(a)
はコンパイルエラーになってくれるけど
func(a + 0)
だと通る そもそもVBAってコンパイルするのか?インタプリタだと思ってたよ。
>>385
VBEのデバッグにコンパイルってあるけど、あれは単に文法チェックをだけだろ
と思ってたんだけどね
>>47
みたいな話が 初心者からの質問です。
「今日の上がり」というシートを「集計マクロ」というエクセルシートに取り込みたいのですが、
今日の上がりシートをダウンロードすると、時々
「今日の上がり(1)」とかって、(1)とかついたりします。
今書いたコードだと、その括弧のない場合でしか取り込めなく、
括弧がついてしまった場合だとエラーが起きてしまいます。
こういう場合はどうコードを書き直せばいいですか?
今使ってるコード↓
Workbooks("今日の上がり").Sheets("今日の上がり").copy_
After:=Workbooks("集計マクロ").Sheets("集計マクロ")
Workbooks("今日の上がり(1)").Sheets("今日の上がり").copy_
After:=Workbooks("集計マクロ").Sheets("集計マクロ")
>>387
Sub test()
For Each x In Workbooks("今日の上がり").Worksheets
If x.Name Like "今日の上がり*" Then
x.Copy after:=Workbooks("集計マクロ").Sheets("集計マクロ")
End If
Next
End Sub
こんな感じかな >>387
2パターンしか存在しないなら、エラー処理サブルーチンを組むとか。
sub aaa()
'前処理
On Error Goto LabelError
Workbooks("今日の上がり").Sheets("今日の上がり").copy_
After:=Workbooks("集計マクロ").Sheets("集計マクロ")
Goto LabelSkip
LabelError:
Workbooks("今日の上がり(1)").Sheets("今日の上がり(1)").copy_
After:=Workbooks("集計マクロ").Sheets("集計マクロ")
Resume Next
LabelSkip:
'後処理
End Sub
でも>>389のほうが美しいな >>387です。
>>388-390
さっそくのご回答ありがとうございます!
(2)になったり(3)になったりでパターンは変わるようです。
>>389さんのが*がついてて、どのパターンにも対応が出来そうなので試してみます。
まだ色々分からない点があるので、また後日来ます。
ありがとうございました。 他ブックから参照してる外部データのリンクをマクロで再度更新ってできないのかな?
activeWorkbook.RefreshAllでは無理だった…
>>392
んー再計算なら、
Application.CalculateFullRebuild
を試してみては? >>392
ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources >>360>>361
ありがとうございます。でもこのMSDNの記述は私の理解を遥かに越えています
>>362>>363
呼び出される側の型省略は今後やめます、今回で凝りましたw >Get を使用して、配列が含まれるスカラーのバリアント型 (Variant) を読み取ることはできません。
スカラー波wwwwwwwwwwwwwwwwwwwwwwww
>>374
いや、それ違う。
どっちも静的配列だ。
定数は実行前に置き換わるからだろ。 >>365
' 配列 x のサイズを計算する関数
If IsArray(x) Then
size = UBound(x) + LBound(x) + 1
これは型を確定させる必要はないし ByRef Variant じゃないと受けられない
遅レススマ >>386
コンパイル関連の仕組みとして、この記事を見つけたので、興味があればどうぞ。
http://cpap.com.br/orlando/VBADecompilerMore.asp
VBA CODE DECOMPILER AND COMPACTORというツールの紹介と、解説記事
* Features
* Download
* What it means to decompile and compact in VBA
* Advantage of saving decompiled and compacted VBA code
* Good practices to increase stability in VBA codes
* New Office 2007 and later (32 and 64-bit)
* Executing via Command Line >>393>>394
ありがとう!
うまくいったー! >>400
一般用語の動的配列ではないけど
VBA用語では動的配列ってことでしょ 静的な配列は欲しい。
しかし、
Dim i As Integer : i = 5
Dim a(i) As String
を静的にするのはどうにも無理だった。
というだけのことなんじゃないかな。
>>387です。
昨日はコードを教えてくれてありがとうございました。
>>389さんのコードでやってみたのですが、上手くいかないです・・・。
すいません、自分の説明不足だったのですが、
(1)とか(2)とかってつくのはファイル名(ブック名?)でした。
>>389さんの場合だとシートだと上手くいくのですが・・・。
Workbooks("今日の上がり").Sheets("今日の上がり").copy_
After:=Workbooks("集計マクロ").Sheets("集計マクロ") 二次元配列のReDim Preserveって、最後の次元しか変更できないんじゃ使い道無いじゃん、と思ったが、
縦と横を入れ替えればいいんじゃん。
って思ったが、やっぱり慣れないから見づらいじゃん。
追記
今日一応ワイルドカードとかつけて色々試したのですが、ダメでした。
>>389さんのだと、「インデックスが有効でありません(エラー番号:9)」と出てしまいます。 >>407
WorksheetFunction.Transposeを使うパターンだけど1行だった時は1次元配列になっちまうんだよなあ。 追記:仮に「今日の上がり(1)」を取り込もうとすると
Sub test()
For Each x In Workbooks("今日の上がり").Worksheets ←ここでエラーが出てしまいます。
If x.Name Like "今日の上がり*" Then
x.Copy after:=Workbooks("集計マクロ").Sheets("集計マクロ")
End If
Next
End Sub
>>407
Yes
そういう時はオブジェクトの列にするか配列の列にするのかも Dirでファイル名を確定させてから処理すればいいんでない?
BookName = Dir("今日の上がり*.*")
If BookName <> "" Then
Workbooks(BookName).Sheets("今日の上がり").copy_
After:=Workbooks("集計マクロ").Sheets("集計マクロ")
End If
>>408
Sub test()
For Each x In Workbooks("今日の上がり").Worksheets
If Instr(x.Name, "今日の上がり")>0 Then
x.Copy after:=Workbooks("集計マクロ").Sheets("集計マクロ")
End If
Next
End Sub
でどうだ? >>412
「今日の上がり」と「集計マクロ」は両方開いたままの状態なのですが。
Dirって使えるんですか?
Dirって対象のファイルが閉じてる時じゃないと使えないとかありますか?
(初心者ですいません) >>413
今日の上がり(1)を取り込もうとしたとき、
Sub test()
For Each x In Workbooks("今日の上がり").Worksheets ←ここでエラーが出てしまいます。
If x.Name Like "今日の上がり*" Then
x.Copy after:=Workbooks("集計マクロ").Sheets("集計マクロ")
End If
Next
End Sub
最初の一行目で既にエラーなのですよね・・。
>>413さんのは2行目からは今までとは違いますが・・。
(今手元にその集計ファイルがないんで出来なくてすいません) >>414
普通に
For Each x In WorkBooks
If x.Name Like 〜
でいいように思えてならないが? x.Sheets("今日の上がり").Copy after:=Workbooks("集計マクロ").Sheets("集計マクロ")
も修正
>>416
シートならそれでも上手く行くんですよね。
ですが、ファイル名が変わると出来なくなるみたいです。 >>418
>>416 さんので良いと思うのだが
どうダメなの?
ブック名とシート名が同じだから混乱してないか? >>406
Const コピー元ワークブック名 = "今日の上がり"
Const コピー元ワークシート名 = "今日の上がり"
Const コピー先ワークブック名 = "集計マクロ"
Const コピー先ワークシート名 = "集計マクロ"
Sub test()
For Each x In Workbooks
If x.Name Like ワークブック名 & "*" Then
For Each y In x.Worksheets
If y.Name Like ワークシート名 & "*" Then
y.Copy after:=Workbooks(コピー先ワークブック名).Sheets(コピー先ワークシート名)
End If
Next
End If
Next
End Sub
こういうこと? >>387です。
みなさんありがとうございます。
みなさんの教えてくれたコードで一旦試してみます。
>>419
ブック名とシート名が同じなのでオカシクなってる可能性はありますね・・。 >>421
プログラムはそんなことで混乱しません。
あなたが混乱しているのでは?という意味だろ。
それぞれのサンプルを一行ずつどういう意味なのか考えれば、最初のサンプルで解決できた筈だよ。
ブックの中の全てのシートを見ていって、該当する名前のシートかどうかを調べるサンプルなんだから同じように全てのブックを見ていって、該当する名前のブックかどうかを調べるコードを書くだけだ。
それが>>416さんの方法だ。 >>401
難しくてなんのこっちゃよく判らんけど、探し出してきてくれてありがとです。 w >>423
調べてみたらxlsファイルの中に、VBAをコンパイルしたデータ(pコード?)が保存されてて、その情報を削除してくれるツールのようだね
RelaxToolみたいに結構な量のマクロが入ったアドインの容量削減に使うと良いみたい。 >>387です。
皆さんからのアイデアを基に色々やったら出来ました!
ありがとうございます。 テーマの配色をオリジナルな色で登録したいのですが
VBAでユーザー定義を登録できますか?
>>426
可能だと思うぞ
ActiveWorkbook.Theme.ThemeColorScheme.Colors(msoThemeAccent1) = RGB(68, 114, 196)
みたいに全12色を指定して
ActiveWorkbook.Theme.ThemeColorScheme.Save メソッドで保存してやればいいんじゃね? >>427
ありがとうございまーす
おかげでWebから拾ってきたオリジナル配色で
グラフをサクッとつくれるようになりました 参照設定のしくみって深い話どうなってるのですか?
例えばWordの参照設定をしないと
変数の型にWord.Applicationは使えずObjectにしなければならないし
あと不思議なのはインスタンス化のときにCreateObject("Word.Application")だとできるけどNew Word.Applicationだとできない(参照設定しないと)。
あとExcelにあるデータを使ってメールの下書きを作るため
ExcelからOutlookを操作するVBAマクロを作るとき
メール本文はテキストしかできないんですか?
メール本文に好きなフォントを使ったりフォントサイズを変えたり太字にしたり色を付けたりしたいのですが。
現状BodyプロパティじゃなくHTMLBodyプロパティを使わないと無理っぽそうなので
ExcelのCellそのままのRangeデータを引数にし<font size=・・・>・・・・</font>のStringテキストを返す関数を作ろうか検討してますが
そんなクソ面倒なことをしないといけないのでしょうか?
もしそうならだれかこの関数作って。
>>431
詳しくはわからんが、Outlookの設定でリッチテキストにもHTMLにも出来るんだからできるんじゃねえの
なんかのプロパティあるだろたぶん >>433
いや、たとえリッチテキストやHTMLに変更することはできてもメール本文に書式付きの文字列をコピーする方法がないのです。
なんかのプロパティがあるはずだとは思ったけどそれが無いのです。地道にHTMLBodyプロパティを使って地道にHTMLタグを自作するしかないかも。
>>434
ありがとうです。これから読んでみます。 わたしは意識高い系の人でメールの書式をきれいにして送っているのでこの人のメールは美しいと評判ですが
せっかくマクロで自動化してメール送信を用意にしてもメール書式がくずれてプレインテキストになってその評判を落としたくないのです(ワラ。
Excelから間接的にやるんじゃなくてOutlookVBAで直接操作すれば大抵の事は出来そう。
>>435
2010 以降ならMailItem.RTFBody があるはず
あと MailItem.BodyFormat の設定も必要 >>434
参照設定しないと動かない、というならわかるんだけど、
参照設定しなくても動く、というのがわからない。
設定してもしなくても、結局は参照してるんじゃないのかと思うんだが。 >>439
VBEの機能とするか、コード上で機能させるかで違うんじゃねえの >>440
ごめん、説明不足だった。
よく、配布するなら参照設定しないようにって書いてるサイトを見るけど、
結局は外部のソフトの機能使ってるんじゃないのかと。 >>439
Word.Application という型を使おうとしたらコンパイル時に型がわかっていないとダメなので参照設定が必要(アーリーバインディング)
CreateObject("Word.Application") は実行時に型を参照するので事前の参照設定は必要ない(レイトバインディング)
基本的にアーリーバインディングでいいけど例えばワードが入ってない環境で使われる可能性がある時はレイトバインディングでやる必要がある コードだけを提示する場合に動かないぞゴルァということになるのが嫌だから実行時バインディングにしたりする。
コメントに参照設定書いとけばいいんだけどね。
Evaluation: Good!
>>442
レイトバインディングは当たり前だけど使う側のメソッドやプロパティが
インテリセンスに反映されないから出来れば使いたくないんだけど
どうしても使わなければならない場合が意外に多いからね。
これは逆にEXCELを他から使用したときにEXCELのバージョンに左右されたくないときとかも
レイトバインディングでやったりするけど、
作業場によってはレイトバインディングを禁止しているところもあるので
そういうときは凄く困ったりする。 そのアーリーバインディングをコード上で記述しとくってできないの?
>>445
無理だと思う
C# でもコンパイルオプションで指定するんだし 素人さんでもこの3種類ぐらいは知っておこうな
* IUnknown
COMに必須のインターフェース
参照カウントを管理するためのメソッドが宣言される
* IDispatch
動的実行に必須のインターフェース
メソッドの名前検索や動的実行のためのメソッドなどが宣言される
スクリプティングや遅延バインドで使うクラスはこれを実装する
VBAやVB.NETのObjectやC#のdynamicに代入されたCOMオブジェクトへのメソッド呼び出しは糖衣構文でありIDispatchを使ったメソッドの名前検索と実行にコンパイルされる
コンパイル時に型情報を使用しないため参照設定は必要ない
* ユーザー定義のインターフェース
例えばWorkbookインターフェースなど
型情報としてそのインターフェースに固有のメソッドなどが宣言されている
IDispatchの動的実行とは異なり直接メソッドが実行される
事前バインドするならこれを実装する
コンパイル時に型情報を使用するため参照設定が必要
製品になるようなcoclass(COMのクラス)はほぼ全てIDispatchとユーザー定義のインターフェースを実装しているので事前バインドでも遅延バインドでも動作する
VBAや他の言語が参照設定で参照するのは固有のインターフェース
Object型を使うとユーザー定義のインターフェースを無視してIDispatchとして扱われる
Sub Macro2()
Cells.Select
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"デザート類!R1C1:R1048576C3", Version:=xlPivotTableVersion14).CreatePivotTable _
TableDestination:="Sheet5!R3C1", TableName:="ピボットテーブル2", DefaultVersion _
:=xlPivotTableVersion14
Sheets("Sheet5").Select
Cells(3, 1).Select
With ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("バナナ")
.Orientation = xlRowField
.Position = 1
End With
With ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("りんご")
.Orientation = xlRowField
.Position = 2
End With
With ActiveSheet.PivotTables("ピボットテーブル2").PivotFields("みかん")
.Orientation = xlRowField
.Position = 3
End With
End Sub
(>>448続き)
↑
ピポッドテーブルのコードの書き方が分からなくて、マクロの記録を使ってみたのですが、
どうもコードが汚くなってしまいます。(今後はフィールドの数も増やすのでもっとゴチャゴチャになってしまいます)
また、このコードだと、Sheet5にしかピボットテーブルが作成できなくて、
既にSheet5があったりすると、エラーが起きてしまいます。
ここに仮にSheet5が使えなかったら別のシートにピボットテーブルを作れるようにするにはどうしたらいいですか?
(可変、というのでしょうか)
本当はこの表は「表形式」「小計を表示しない」もしたいです。
(コードがムチャクチャ長くなるので省略しました)
よろしくお願いします TableDestination:=Sheets("Sheet5").Range("A3")
>>448-449
マクロの記録だと どうしてもゴチャゴチャするから
出来たコードを1行1行何をしてるか調べて整理整頓してけばいいだけっしょ
"調べるの大変"・"めんどくさい"って言ってたらいつまでも上達しないよ >>442
そこがよくわからない。
ワードが入ってなかったら、
参照設定してもしなくても、結局ワードの機能は使えないんじゃないかと思うんだけど。 >>453
ワードが入っていたら .docx 形式でも出力できるけど入っていなかったら .txt でしか出力できないアプリケーションとか
アーリーバインディングだとワードが入っていないと起動時にエラーになってしまう >>449です。
>>452色々調べてはいるのですが、どうしてもこれを可変で処理する方法が分からないんですよね・・。
ピボットテーブルもWEB上には色々効率的なコードが転がってはいますが、
変数が多すぎてついていけない。 >>451
それじゃ、これ
TableDestination:=ActiveSheet.Range("A3") ピボットテーブルは出来上がったものに対してマクロで操作するしかしたことないけど
PivotCachesをつくってからPivotTableを作るとか
xlPivotTableVersion14とかなんか興味深いな
>>458
返事遅くなりました。
おぉすごい、出来ました!ありがとうございます。
自分でも少し勉強します^^ >>459
私はピボットとかは全然分からないですね・・(汗)
既存のピボットを弄る事はあってもマクロは全然です。 RelaxToolsのマウスカーソルにシェイプがくっつくのすげーな
俺も初めて見た時、その手があったか!!!と思った覚えがあるよ
アウトラインの小計を行った表に対して、
Sub セル前後の空白を削除()
Dim rg As Range
For Each rg In Range("A1").CurrentRegion
rg.Value = Trim(rg.Value)
Next
End Sub
これを実行すると合計が2倍になってしまうのは、どこか間違っているのでしょうか?
>>465
rg.Value = Trim(rg.Value)
により
途中の SUBTOTAL()関数を 関数→数値に代えてしまってるから >>466
ああっ、そういえば。SUBTOTALが入ったセルを除外する処理を入れないとダメなんですね。
参考になりました。ありがとうございます。 >>467
自己レス。いちおう、こんな風で落ち着きました。
Sub セル前後の空白を削除()
Dim rg As Range
For Each rg In Range("A1").CurrentRegion
If rg.HasFormula = 0 Then rg.Value = Trim(rg.Value)
Next
End Sub for each 個別セル in セル範囲.column(n列目)
どうして 「.column(n列目)」つけると個別に処理できなくなるんですか
教えて偉い人
>>469
Columnって数値でしょ。
Columnsの事なら、それ自体がコレクションだから個別セルを扱いたい場合は、
さらにCellsを加えないといけない。 Select Replace(列名, 'ああああ', 'いいいい') って書いたら、SQLの構文エラーって怒られたぞ!
何で?
何で?
何で?
>>471
FROM句がない
もしかして:Select Case 別ブックの月ごとのシートのセルを参照させるためにindirect使ったんだけどうまく参照できない…
同じブック内だとうまういくのに
ってか関数だからスレ違いかな?
>>473
Fromは書いたんだけどね。
Select 列名 From 〜 だとOKで、
Select Replace(列名, 'ああああ', 'いいいい') From 〜 は駄目だった。
ググっても、Excelの例が見つからないので、
Accessの例に倣ったんだけど、Microsoftのは構文同じでしょ? >>476
たとえ同じファイルを参照していても、
Accessからアクセスした時のSQLと、Excelからアクセスした時のSQLでは使えるものが違うので、
それぞれ調べなきゃならない。
しかも「エラーが出ずに通るけど無効な関数」とかもあるから、いちいち結果を出力してAccessの結果と比べないと危ない。
ExcelでSQLは鬼門やで・・・。 VBAで任意の文字列の読みの音声を再生したいのです。
Debug.Print "集計完了"、とか、Debug.Print "エラー発生"、じゃなくって、音声を再生したい。
『集計完了』とか『エラー発生』って鳴らしたい。なんか方法ないですかね?
よく使う文字列については、テキストークってフリーソフトでwavファイルを作成してあってそれを再生しているんですが、
wavファイルをいちいち作るのが手間なんです・・・
>>481
うわっ、こんなのあるのかー
でも2013以降なのか、2010なんですよ・・・ 俺はやった事無いけど、VOICEROIDなんかはdllを通じて、文字列からリアルタイムに音声を生成したりしてるから、
そっち方面を調べてみればいいんじゃないの。
>>484
そうなんですか?
>>481のリンク先に以下のように書いてあったんで。
Speech.Speak メソッド (Excel)
Office 2013 and later
引数として渡されたテキスト文字列を再生します。
"
>>484のリンク先は明日読ませてもらいます。睡魔が半端ないんで。すいません。 Selection.Speak
10年前からこれだけでしゃべるよ
Application.Speech って
CreateObject("SAPI.SpVoice")
(もしくはNew)をしてるだけ?
英語はしゃべってくれるけど日本語はしゃべってくれない。
どうしたらいいですか?
>>476
別名指定してみたら?
Select Replace(列名, 'ああああ', 'いいいい') as 別列名 From 〜 全シート対象にinputboxに打ち込んだ文字列を検索して、一致するセルに図形配置、図形にハイパーリンク設定したいんだけどうまくいかない。。。ご教授願いたい。
>>494
1. inputboxで検索文字列を入力する
2. 全シート対象に文字列検索する
3. 一致したセルに図形を配置する
4. その図形にハイパーリンクを設定
のどこがどううまくいかないんだ? >>495
全シート検索がうまくいかない。。。
アクティブなシートだけにならなんとか流れるだけど。 >>496
「全シートを対象」というのがわからないなら、シート毎に処理するようにすればいい。
dim ws as worksheet
for each ws in worksheets
' ws.find
next >>497
ごめん、そのコードすらいまいちよくわかんないゴミクズなんだ。 >>498
うーむ、誰かが完全なマクロをレスするのを待て。俺は書かない。 グラフの作成を行いたいと思っているのですが
横軸をSeriesCollectionで12個のセルを参照すると
12個以上の項目が表示されてしまいます
原因がわかれば是非教えていただきたいです…
>>498
for eachわからんの?
それともわかる気がないの? 質問なんですが、テキストファイルの置換がしたいです。
特定の文字が含まれた行があるとき、行全てを置換したいのですがどうすれば良いですか?
Replaceだと文字対文字の置換なのでちょっと違うし。解説HPとかヒントでも有れば嬉しいです。
イメージは以下です。
【置換前】
ネコ科 トラ
ネコ科 ヤマネコ
【置換後】
ネコ科 ペット
ネコ科 ペット
>>503
>特定の文字が含まれた行があるとき、行全てを置換したいのですがどうすれば良いですか?
これ文面通り受け取っていいのかな?
instrして条件一致したら一行置き換えればいいだけでは? 【置換前】
ネコ科 トラ
ネコ科 トラ トラ
【置換後】
ネコ科 ペット
ネコ科 ペット ペット
こういうパターンもあるなら前言撤回
>>504
アドレス有難いのですが自分には理解出来ず申し訳ないです…
>>505
Line Inputで行毎にInstrしてヒットしたら、置換したい行を設定するイメージで合ってますか?
サンプルが「buf = .readall」だったのでその発想は無かったです。
ちょっと試してみます。
>>506のパターンは無いので問題無いです。 >>507
>Line Inputで行毎にInstrしてヒットしたら、置換したい行を設定するイメージで合ってますか?
うん、そのまんま。
もっといいやり方があるかもしれんが。 Excel 2016 VBAの質問です
C#をメインでやってきて少し戸惑っているのですがマクロ開始後最初に呼び出されるのはどのメソッドなのでしょうか?
一番上に書かれたものが呼び出されると解釈してよろしいのでしょうか?
>>510
エディタを開いた時にカーソルのある場所の手続きが呼び出される
カーソルが手続きの外にある場合はメニューが出て、どれを実行するか聞いてくる >>510
成る程・・・Cとかのプログラミングに慣れてると、いわゆるMain()に該当することがなくて戸惑うかも。
VBAはExcelベース上で動いているのでMain()が必要ない。
マクロの発生要因は
・開発者によるVBEでのF5(選択or入力カーソル位置)
・ExcelユーザーによるAlt+F8
など。いきなり好きなメソッドが呼び出せる
あとはワークシート、ブックに対するイベントとかかな Mainが無いというより開始する関数名がMainに固定されないという方がイメージしやすいかも。
機能毎にマクロを実行するからMainの代わりにそれぞれの開始関数名をどこかで登録する必要がある。
プロセスは Excel.exe であって VBA.exe じゃないんだから
強いて言えば、auto_open()かThisWorkBookのWorkbook_Open()
が真っ先に起動する…んだっけ
Mainは自分で作るんだよ。
いろんなイベントが有るだろ。
特にこれといったイベントが無くても開始するイベントを作ってそれをトリガ−にする。
例えばある人はシート上にボタンを配置する。
またある人はリボン上にメニューを作る。
ちょっと性格が違うけど最優先で処理されるのはXLSTARTかな
>>507
readallをそのまま適用したいなら、bufを改行文字列でsplitしてやればいい >>513
なるほどです
VBA勉強中ですが、なかなかVBAが体に染み込んでいかないです
どこに何があるのか、どうやったらアクセスできるのかが直感的にわからないです >>520
自分で作ったものならどうすれば何が走ってどのようなことを行うのかは分かるだろうけど
人が作ったものは分かり辛いかもね。
そこは仕様書や使用方法を書いたマニュアルを読むっていうのはC#もVBAも同じ。 C#やPowershellに慣れるとExcel VBAの扱いにくさ分かりにくさには嫌気がさすよね
業務都合で周りから押し付けられでもしなければVBAを始めようという気にはなれない
とはいえ数の暴力民主主義の国だから自分だけExcel VBAを完全に切り捨てることは難しい
悩ましいものだ
最初に覚えたのがN-BASICだったのでVBAには何の違和感もなかった
ビル・ゲイツがBASIC大好きだったので 他社開発のVBは買収してMS製品になった
>>523
C#のように別でコンパイル必要な面倒臭さが無いのが良いんだよ。
その場でhogeることが出来る。
単独で弄れるのが良い。
もっともexe作るという点で見ればC#も単独で弄るわけで変わらん。
別にJavaだろうがCだろうがどんな言語だろうが違和感なく使えると思うけど。 自分ライブラリを充実させればイミディエイトウィンドウをシェルがわりに使えてむしろ便利な環境だぞ。
ある言語だけを使い続けると、他の言語を学習するときに妨げになるのはよくある事。
>>508
お陰様でなんとかなりました。
ありがとうございます。 >>526
コマンド1発だし最近はビルド速いし大したデメリットじゃないよ
VBEとかいう産廃IDEの劣悪な環境に付き合える超人的忍耐力があるならなんも気にならん >>530
えー
コンパイル対象がいっぱいあってコンパイル順序が
手順書に記載されていないと調べるのも大変だよ。
DLL内でDLLを参照してたりしてて、
どのインスタンスがインターフェースに設定されて呼ばれてくるのかよく分からないときとか
トレースしてても動きがよく分からないときとかあるし。 >>522
業務で使うみたいなので勉強中なのです
関数の呼び出しも複数あるのが気に入らないですね
引数の定義もなんであんな呼び方ができるのかわからないですし
とりあえず演習問題やりながら慣れていくしかなさそうです またC#をやっていたのでメソッドとプロパティを同じような書き方をするので拒否反応を起こしているんだと思います
ほんと慣れしかないですね
>>531
手順書文化とはまたエクセルマンらしいね
まさかとは思うけど手順書とやらに従って手作業で順番にコンパイルするのかい?
普通はコマンド1発あるいはボタン1発で全てのビルド工程が進むように開発するものだよ
1発で終わるものに手順もクソもないよね C#からエクセル弄るって話じゃないか?
VBAでDLLフル活用なんて場面そんなにないだろ。
選択した範囲のセルとグラフエリアのグラフを画像として特定の名前で保存したい
htmlとして保存して画像を取り出すマクロではうまくいかなかった
他良い方法あるかなあ?
セル範囲.CopyPicture
したものをChartObjectへ貼り付けてExport
楽に時間計算しようとおもってDateTime使ってたら、24時間以上の時0に戻ってしまうなどの問題があることがわかった。
24:00以上も扱えるユーザー定義クラスって何処かに流れてないかな?
>>538
シリアル値の計算は24以下かどうかの区別なんてしてないから、あとは高確率で表示形式だけの問題 >>538
以降、自分が書いたコードを先に書くようにしてくれ。 >>540
問題は色々あるが、まずキャストの問題
tm = TimeValue("25:00") '型が一致しません。
tm = CDate("25:00") '型が一致しません。
次に加算した後のHour関数の問題
Hour(CDate("10:00") + CDate("20:00")) '30ではなく6と出力される。
これは以下の関数で対処した
Function HourEx(tm As Date) As Long
HourEx = CInt(tm) * 24 + Hour((tm - CInt(tm)))
End Function
分、秒にも対応しなきゃいけないし、こういうのを網羅したTimeクラス的なものが公開されてないかと思った。
仕方ないので今がんばって開発中 >>542
NOW()で時間記録してDateDiff()と時間差で判定すりゃいいのでは? >>542
Datediff("h","2016/4/1 1:00:00","2016/4/2 2:00:00")
これで25と出た。 >>542
"DateTime"とは一体何だったのか。
普通の人は普通に足し算して普通に表示してますな。
> 問題は色々あるが、まずキャストの問題
> tm = TimeValue("25:00") '型が一致しません。
マニュアル見ろ。
> tm = CDate("25:00") '型が一致しません。
マニュアル見ろ。
ここまでで解決方の糸口を見つけることができないのなら、ググれ。
https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=vba+24%E6%99%82%E9%96%93%E4%BB%A5%E4%B8%8A+%E8%A8%88%E7%AE%97 >>544
でも例のように入力値は日付シリアルではなく、文字列で"25:00"とかなんです。
ソースが別アプリの出力txtなので・・・
>>545
解決の糸口を聞いているのではなく、「時間操作でよく使う機能をまとめたクラスやモジュールはないか」と聞いている。
キャスト部分だけ自作すればDateAdd、DateDiffが使えるので、例が悪かったかもしれません。
とりあえず完成したので〆ます。
ありが まぁ>>539の意味がわかってない段階で、関わるだけ無駄だって気づかなかった俺がバカだったよ。 >>546
入力部分だけ作ればいいだけだろ
自分の用途にぴったりなクラスを夢見てさまよう間にできると思うぞ >>549
詳しくもなにも そのまんま >>265 にもその 回答あるよ
因みにExcelのバージョンによって挙動が違う見たいで
もし 真っ白な画像が出来上がってしまったら
ChartObject を Select してから ペーストしたら良いかも
俺ん所では↓で上手くいった
Set Sel = Selection
Sel.CopyPicture Appearance:=xlScreen, Format:=xlPicture
With ActiveSheet.ChartObjects.Add(0, 0, Sel.Width + 2, Sel.Height + 2)
.Select
.Chart.Paste
.Chart.Export Filename:="D:\TEST.JPG", filtername:="JPG"
.Delete
End With >>550
おお、すんません、ありがとう!試してみる! アクティブセルに合わせてユーザーフォームを表示したいのですが、
セルからスクリーン座標を求めるコードでWindowsデスクトップの拡大率が100%以外でも動くものは無いでしょうか?
よろしくお願いします。
>>552
RelaxToolsの強調シェイプが最近進化してて、シェイプにマウスカーソルを上手く当ててるけど、あれ10%に縮小しても動いてたで。
あれ、参考にすればスクリーン座標からポイントに変換できそう。ウィンドウの分割も出来てたような。 >>552
デスクトップの拡大率か。DPI(96)が変わるのでWindows APIで取得する必要あり。 >>554
GetDeviceCapsを使えばいいのでしょうか?
マルチディスプレイでスケーリングが異なる場合はどうすればいいでしょうか? 試したことないけど。Excel 2013 以降は ActiveWindow.hWnd があるから
ウィンドウ事にDPIが取れるかもね。
hWnd = ActiveWindow.hWnd
hDc = GetDC(hWnd)
dblSx = GetDeviceCaps(hDc, LOGPIXELSX)
dblSy = GetDeviceCaps(hDc, LOGPIXELSY)
ReleaseDC hWnd, hDc
B3 = a, B4 = b, B5 = c, = B6 = d, B7 = e があり(Table1)、
D3 = g, D4 = d, D5 = A, D = b, D7 = E があります(Table2)。
Table2にないTable1の要素を見つけたいのですが、皆さんはどのような式を書きますか?
__ __
/ / / /
/_ / / /
 ̄ / / _/ /
__/ /__/\_ /
 ̄  ̄ ̄ ̄
vlookupとoffsetを組み合わせたようなものを考えているんだけど
可変する数値をキーに別ブックの検索列(1〜の連番で行が時々飛んでいる)と一致した数値の行の右2つ目△列や□列にセルA、B、Cの数値を転記したい。
可能かな?
ブック1の中のシート1
セルA 120
セルB 20
セルC 300
セルD・・・
別ブックの中のシートa
1 〇△〇〇□
2 〇△〇〇□
3 〇△〇〇□
空白
4 〇△〇〇□
5 〇△〇〇□
空白
空白
6 〇△〇〇□
7・・・
↓
3〇120〇〇20〇〇・・300 のように転記
>>559
おそらく可能だろうけど、疑問点があるならもっと具体的に聞いた方が回答がつきやすいと思うよ。 >>556
ご回答ありがとうございました。
CellScreenPosというコードが画面分割等対応しているので参考にしようと思います。 >vlookupとoffsetを組み合わせたようなものを考えているんだけど
/ _  ̄ ̄ \\ / ̄|  ̄ ̄|
/| /  ̄| ̄ \\ | | /
| _/ / / / /\
____ __/
/ __|_
\/ \\ | |
\ / /
>>557
ループさせてありなしでフラグを返してなければ値を取得 アクティブシートの1つ前にアクティブだったシートを取得したいんですが、
Worksheet_DeactivateでアクティブシートをStatic変数に入れても現在のアクティブシートが入っちゃいます。
何かいい方法ないですか?
>>564
イベントの使い方が間違ってる
変数=ActiveSheet.Name
みたいにやってると思うけど、そうじゃなくて、全部のシートにイベントハンドラを置いて、それぞれに
変数="Sheet1"
みたいに固定値を書く >>564 Worksheet_activeでやればいいのでは Collectionかobjectの配列に入れていけばなんとでもなると思う
シートをまたぐならThisworkbook内でやるべきだな。
>>567
切り替わってからどうやるつもりだよ...
ってか要件理解してないのか? クラスモジュール使ってイベント受け取ってゴニョゴニョするのはワークシートだと厳しいのか?
ご回答ありがとうございます
目的としてはシートを切り替える際に設定を戻したいのですが直前のシートが必要でした
頂いたアドバイスの通りやってみたところ、
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Static strSh
strSh = Sh.Name
End Sub
でいけました
>>570
>>573がActivateなら
strSh1 = strSh
strSh = Sh.Name >>560
どう書けばいいんだろ
具体的には決まったセルにある数字を別ブックの今日の日付の列の横に転記したいんだけど… あぁ分かるわ、決まったセルにある数字を別ブックの今日の日付の列の横に転記するプログラムだよな
最初は皆必ずハマるよなそれ
>>575
ソースデータと、それを手動で編集した完成図を提示してもらえば一番早い。 >>577
それと大体のロジックと具体的に実装したコードがあれば完璧だよな >>575
説明が下手だなあ。
今日の日付ってのが制御に何か関係有るのか?
無いならそんな文言は必要無い。
元の質問でも"右2つ目"とか質問の趣旨に関係有るのか?
"右1つ目"の回答してもどうにもならんのか?
分からないところを絞るべきだろ。
まず、検索する機能は作れるの?
作れるなら検索して得られたセルの行番号がわかるし、入力したい列番号は固定のようだから入力したいセルが分かるだろ。 発想を逆転させたら自己解決した
皆さんありがとでした!
For j = 0 To 6
Worksheets("" & j & "").Range(Cells(N, 1), Cells(N, 95)).ClearContents
Next j
↓
アプリケーション定義またはオブジェクト定義のエラーです。
シートをアクティブにしなくてもできるはずなんだけどエラーになってしまいます。
変数にはちゃんと値が入っています。何がいけないんでしょう。
>>
>Worksheets("" & j & "").Range(Cells(N, 1), Cells(N, 95)).ClearContent
これがいけない
Worksheets("" & j & "").Range( ) は 指定したシートなんだけど
Cells(N, 1)と Cells(N, 95)は アクティブシートだから
普通はそうだけど シート名が数値の場合そのままだと シート名ではなく インデックス値と解釈されるから
J=0 の時 エラー(インデックスが有効範囲にありません)になる
Worksheets(hoge).Cells(N, 1).Resize(1, 95).ClearContent
の方がスッキリするかな。
>>583
ありがとうございます。
RowsかWithを使ってみます。 With Worksheets("hoge")
.Range(.Cells(14,1),.Cells(14,1)).Clear
End With
じゃ駄目?
ところでWithステートメントってIfの内側でもコンパイル時に評価されるの?
With Worksheets(var)でインデックスが見つからないって怒られた
varが空ならその行まで到達しないのに
仕方がないからWithを使わずに書いたらエラーなし
何で?
>>588
OKっぽいけど同じセルだったらRangeなんて使わずに最初からCellsで良いんじゃね?
>>589
varの中身は何だったの?
空ならWith無しでも駄目じゃね? varのデータ型が何か? 空かどうかをどうやって判定しているか?
その辺りに原因がありそうだなぁ。
特にVariant型で判定かませる時はパターン覚えておかないと想定した動作にならないんだよね。
>>589
問題ない
sh = ""
If False Then
With Worksheets(sh)
.Select
End With
End If >>585
なら CStr( ) 使え
そもそも後ろの & "" は要らんし >>589
コードさらして
どう見てもお前さんの勘違いにしか見えない VBAの質問になるのかわからないですけど…
cellsとかでアドレス指定するときに
列を英文字から番号に簡単に変更する方法って何かありますか?
Excelのシート自体はR1C1をデフォにはしたくありません
何かのキーを押してる間だけR1C1表示にできれば便利そうだけど
あとはどこかに早見表でも作っておいておけばいいのか
なにか良い知恵があれば教えてください
>>595
Fundtion GetColumnNumberFromAlphabet (Txt as String) as integer
という関数を作る。
関数の中身は
・RegularExpressionを使いTxtがアルファベットのみで有効な範囲であることを保障。
・For i=1 to Len(Txt)で回して計算する。 >>595
難しく考えんでも これでいいんじゃないの?
MOJI = "CQ"
NUM = Range(MOJI & 1).Column
あとこうゆう方法もアリだとおもう(つか俺は良く使う)
Cells(1,"CQ") >>595
イミディエイトウィンドウで、
? range("AA1").column
一番上の行を空けといて、そこに数値(列番号)を入れておくとか
200か300くらいまでなら、一覧表を印刷して机に挟んでおく あと、ググったら
ボタン一つでA1形式とR1C1形式を切り替える方法
というのが出てくるよ。
たしか表示形式をVBAで変えられたような気がするわ
単純にアルファベットだからテーブルつくっといて検索とかでも良さそうだが
>>596-600
みなさんありがとうございました
アドレスは変数として使用したいことが多いので
任意のセルアドレスを簡単に数字に戻せたら…と考えていました
>>599の方法を検索して組み込んだら一番理想に近い状況を構築できました
本当にありがとうございました r1c1形式をデフォルトにしてやってるととても使いやすい
https://oshiete.goo.ne.jp/qa/4292844.html
ここのNo3の回答の人のサンプルを元に
郵便番号から都道府県を引っ張ってくるの作ったんですがすごい遅いです
A.csvは6行しかなくて中身は郵便番号が書いてあります
B.csvは日本郵便のHPからダウンロードした全国版CSVです
下のような感じでA.csvにB.csvの都道府県名をJOINでくっつけようとしたんですが遅くて・・・
速くする方法ありますか?
SELECT [A#csv].[郵便番号], [B#csv].[都道府県]
FROM [A#csv] LEFT JOIN [B#csv] ON [A#csv].[郵便番号] = [B#csv].[郵便番号] SQLの使用例をググると、
ADOとかいう、参照設定するやり方ばっか出てくるのは何故?
MicrosoftQuery(外部データの取り込み)のSQLじゃダメなの?
>>603
可能なところは数値と単位を
使って表現してね。
ディクショナリにする ExcelのVBAで、2chの過去ログのスレを覗きに行くコードを書いていますが、
IEで表示した場合、スレの下部に表示されている read.cgi のバージョンが拾えないものがあります
IEでの表示
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 05.02.02 2014/06/23 Mango Mangue ★
FOX ★ DSO(Dynamic Shared Object)
例えば、
大乱闘スマッシュブラザーズforWiiU Part927
http://mastiff.2ch.net/test/read.cgi/famicom/1420038262/
このスレの場合、
For i = htmlDoc.body.all.Length - 1 To 0 Step -1
tmpStr = htmlDoc.body.all(i).innerText
Next i
これでループを回しても、
「Mango Mangue ★」は取得できますが、「read.cgi ver 05.02.02 2014/06/23」と取れず、
nul(?)が2回出た後に、「最新50」の取得になります。
どうすれば、read.cgi のバージョンを拾えるようになるのでしょうか、お手数ですが教えてください。 >>607
いろいろググってたら、
htmlDoc.all(0).innerText
とりあえず、これで全テキストが取得できるのでここから抽出することにします
ありがとうございました。 うわぁぁぁぁぁあ、
Rows(a).DeleteがあるからDelete Fromなんか要らねーと思ってたが、
やっぱ要るじゃん。
うわぁぁぁぁぁあ
>>605
レスありがとうございます
>可能なところは数値と単位を使って表現してね。
>ディクショナリにする
どういう事でしょうか?
言ってる事が難しくて分かりません >>603
CSVじゃインデックスは効かないだろうな
Bの件数次第でやり方は変わるだろうけど
先にBを読み取って辞書(郵便番号->都道府県)を作ればいいよ 複数のシェイプを選択するときには以下のコードで選択できますが、
ActiveSheet.Shapes.Range(Array(1, 2, 3, 4, 5)).select
複数のチャートを選択したいのですが、同じようにできないかと下のように書いたのですが、
”指定した名前のアイテムが見つかりませんでした”と表示されてしまいます。
ThisWorkbook.Worksheets("Chart").ChartObjects(Array(1, 2, 3, 4, 5)).select
複数チャートを選択するにはどうしたらいいですか?
>>612です。書き忘れましたが、インデックスが1〜5のチャートオブジェクトは存在しています。
ThisWorkbook.Worksheets("Chart").ChartObjects(1).select、←これらはエラー出ません。一つのチャートの選択は無事行えることは確認しています。 >>612
マクロの記録
ActiveSheet.Shapes.Range(Array(1, 2, 3, 4, 5)).select >>614
マクロの記録も試してみたんですが、下のようなわけわからないものが・・・
ActiveSheet.Shapes.Range(Array("Chart 1", "Chart 1", "Chart 1", "Chart 1", "Chart 1")).Select
選択しているチャートのShapesインデックス番号がわかれば、
ActiveSheet.Shapes.Range(Array(1, 2, 3, 4, 5)).select、でできるのですが、インデックスがわからない・・・
Shapesインデックスを知る方法でもいいので教えてもらえないでしょうか? >>611
レスありがとうございます
その辞書というのは何ですか?
すみませんが>>605さんと>>611さんの説明だと全く分からないので
具体的に説明してくれるかたいたら教えてくださいよろしくお願いします >>617
レスありがとうございます
こんなオブジェクトがあったんですね
B.csvをDictionary オブジェクトに読み込んで
A.csvの郵便番号を指定して検索すると速いと
>>603のADO使ってSQLでやった場合は
CSVに対してだとどう頑張っても遅いんでしょうか? 最近VBAを使うことに限界を感じる・・。
VBAそのものがダメとかじゃなくて、
マイナーな処理についてググると、
C#の作例が9割、VBAの作例が1割とかだったりするの。
>>622
それはExcel関連の処理でもそうなの? >>622
言っちゃなんだけどそれはVBAそのものがダメなんだよ
エクセル組み込みっていう些細なメリットがある以外はまともな言語じゃない
あまりにも使いにくいからプログラマはみんなExcel VBAを嫌っている
プログラマに嫌われてるってことは情報も発信されないってことだ >>620
試してみました。
ThisWorkbook.Worksheets("Chart").ChartObjects.ShapeRange(1).select、これは問題なかったですが、
ThisWorkbook.Worksheets("Chart").ChartObjects.ShapeRange(Array(1, 2, 3, 4, 5)).select、”指定した名前のアイテムが見つかりませんでした”となります。
>ShapesのグラフだけのIndexを知りたかったら Shape.Type = msoChart で判定するとか
これを試した結果、Shapesのインデックスがわかりました。
で結局、今はこれでうまくいきました
ThisWorkbook.Worksheets("Chart")..Shapes.Range(Array(a, b, c, d, e)).Select
解決しました。ありがとうございました。 >>623
流石に、Excelの機能にしかないものはExcelの例が引っかかるけど、
SQL・IE操作・WindowsAPIは、他の例が多い。 >>626
VBA以外の例が出る時点で本来は管轄外だからなぁ。
VBAって何気にオールラウンダーだから、ついVBAありきで考えてしまうけど、
普通はそれぞれの目的に合わせて専用の言語でコーディングすべきなんだよな。 Excel+VBA はGUI実行環境としてはまあまあだと思うけどね
(他言語はそこから呼び出すとして)
VBAは低レイヤーを意識したプログラミングもできるしWindowsAPIも使えるから、時間を浪費するのさえ気にしなければ何でも出来るぞ。
GUIありきのアプリケーション付属言語という括りで考えると、他にここまでの自由度がある言語ってないんじゃないかな。
>>630
Webサービスのサーバー側で使うPHPと、クライアント側で使うJavaScriptみたいなもんかな。
目的さえ果たせれば何を専用にしてもいいとは思うから一例としてね。 オールラウンダーっていうのは組み込みからウェブ開発までなんでも出来るC++やC#やJavaみたいな言語のことを言うんだよ
VBAなんてエクセルとの相互作用以外になんの使い道もない
もちろん手順を踏めば出来るっちゃ出来るがそれはハサミで魚を捌けると言ってるようなものだ
VBAは何をやらせてもそんな感じになる
オールラウンダーとは程遠いとんだ出来損ないだよ
オールラウンダーどころかオランウータンにも劣るかもしれないが、簡便な実行環境ではある。
簡便でもないだろ
クッソ重いエクセル開いてマウスぽちぽちとかめんどくさすぎ
エクセルなんて一瞬で開くし、作業中何らかのブックを開いてることが多いだろ。
それにマウスポテチって?
>>635
一瞬で開かないし作業中はエディタとコンソール以外は無意味に開かねえよ
ポテチはコンソメがベスト >>632
ユーザー企業側の内製担当者としては、クライアントPCのOfficeに実行環境が漏れなくついてくるVBAとその他の言語では実行環境構築のための事務的コストが段違いに違うと言える >>622
マイナーな処理なんてそもそもExcelとかVBAとかでやることじゃないんだよね本来は >>639
経理システムとかあるでしょ
ああいう自社業務に使うシステムを、外注ではなく社員が自力で開発・メンテすることを内製と言う
テレビ局が番組の司会にタレントではなく女子アナを使ってお金を節約するのに似てる 別に言語が違うだけで、能力のある奴はVBAだろうが他の言語だろうが変わらないと思ってるだろ。
明確にExcelで出来ないことってのはあまり無い。
出来ることを知らない奴は多数いるようだが。
そもそもExcel使わないのは本末転倒だがね。
>>641
> 別に言語が違うだけで、能力のある奴はVBAだろうが他の言語だろうが変わらないと思ってるだろ。
面倒だなー
って感じ >>640
内製「担当」ってからには普通のEUC 以上の役割が当てられてるんじゃないの。 >>641
能力が同じでも言語が変われば出来ることも変わるよ
C#で大規模Webサイト構築できるやつでもVBAで同じことはできないし
C++で3Dゲーム作れるやつでもVBAで同じことはできない
製品化するようなソフトウェアはVBAじゃできないようなことばかり
VBAで出来ることなんてたかが知れてる そりゃまあ当然だが使い途が違う。
VBAは基本自分一人のためのツールだ。
>>637
クライアント環境差異を気にするならエクセルはないな
エクセルバージョンやプロセッサアーキテクチャやユーザーカスタマイズの影響が出やすい
マルチプラットフォーム対応がしやすい言語で開発してスタンドアロンパッケージにして配布するのが経験上最もトラブルが少ない >>644
出来ないか?
どっちもやろうと思ったこと無いし適用範囲外だから分からんけど。
3Dは出来そうに思うけどな。
大規模Webサイト構築って何を基に言ってる?
というかそれってほとんど言語じゃなくてライブラリの話じゃね? >>649
>できないか?
できない
膨大化するコードベースを管理しきれないしエクセルがランタイムじゃサービスや製品としての品質を確保できない
使い物にならないオモチャみたいなサンプルを作ってVBAでもできましたと言っていいなら難しくないが
>ライブラリの話
開発環境、フレームワーク、ライブラリ、コミュニティ、書籍などの充実度
これらは言語から切っても切り離せない問題だよね
VBAなんてそれこそCOMライブラリの集合体のようなものだろう
言語とライブラリを切り離して考えたらVBAなんて本当にクソの役にも立たない産廃になってしまう Excelしかできない奴がVBAで何でもできると思っている
実際何でも出来てしまうからな
9割以上が外との通信で最後チョロっと出力するのにexcelってのは微妙な気分だけど
できるならやればいい、こんなところにいちいち書かない
VBAアンチの連中って、どっか別のスレで洗脳でもされてくるんだろうか。
自分もアンチだけどどうなんだろう
COM/ActiveXが嫌いだからなのかな
VBAそのものはかなりダメな言語さ
しかし自由度は高いのでほげふがしやすい
>>657
できるならやってみなよ
まあお前じゃ無理だけどな 能書きは言いので>>603分かる人いたら教えてください >>660
答えは出てる
後は自分んで考えるべきだ >>661-662
質問スレでそういう発言しちゃう人痛すぎ
答えたくない人は黙って答えないでいる
つまり、御託ぬかしているだけの奴は答えられる知識がないだけのただの知ったか
Microsoft MVPとっているような奴でさえいい歳して自分の非を認めない
そんなのが多い現状 >>664
○態度が気にくわないので答えない
◎態度が気に入っても答えられない
と、ふざけるのはこの辺にして、
>>603と>>617と>>619辺りのサンプルコード分かる人いたら教えてください
よろしくお願いします >>665
サンプルコードっていうかまずそのCSVをDBのテーブルに入れろって意味だと思う。
そこはVBAと関係ない。 >>666
ここはVBA質問スレなのでVBAと関係ない回答されても困ります 最近は自分で考えないというかそういうトレーニングしてないから考えることができない若者が増えたよね
ゆとり教育ってやっぱり失敗だったんだなあ
>>668
回答する人によってどこまで質問者が考えたらよしとするかの基準が違うからね
例えば、よくある意味のないヘルプ
分かってる人にとっては当然のごとく不要
分からない人にとっても(難しくて理解できないので)不要
結局誰のためのヘルプなのか・・・と
質問スレで回答者に分からない内容でレスして
それくらい調べろという回答者基準で質問者に要求することの >>667
ここは "Excel VBA 質問スレ"なのだけど
>>603の質問のどこが"Excel"と関係あるの? CSV自体は扱い易く速い部類のデータ構造だけど
CSVを読み込んだだけでは何の順序もない形だから毎回線形探索になって検索とかには全く向いてないO(n)
DBに突っ込むとなんらかの形で順序化されて検索も速いO(log n)
データ量が少なければオンメモリで連想配列にするともっと速いO(1)
実際はJoin辺りの文字列連結自体がネックなんだろうけどね・・・
>>670
関係ないことはなくなくない?
>>671
これB.csvが例えばAccessのMDB形式でインデックス?がついてたりすると速いですか? 速くしたいんだったらCSVのままじゃダメだ。
それが事実。
そこから先Excel VBAの範囲を多少超えた回答がついたとしても何だというんだ。
しょうがないだろ。
別にExcel入ってなくても作れるなあ
アウトプット次第だが
なんでわざわざSQLでやるの?
ふつうにEXCELでCSV開いて、ワークシート関数かなんかセットしてやればいんじゃねえの
それで遅いならCSVからちゃんとしたDBに変えろって話だな
>>671
DBに突っ込んだからっていって、適切なインデックス(キー)設定しないと順序付けなんてされないぞ
そしてインデックスがあったからと言って、かならずO(log n) なわけじゃないぞ >>668
馬鹿は考える真似事をするな黙って言う事を聞いておけば良い
お前のことだぞ データ量が多いなど、本格的な運用なら、
DBの実行計画とか、インデックスで検索する方法とか、本格的な勉強が必要
高度情報処理技術者試験にも、DBスペシャリストがあるほど
>>603
全国版CSVをダウンロードしてみたら、約14万行あった。
郵便番号列は昇順にソート済みだった。
まず、郵便番号から都道府県を検索するのなら、
> SELECT [A#csv].[郵便番号], [B#csv].[都道府県]
> FROM [A#csv] LEFT JOIN [B#csv] ON [A#csv].[郵便番号] = [B#csv].[郵便番号]
は全く意味が無い。
SELECT [全国版csv].[都道府県] FROM [全国版csv] WHERE [全国版csv].[郵便番号] = '1234567'
みたいなクエリで十分。
また、CSVをそのまま読み込んでRange.Findしてもそれほど時間はかからない。
それが遅いなら、郵便番号列を二分探索するコードを書けばいい。(最悪でも18回の比較で済む) 訂正) 14万行じゃなくて、12万4千行だった。
ちなみに、データベースを使えば、検索は10ms未満くらいだろう。
アドバンスフィルタか高速VLOOKUPでも出来るんじゃないのそれ?
1行につき2件以上になることないでしょ?
質問です
A1〜A10までは値が入っていて
A1〜B10までをそれぞれ行ごとに結合したいとして
Range("A1:B10").Merge True
って書いたんですが
A1からB10までがまとめて結合されて1つのセルになってしまいます
また
Range("A1:B1").Merge
…
Range("A10:B10").Merge
でも結果は一緒でした
どうしたらいいんでしょうか?
あと
'Range("A1:B1").Merge
Range("A2:B2").Merge
…
Range("A10:B10").Merge
って1行目の部分だけコメントアウトすると
当然の1行目以外は普通に望むとおりに結合されたりします…
>>686
> どうしたらいいんでしょうか?
以下をコピペして実行。
Range("A1:B1").Merge
Range("A2:B2").Merge
Range("A3:B3").Merge
Range("A4:B4").Merge
Range("A5:B5").Merge
Range("A6:B6").Merge
Range("A7:B7").Merge
Range("A8:B8").Merge
Range("A9:B9").Merge
Range("A10:B10").Merge >>686
悪い、
Range("A1:B10").Merge True
でもちゃんと動くわ。
別シートで動作確認してみたら? ちょっと前にハマったんだがcsvとかをodbc使ってsqlでデータ取るときに欠損値というかヌルデータあると正常に取ってこれないことがあった
scheme.iniファイル作って列の型を教えてやればうまく行くんだけどもっといい解決策ってあるの?
自称上級者教さん教えてください
どういう理屈なんだそれ・・・。
("A1:B10")って書いたら("A1:B10")になるに決まってると思うが、
それでちゃんと行ごとになるんだとしたら、
エクセルの変な機能が働いているとしか思えない。
一度テキストをカンマ分割すると、
以降、他の文字も勝手にカンマ分割になるみたいな。
>>692
知らなかった
対象範囲内の行をForループで一個ずつ結合しなくても良いのか 今更だがExcelのWorksheet.Rangeクラスは奥深いな
>>680
ありがとうございます
> まず、郵便番号から都道府県を検索するのなら、
> > SELECT [A#csv].[郵便番号], [B#csv].[都道府県]
> > FROM [A#csv] LEFT JOIN [B#csv] ON [A#csv].[郵便番号] = [B#csv].[郵便番号]
> は全く意味が無い。
この意味が分からないです
>SELECT [全国版csv].[都道府県] FROM [全国版csv] WHERE [全国版csv].[郵便番号] = '1234567'
>みたいなクエリで十分。
1234567の部分は別のCSVに保存されています >>695
inner joinか
whereでサブクエリでよい >>696
ありがとうございます
>inner joinか
>whereでサブクエリでよい
>>603の条件でその方法を行う場合はどういう風に書けばいいんですか? >>697
サブクエリやinner joinは分かるの?
あなたの質問って結局「SQLはどう書けば良いの?」ってのと同じになるよ。
サブクエリやinner joinが分からない人は手を出しちゃいけないと思う。
取りあえずサブクエリ、inner joinをググってどういうものか理解してくれ。
そうすれば自ずと答えも分かる。 >>697
SELECT [B#csv].[郵便番号], [B#csv].[都道府県]
FROM [B#csv]
WHERE [B#csv].[郵便番号] IN (SELECT [A#csv].[郵便番号] FROM [A#csv])
JOINを使うよりは速くなる可能性はある。 vbaってlinqみたいなの使えるようになったんだ?
>>698
勉強したくて質問してるんじゃないので、サンプルコードを知りたいです
>>700
ありがとうございます
試してみて報告します >>700
教えていただいたSQLだとAにあってBにない場合表示されませんでした
Aに書いてある郵便番号が、Bの郵便番号一覧にない場合でも表示させたいです
あと型エラーが出たのでCStr()で変換していたんですが、これが遅い原因でした・・・
レスいただいたので気づけてよかったです ありがとうございます
SELECT [B#csv].[郵便番号], [B#csv].[都道府県]
FROM [B#csv]
WHERE CStr([B#csv].[郵便番号]) IN (SELECT CStr([A#csv].[郵便番号]) FROM [A#csv]) >>700
連続ですいません
教えていただいたこれは、A内で重複してると出てこなかったり使い物になりませんでした
SELECT [B#csv].[郵便番号], [B#csv].[都道府県]
FROM [B#csv]
WHERE [B#csv].[郵便番号] IN (SELECT [A#csv].[郵便番号] FROM [A#csv])
くさってやがる・・・的な >>704
教えて
なんの目的でサンプルコードだけを
知りたいの?
あと使ってる表現が気にさわる
点があるから注意しな。
便利に人を使いたいんだからさ
尚更気をつけて! >>707
質問スレに教員教諭は要りません
そういうのは学校でやってください >>709
といいつつも、ID:iJvaFhDzxみたいな可愛げのあるレスは嫌いじゃないです >>708
そっか
因みに自分が書いた内容は
全部ウソだから気をつけて! 分かって無い奴はこれだから...
どうせ回答してもこういう奴は結局地雷を踏むんだよ。
で、また人にやらせようとする。
いつまでたっても炎上案件の出来上がりってわけだ。
無事に納期守って大っきな案件終わらせたから
クールダウンがてらに作ってやってもいいぞ
仕様とどういう結果が欲しいか書いてみ
結果っつーか、都度都度の運用の仕方か?
こういう使い方をしたい って部分な
>>708
質問に対してどう答えようが勝手だろ
お前が決めるなよ馬鹿 平和な日々が続くと思っていた>>713のにかかってきた一本の電話 質問させていただいた者ですが、自己解決(?)しました
別のPCでの再現性さえ不確実で」あったりなかったり、という状態に陥ったので
Officeの修復やら対象ファイルの修復やらMergeの後にやっていたHorizontalAlignmentの設定をMergeの前に持ってくるやら
なんか色々いじくり回したら問題の現象は起きなくなりました…
>>711
むしろ好きです
お付き合いを前提に結婚してください
>>713
ありがとうございます
もう少し自分で試してみます
それでできなかった時はぜひお願いします 誰だ? お前?
気安くアンカー打つんじゃねえよ 気持ち悪ぃ奴だな
>>721
ナンプレとかロジックとか百ます計算作るには便利だよ vlookupやindex+matchみたいに楽に検索をする方法ってありますか?
いつもfor nextで回して値を取得しているのですが
自作関数を作ったほうが良いのでしょうか
>vlookupやindex+matchみたいに
なら vlookupやindex+match 使えば良いんんじゃね?
それがダメな理由あるの?
>>733
・長い
・間違いやすい
です
例えばmatchですと
application.WorksheetFunction.match(
ここまで打つと、ヒントはarg1,arg2…としか表示されません。第一引数が検索値なのか、範囲なのかわかりません
エラーになればいいのですが、エラーはあまり起こらないので、ミスにつながりやすくなっています
また、cells()だけだと、activateなシートのcellsと解釈されてしまいます
複数シート・ブックを扱う際には間違う危険が大きいです
with句も2ブック、2シートまでなら便利ですが、3以上のブックやシートを扱うと逆にわかりづらくなります
こういうのも慣れで対処しているのでしょうか >>734
なるほど そうゆう理由なら
range.find()+offset() を使うか自作function作るかだな
ちなみに 長いは 隠し(隠れてないが・・インテリジェンスが効かないという事で・・)
application.match
としても動作する
application.WorksheetFunction.match
application.match
この動作の違いは #N/A の時 前者は実行時エラー 後者はエラー値が返る事
(引数が 分りにくいのは一緒だけど) >>734
「長い、間違えやすい」の対処法であれば、ラッパー関数を作るのがパターンだよ。
言語によらない一般的な解決法。
機能が足りないとかなら、既に存在しないか探すのは第一手段として有効。
だけど、長いとか間違えやすいと言うのは主観的なものなので、探したところで代替機能はないと思うよ。 実装が楽 → ラッパー関数
覚えるのが楽 → 自作関数
状況によりけりだけど、Worksheetfunctionと同じ機能を自分で実装できるようになる頃には、
ラッパー関数は無駄な労力を使ってる気になってくるので最初から自作関数の方が良いといえば良いかなぁ。
>>735-737
色々な方法を教えてくださり、ありがとうございます
どれがベストかは、なかなか難しそうです
模索してみます >>737
まあ、そうなんだけど、考え方次第。
何もWorksheetFunctionの機能で済むところを、わざわざフルスクラッチする必要無いでしょって言う。
ってか、ラッパーなんて手間でも何でもないぞ… >>737
> 覚えるのが楽 → 自作関数
ごくごく単機能ではない場合、後からメンテする時に「このコード何やってんだ」となりかねない危険性はある >with句も2ブック、2シートまでなら便利ですが、3以上のブックやシートを扱うと逆にわかりづらくなります
Dim 何か分かりやすいシート名 As Worksheet
Set 何か分かりやすいシート名 = ThisWorkbook.Worksheets("元のシート名")
で、何か分かりやすいシート名の方を使う。
オブジェクト式を処理の途中で頭からいちいち書こうとしたり、With句で中途半端にまとめようとしたりすると煩雑になる
Worksheet型なりWorkbook型なりのオブジェクト変数にオブジェクト参照を代入すれば処理の途中で煩雑な参照式を書かなくて済むし、
オブジェクト変数を使えるならFor Each Object In Collectionループや Select Case True文でオブジェクト操作すると楽だったりする
C#を覚えてVSTOアドインを書こうとしているがC#さっぱりわからない。voidって何だよw
>>744
関数の戻り値のことだとしたら Sub と同じだと思えばいいけど >>744
C#詳しくないけど、ポインター型か関数の戻り値の型の一種だよね確か 動作を定義してるだけだから厳密には型じゃない
たまたま型と同じ所に書いてるだけ
マイクロソフトのドキュメントに型だって書いてあるんだけど違うの?
Nothingと同じようなもんで「ないアルヨ」って言ってるのがvoid。
厳密に型です
typeof(void) とかできるし
型に何を期待するのかによる
特殊な型として理解してもいいし
関数のシグニチャを示すためのキーワードだけど
便宜的に型と呼ばれてると理解してもいい
varも特殊な型(implicit type)として
ドキュメントにはのってるけど現実的にはキーワードだよね
void === null === nothing
でいいのかな?
どうせ使うのは、if分岐でfalseになるかどうかだしあんまり気にしていない
>>754
nullはNothingと同じだけどvoidは違うよ
C#: void Hoge()
VB: Sub Hoge() (意味的にはFunction Foo() As Void)
C#: int Foo()
VB: Function Foo() As Integer
Nothingやnullは変数に代入して値がないっていう意味の値として使えるけど
voidは関数が何も返さないことを示す印なので変数に代入できないし比較したりもできない 名称が違うって事は等価ではないって事だから、
こんなところで半端な知識を得るよりも、違いが分かるまで色んな文献当たるべきだと思うけど。
>>757
別言語から入った場合は、確認作業になるんだよ >>753
> 便宜的に型と呼ばれてると理解してもいい
なんでそんな嘘書くかなあ
便宜的じゃなくて厳密に型だよ
System.Void構造体の別名だし
> varも特殊な型(implicit type)として
> ドキュメントにはのってるけど現実的にはキーワードだよね
違うよ
var var = 1;
とか書けるし
(if はキーワードだから var if = 1; はエラーになる)
詳しくは
コンテキストキーワード C#
とかでググれ >>759
C#をこれから勉強しようとしてるVBerだが、こういうツッコミは助かるし勉強になる
753を読んでかなり胡散臭いなぁと思ってた 本当は型じゃないんだけど、型と同列に扱えた方がプログラミングしやすいから
とりあえず型にしとこう、ってのがvoid
「言語仕様上は型」「現実には型ではありえない」
どっちも正解という矛盾した存在なんだよ
MSDNのvoid構造体は言語の仕様を説明してるだけ
その説明も矛盾してるんだけど突っ込まないのがお約束
>>761
> 「言語仕様上は型」
なら型じゃねーか
矛盾してるのはお前の頭の中だけだろ w >>763
あ、今ちょっとバカには理解できない難しい話をしてるんで黙っててくれますか 根拠も示せずに
> 本当は型じゃないんだけど、型と同列に扱えた方がプログラミングしやすいから
> とりあえず型にしとこう、ってのがvoid
ってほざかれてもね w
質問です。初心者です。
コーディングの仕方をネットで調べていたら、withの途中でExit subなどで抜けるとエラーが発生する可能性がある。と書いてあったのですが、
with ××
if ××◯◯ then
××◯◯
else
◯◯
exit sub
end if
end with
としたい場合はどうすれば良いでしょうか?
お願いします。
>>767
心配ならいまExit SubにしてるとこをGoTo 文に変えて、Withブロックの外のラベルに一旦抜けるようにしてみたら?
飛んだ先でExit Subで処理を抜けるようにすれば良いし、エラー対策もそっちでやればいいんじゃないかな
ただし濫用はおすすめしないが >>767
withにせず必要なものを変数に格納してから処理するとかでもいいんじゃない? …てか、
>withの途中でExit subなどで抜けるとエラーが発生する可能性がある
というのは事実なのかな…
>>769>>770
回答ありがとうございます。
別の方法で試してみます。
>>771
確かかはわかりませんが、対処出来るならしておこうと思いまして >>773
エラーが起きるって書いてあったそのページのURL貼ってくれませんか
そしたらその情報の真偽自体を確かめられるので >>767
> コーディングの仕方をネットで調べていたら、withの途中でExit subなどで抜けるとエラーが発生する可能性がある。と書いてあった
どこ?
URL晒してみて
そんなの聞いたことがないんだけど 自由度が高すぎるとかえって混乱する。
Functionで値を返すのと、ByRefで返すのは何が違うか分からんし、
セルがあるのに、何でListObject(白と青の縞々のやつ)があるのかも分からん。
>>776
・Functionで値を返す
Functionで値を返しているだけ
・ByRefで返す
これは返してるんじゃなくて参照渡しにしている。グローバル変数とでも思ってればいい >>777
グローバル変数という説明はないでしょ・・・ >>776
ここですね↓
With 〜 End With の途中で抜けない
エラーが発生する可能性があるので、下記のようなコードは禁止
With hoge
.A = 2
.B = 3
Exit Sub
End With
(以上)*******
この記事はコーディング規約(トラブル回避のためにプロジェクト内で決めるコーディングのルール)の一例の紹介なので、書かれている内容はVBAの言語仕様上必然的に生じる制約に対応するルールであるとは限らないです。
問題のWith句の箇所ですが、正直、場合によるとしか言えないです。
hogeが自作クラスのインスタンスだったら、メソッドやプロパティの設計によってはエラーになりそう。
自分個人の意見としてはWith句の仕様に関してこういうルールが必要かどうかは疑問かな。 >>776
ListObjectのUI上の呼び方はテーブルだよ。
ワークシート上で構造化参照やデータリレーションの追跡機能を実現するためにエクセルに追加された比較的新しい機能で、使えると非常に便利。
ちなみに色は青白とは限らない。
既定のスタイルがそうなっているから何も設定しないでListObjectを作製すると青白になるだけで、色は自由に設定できる。 >>780
うーん、エラーになるというのは思い込みじゃないかな。
そうじゃないと、こんなことできないし。
on error goto my_exit
with hoge
call foo(.a, .b) ' foo()内で実行時エラーが発生する可能性あり
call bar(a) ' bar()内で実行時エラーが発生する可能性あり
'何か処理
end with
my_exit:
foo()やbar()じゃなくて、ビルトインメソッドの場合でも、実行時エラーが発生するものは呼べなくなる。
実行時エラーのwithブロック脱出は良くて、gotoやexit subはエラーが発生する可能視あり、というのも微レ存。 >>776
ByRefの場合、引数の値の参照先として呼び出し元が使用していたアドレスへの参照そのものが一旦関数に渡り、戻り値とともに呼び出し元に返されるので、関数内で引数に加えた変更が呼び出し元に引き継がれる。 With使ったからエラーになるなんてことはないだろ
With hoge
.A = 2
.B = 3
Exit Sub
End With
もしこれがエラーになるっていうなら
hoge.A = 2
hoge.B = 3
Exit Sub
でもエラーになるんじゃね
だれか、上だとエラーで下だとエラーにならないサンプルコード書ける?
Withの間に制御構造いれるなって意見にはまあ賛同するけど
VBScriptについての古い記事↓だと
https://msdn.microsoft.com/ja-jp/library/cc392475.aspx
>With ブロックへのジャンプも With ブロックからのジャンプも行わないでください。
>With ブロックのステートメントは実行されますが、With ステートメントまたは End With ステートメントが実行されません。
>その結果、エラーや予想外の動作が発生することがあります。"
とはある。
でも、最近(Office2013以降)のVBAのページ↓では
https://msdn.microsoft.com/ja-jp/library/office/gg264723.aspx
>一般に、With ブロックにジャンプしたり With ブロックからジャンプしたりしないことをお勧めします。
>With ブロック内のステートメントが実行されていて、With ステートメントまたは End With ステートメントが実行されていない場合、
>オブジェクトへの参照を含む一時変数は、プロシージャが終了するまでメモリに残ります。"
とあるので、
Exit For やら GoTo やらで同一プロシージャ内のどこかにジャンプしたときに、
End Withが実行されていないために問題が起きる恐れがあるとは言えるけど
Exit Sub では問題は起きないんじゃないかと思う。
しかしまぁ、Withからの途中脱出がMSからお勧めされていないのは確かだったので、
対応するとすれば
プロシージャ脱出フラグを用意して、Withブロック内で判定してフラグをセット
→Withを抜けてからフラグに応じてExit Sub
とでもするべきなのかな…? >>784
> Withの間に制御構造いれるなって意見にはまあ賛同するけど
with hoge
for i = 1 to 100
call hoge(i, .a)
call fuga(i, .b)
next
end with
for i = 1 to 100
with hoge
call hoge(i, .a)
call fuga(i, .b)
end with
next
俺は上が好み。
(だが、今までそう書いたことあるかどうかは、記憶にない) ジャンプするならWithを使うなって結論になるな
一つ賢くなったわ
まあWithなんてヘッダー・フッターのプロパティを多数設定する時くらいしか使わんけど
>>786
それ上と下ではWithの実行回数が違うから、パフォーマンスに差が出る可能性がある
パフォーマンス目的でWith使うなら、できるなら上のほうがいいだろ
>>788
メモリに残るってのは、Withによって生成される暗黙的な変数参照のことじゃないのか
それは通常 End Withで廃棄可能になる
そう考えると、Withの途中でジャンプすると、アプリ内とはいえメモリリークの原因になりえるかもな 今まで考えてなかったけど、End Withってメモリの解放してるだけなのか
>>788
> >オブジェクトへの参照を含む「一時変数」は、プロシージャが終了するまでメモリに残ります。
なのでWith文で確保した変数(プログラマーには見えない)のことでしょ
L:
With MyObj
.a = 1
Goto L
End With
とかやると問題になるのかもしれないけど通常は大丈夫だと思う >>790
俺も、End Withが単独のステートメントであるというのを、ヘルプ読んで知ったよ。 >>792
以下全部、独立したステートメントみたいだね
End
End Function
End If
End Property
End Select
End Sub
End Type
End With >>759
君が書いてるようなことは当然把握した上で
voidが分からないとか型なの型じゃないの?って言ってる人に理解してもらうの書き方
varはキーワードじゃないけど「現実的にはキーワード」だよねって言ってるの理解できない? >>794
わざわざ嘘を教えるとか全く理解できない
普通にMSDNで充分だし >>794
Voidが型なのか型じゃないのかっていう問いに決着をつけさせてあげようって意図は分かる
だけど前提の説明を省いて「Voidに何を期待するかで型か型じゃないのか決まる」って言ってたら、Voidそのものを正しく理解してもらうことに繋がらないよね 「何を期待する」とか言ってるのは俺じゃないし厳密に型なんだから型と思ってもらうのが正しい理解
その上でC#ではいくつかの制限(例えば変数宣言には使えない)があると言うだけのこと
えっと・・・・・ここ いつから C# も扱うスレになったのだ???
ああすまん、>>760 のようなVBer向けなので引っ張るつもりはないんだが、嘘を信じられても困るので >>796
voidに何を期待するかじゃなくて型に何を期待するかって書いてるでしょ
全く意味違うよ
voidがわからないって言ってる人に
voidは型だよって答えたら正しく理解してもらえるのかな? >>800
「voidに何を期待するか」って書いてるのは君だけなんだけど頭大丈夫?
> voidがわからないって言ってる人に
> voidは型だよって答えたら正しく理解してもらえるのかな?
>>760 はそこそこ理解したみたいだけどね >>800
俺の書き間違いだった、ごめん
>>753は型に何を期待するかによる、と書いてるね
System.Void構造体の実装と役割が特殊であるという前提知識の下、型の概念が多様であることを踏まえて753を読むと確かに分かりやすい
前提知識がなかったから宙に浮いた話に聞こえた
間違ったことは書いてないっぽいね
ちなみにMSDNのtypeof演算子の項では、普通のtypeof(type)とtypeof(void)を厳密に区別して書きつつ、
typeof(void)から返されるのは型が存在しないことを示す特殊なSystem.Typeオブジェクトだと書いてるね
これだと確かに、voidは型だよと言いきってしまう人の方が勇み足に思える
型って言ってるけどいかなる意味で型なのか明らかにしないと意味がない感じ
https://msdn.microsoft.com/ja-jp/library/aa691348(v=vs.71).aspx C#のvoidについて決着がついたとしてもVBAに生かせるか全く不明ですしねえ
スレ違いだから >>804 で誘導した訳だが 認知症? 社会不適合者? がいじ? 昨日、たまたま見たサイトでfalseの読みが「フォルス」と知ってショックを受けた。10年ぐらい
「ファルス」と思い込んでいた。人前でこんな話する事がないから良いっちゃ良いんだがなんか情けない。
そういうえば、Integerの読みをずっと「インテガー」と思い込んでいてPCショップの店員に爆笑された事があったな
それはさすがにw
まあ、ローマ字表記なんてものがあるから面倒なことになるんだよな
え?
いんてがーじゃないの?
独学だから気にもしなかった
>>808
独学やsohoだとその辺全く鍛えられないよね
しかもツッコミにくい
みんなも「プログラミング用語 発音」あたりで一度検索して目を通しておこう
っていうか通しておいて。聞く方も気まずいんで。 そもそも国毎に読み方違うし、現地語じゃないものの読み方なんてバラバラで当たり前だから気にする事じゃ無い。
何か統一された読み方があるって思い込まない方がいいよ。
ちなみに俺は「false」を他人に伝える時は「フェイルス」と呼んでるわ。
フォールスだと初めて聞く人は分からないし、ファルスだと聞き取りにくいという理由で。
>>812
それ言われると「え?え?」ってなると思う…というか俺はなるかな
プリンみたいに、慣習として合わせたほうが良いと思う
プリンの本来の読み方はプディング、でも最近はプディングと読むようになってきたからますますややこしいんだけどね pingコマンドの反応でreply from......というのがあるんだけど
前の会社のプロバイダのコールセンターで働いてたときに同僚がこのreplyをいつも「リプレイ」と呼んでたのを思い出した。
人間関係は
・親友
・友達
・同僚
・顔見知り
・名前だけ知ってる
といろいろあるけど下にいくほど訂正してあげづらい。上下関係ならさらにそう。上司には言いにくい。
国ごとに違うって…英語は英語読みでいいだろ…
>初めて聞く人は分からない
ったって、嘘の発音教えてどうすんのw
特に「フェイルス」はfailsと勘違いさせる恐れがあってダメすぎる
>>813
ちょっと聞き慣れない言葉とか、普通はその場で擦り合わせるだろ。 warningもよくある間違い。
それ英語が得意/興味あるという人種をのぞいたら
間違って発音する人の確率のほうが正しく発音できる確率より大きい。
正しくはウォーニングでウァーニングは誤り。
TCP/IPの発音もおれは「ティースィーピーアイピー」とCは「シー」じゃなく「スィー」といつも言ってたら
上司は「なんか外国人っぽい発音だな。帰国子女かなんかなの?」みたいに言われた。
オレのように将来の国際語としての英語や今後は英語がどんどん使われるのを意識した意識高い系の人にとっては
いつもなんかしらの英語由来の単語は英語の発音で無意識で記憶するようにしてるから
開発ツールのVisual Studioも「ヴィジュアルステューディオ」と「ステゥーディオ」だ。
普通の人は「スタジオ」らしいけどこれ指摘されたときは「えっウソ、みんな本当にそう発音してるの?」と思ったし今でもそう疑問に思ってる。
>>815
嘘の発音が駄目って事は、プログラマはすべからくネイティブ発音を習得しておくべきと?
それにfailsとfalseの扱いって普通は違うから会話の流れで分かるし、混同しやすいなら補足すりゃいいだけ。
ところで俺は双方が発声する形の「会話」を想定して「適当でいいよ」って言っているんだけど間違ってないよね?
なんか説明書か何か作るかのような否定のされ方してる気がするんだけど。 >>821
適当が一番よくないと思う。
英語風に覚えるならそれで統一すべきだし
日本語のカタカナで覚えるならそれに統一すべき。
そうじゃなきゃ太陽が西からのぼることを覚えるのにあの歌の歌詞の逆だと覚えるやりかたをしてたら
なにかたくさん覚えることがあるときになにが逆でなにが逆じゃなかったかわからなくなる。 >>821
「false」をすでに「フェイルス」と読んでいる集団の中に入ってしまったら
自分も会話は「フェイルス」で合わせるよ
その態度は>>821と同じです
でも「false」を「初めて聞く人」のために「フェイルス」と言うなんてのは
ちょっと理解できない >>823
そういう潔癖は、色んな人と関わる上ではあまりプラスに働かないから注意した方がいいよ。
まぁ、プログラマの性分として非常に不愉快であるというのは十分に理解できるんだけど。 >>819
俺はエスペランドが標準語になるだろうと本気で勉強したよ
英語(笑)フランス語(w)日本語(笑笑)
現在のエスペランドは方言ができまくって今の中国語みたいな惨状になっている
意識を高くするより、周りに合わせるのがベストだよ・・・ 習得しやすい呼び名でいい。
恥かくことはあってもテキトーで十分。
所詮日本語なんだからどこまでいっても英語発音とは別物になる
日本語で会話してて特定の単語だけ英語で発音されても気味が悪い
これが正解とか拘らずにその場その場の習慣に合わせるのが一番でしょ
日本語にだって方言があるが、それは間違いではない
てかフランスだってドイツだってみんな現地語読みしてるじゃん
イタリアではこう発音するんだよーとか言ってるじゃん
なら日本ではこう発音する、ここではこう発音するでいいじゃん
>日本ではこう発音する
その日本でもfalseをファルスなんて言わね
>>829
変な日本語はしゃべるな
× せやかて工藤
○ そうだからと言って工藤
これで合ってるか? >>832
工藤さん、あなたの仰りたいことは理解しているつもりなのですが私は次のように考えます。 integerだっていんてジャーじゃなくてインティジャーだぞ
アクセントの位置もたまに気になる
integer(インテジャー)でテにアクセントつける人が身近にいる
いやいいんだけどさ、
そういうとこが気になって話が入ってこなくなるときがあんのよ
派遣会社の「インテリジェンス」の人と話したことがあるが
自社の人のくせに「イ」にアクセントを話している営業がいた。
オレはその会社名を言わねばならないときに正しく「テ」にアクセントを置いてしゃべってるのにだ。
これらは外国人の環境で働いている人のいわゆる「あるある」ですね。
この前「ディズニーランドに行ってきたよ」と日本人と話すときすらいつものクセで
「ディズニーランド」の「ディ」にアクセントをつけて話す。普通の日本人は平坦か「ニー」付近にアクセントを置く。
こういう単語は探せば何十何百もすぐ挙げれそう。
>>839
じゃプログラミングに話を戻そう。
C言語とかででてくるchar型はどう発音してる?
これはcharacterの略のcharだから「キャラ」が適切だと思うけど「チャー」とか言ってる人がいる。
なにが正しいのだろう? >>835
アクセントの無い[i]はイとエの中間だからカナ表記ではローマ字発音に合わせるのが普通 >>841
charはキャラだがwcharはワチャー