Excel VBA質問スレ Part8
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2008/08/25(月) 23:16:33前スレ http://pc11.2ch.net/test/read.cgi/tech/1212587819/
★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。
★2 ExcelのVBA以外の部分に関する質問はNGです。
但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
VBAとは、『Visual Basic for Application』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
0851デフォルトの名無しさん
2008/11/13(木) 18:16:20データ量や数式、書式設定その他によってかなり違うだろうね
オレのはあくまで>>827の条件で試しただけだし
0852デフォルトの名無しさん
2008/11/13(木) 21:52:40range("namedarea").offset(20000).name = "namedarea"
コピーバックの後に .offset(-20000) で、わりと簡単に対応できた
画期的なやり方は見つからんね。構成とか見直すしかないかも、、、
0853851
2008/11/14(金) 00:13:24やっぱ>>847のが早かった。calculation 切れば数式なしの時とあんま変わんない
とにかく insert (特に 2回目)が遅いんで、insert とコピーバックの組み合わせでは
効果ないかも
0854デフォルトの名無しさん
2008/11/14(金) 21:41:28今日はじめて本屋にて VBA の存在を知りました。
初心者質問ですみません、例えば、、、これができるようになるとなにができるようになるのですか?
詳しいかた教えてください。
0855デフォルトの名無しさん
2008/11/14(金) 22:05:58例えば野球データベース
選手名を入力すればその選手のプロでの全成績が一覧表示されるとか
インベーダーゲーム作ってる人もいるよ
とにかくExcelをVBAプログラムで自在に操れるって事
0856デフォルトの名無しさん
2008/11/15(土) 19:22:40業務で言うと、データベースをexcelに展開して、
色んなチェックプログラムを掛けて品質保証したりとか。
ワークシートで使える関数を作って会社内に配布したり。
excel上に検索エンジン作ってる人もいるし、まぁ、何でもあり。
0857無職カス
2008/11/16(日) 02:50:07>>855
>>856 さん 返答ありがとうございます。かなり使える機能ですね。
最近アルバイトをやめました。時間はたっぷりありますのでそこそこ使えるレベルまでもっていきます。
これからVBAを勉強していきます。
多々質問すると思いますが、みなさんよろしくおねがいします。
0858デフォルトの名無しさん
2008/11/16(日) 03:45:10そこから各部門のトップ5を上の小さい表に抽出したいんだけど、
ランクとは違う気がするし行き詰っています。
どなたかご教授願えますでしょうか?
0859デフォルトの名無しさん
2008/11/16(日) 05:08:38セルAの値によってセルBの値が変わるよう関数を設定しているの状況で、
セルBの書式が自身の値によって変わるようにマクロを組もうとしています。
(書式は4種類以上なので条件付き書式は使えません)
worksheet_changeで書式変更を自動実行するようにしたのですが、
マクロを実行してみるとAの値を変えてもBの書式が変わりません(Bの値は通常通り変わります)
その状況で、まったく関係ないセルCの値を変更するとBの書式が変わったので、
マクロ自体には問題はないようです。
おそらく、A変更→マクロ自動実行→関数でBの値変更、という内部処理があるために
マクロによる変化が見られない状況であると思っています。
(違っているなら根本から考え直さないといけないかもしれませんが)
このような構成の場合、関数による値の変更が反映された後で
書式変更などのマクロが実行されるようにすることはできないのでしょうか?
ご教示お願い申し上げます。
0860デフォルトの名無しさん
2008/11/16(日) 10:11:550861デフォルトの名無しさん
2008/11/16(日) 10:51:08ご回答ありがとうございます。
5分前にcalculate使えばいいと気づいて、自己解決した旨書きにきたら
既にお答えくださっていたのですね。
初歩的な事でお手を煩わせてしまい、申し訳ございませんでした。
0862デフォルトの名無しさん
2008/11/16(日) 19:13:30基礎を勉強するには独学でも全然問題ないけど、
プログラム未経験で、かつ仕事に就いてないとなると、
プログラムの基本的な事を理解するまでに半年か1年かはかかると思う。
んで、そこから先は明確な目標が無いと無理。
やれる事が多いんだけど、ぶっちゃけた話、特化したプログラムには敵わない。
例えば>>855でゲームの話が出てたけど、確かに作る事は出来る。
けど、VBAからAPI呼び出してるに過ぎないし、更に言えば
タイムラインって概念がある&ドローツールのFlashなんかには到底及ばない。
ExcelVBAはあくまでExcelの処理系統のプログラムだと俺は考えてる。
Excel上での処理に関してはVBAがぶっちぎり。当然だけどね。
何か目標持った方が良いよ。
0863デフォルトの名無しさん
2008/11/16(日) 19:15:00calculate使う理由が分からん・・・。
VBAで処理してるなら、VBAでBの値も弾き出せば良いんじゃないか?
0864独り言(ちら裏)
2008/11/17(月) 01:24:05問題ありかと...
それがExcelのポリシーというのであれば、そういうアプリめいたものを
Excelで作ることが間違いだったということになるか...
0865デフォルトの名無しさん
2008/11/17(月) 10:16:53> 問題ありかと...
という意見が多いので、2007で設定数が 3 から 無制限 に、
優先順位も設定を書き直さずに変更できるようになった。
0866デフォルトの名無しさん
2008/11/17(月) 14:02:590867デフォルトの名無しさん
2008/11/17(月) 15:07:26というのが無難かと
0868デフォルトの名無しさん
2008/11/18(火) 00:50:10selection changeイベントで好きなだけ設定しろ。
おまいのVBAは飾りもんか?
0869デフォルトの名無しさん
2008/11/18(火) 17:07:45ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110.html
strRECをUTF-8→SJISにエンコードするには、どう記述したらいいですか?
0870デフォルトの名無しさん
2008/11/18(火) 20:26:27Dim a As Byte
a = 5
Do Until Cells(a, 5).Value = ""
Cells(a, 3).Interior.ColorIndex = 10
a = a + 1
Loop
cells(a,3)から(a,15)まで同じ処理をしたい場合はどう記述すればいいですか
0871デフォルトの名無しさん
2008/11/18(火) 21:16:34ADODB.Stream
0872デフォルトの名無しさん
2008/11/18(火) 21:23:24Dim a As Byte
a = 5
Do Until Cells(a, 5).Value = ""
Cells(a, 3).Interior.ColorIndex = 10
a = a + 1
If a = 16 Then
Exit Do
End If
Loop
0873デフォルトの名無しさん
2008/11/18(火) 21:45:15byte型宣言はいくらなんでも無いんじゃないかな・・・。
aの使用目的が行数って分かってるんだし、そこはlongに宣言すべきだと思うんだけど。
Dim i As Long
For i = 5 To Cells(5, 5).End(xlDown).Row
Range(Cells(i, 3), Cells(i, 15)).Interior.ColorIndex = 10
Next
短い構文でも同じ処理は出来るんでないかな。
0874デフォルトの名無しさん
2008/11/18(火) 22:07:130875デフォルトの名無しさん
2008/11/18(火) 22:07:40こうか?
0876デフォルトの名無しさん
2008/11/19(水) 00:36:24255行でオーバーフローで止まる方式
0877デフォルトの名無しさん
2008/11/19(水) 08:47:210879デフォルトの名無しさん
2008/11/19(水) 10:18:22どうもありがとう^^
メモリ不足で四苦八苦してたけど.LineSeparator追加で何とか出来た。ヽ(´ー`)ノ
ttp://www.cocoaliz.com/excelVBA/index/41/
0880デフォルトの名無しさん
2008/11/19(水) 10:30:400881デフォルトの名無しさん
2008/11/19(水) 13:46:560882デフォルトの名無しさん
2008/11/20(木) 10:23:070883デフォルトの名無しさん
2008/11/20(木) 11:21:570884デフォルトの名無しさん
2008/11/20(木) 13:59:13ADODB.Streamが良く分らなくても動いて良かったです^^
automation error
The object invoked has disconnected by the client
これ、どうやって解析したらいいの?
ユーザフォームからFiledialogでファイルを開くと 出るんだけど・・・
で、そのうちFM20.dllでメモリアクセスバイオレ〜ションになる
0886デフォルトの名無しさん
2008/11/22(土) 20:17:54帰ってきたページのリンク先の情報を取得したいと思ってます
Debug.Print objIE.Document.Links.Length で見ると値は4なので
フォーム送信前のリンク先の総数は4だと分かるんですが、
送信後に帰ってきたページのそれの総数(その他もですが)の取得ができません
set objIE = Nothing で一度解放してから再度
CreateObject("InternetExplorer.application") でバインドするだけでは駄目なのでしょうか
"システムエラーです: &H800004005 (-214767259) エラーを特定できません"
というエラーが出てしまいます
あともうちょいの様な気がしますので、どなたかご教示お願いします
0887デフォルトの名無しさん
2008/11/22(土) 21:39:470889デフォルトの名無しさん
2008/11/22(土) 22:16:44読み込み終わるまでウェイトは入れてる?
0890886
2008/11/22(土) 22:30:48一応前後に1回ずつ入れてます。こんな感じでしょうか
READYSTATE_COMPLETE = 4 をWhie〜Wendでループさせて待ってるので合ってると思いますが…
Debug.Print "objIE.Document.Links.Length = " & objIE.Document.Links.Length ←リンクの数(=4)
Call WaitBrowserResponce ←ウェイト
With objIE.Document.Forms("SQL_FROM") 'フォームにSQLのコマンド(WSQL)をぶち込む
.Item("SQL").Value = WSQL
.submit
End With
'ここでフォーム送信されます
Call WaitBrowserResponce ←ウェイト
Debug.Print "objIE.Document.Links.Length = " & objIE.Document.Links.Length ←こいつが4のまま
ここでリンクの数を再取得(前のページのでなく新しいページのが欲しい)したいのです
0891886
2008/11/22(土) 22:32:45Private Sub WaitBrowserResponce() 'IEの処理が終わるまで待機
While objIE.ReadyState <> 4 'READYSTATE_COMPLETE = 4
Debug.Print ".ReadyState = " & objIE.ReadyState
Debug.Print ".Busy = " & objIE.Busy
While objIE.Busy = True
DoEvents
Wend
Wend
Debug.Print "------------------------" ←単なるイミディエイト窓の区切りです
End Sub
0892デフォルトの名無しさん
2008/11/22(土) 23:41:05相対参照ってどう記述すればいいんでしょう
0893デフォルトの名無しさん
2008/11/23(日) 06:31:45まず、chdir thisworkbook.path で今開いてるブックのフォルダに移動してから
同じフォルダ内なら workbooks.open filename:="Book1.xls"
下のフォルダ内なら filename:="\Folder1\Book1.xls"
上のフォルダ内にある別のフォルダの中にあれば filename:="..\Folder2\Book1.xls"
ふたつ上のフォルダ内なら filename:="..\..\Book1.xls"
んな感じで
0894デフォルトの名無しさん
2008/11/23(日) 07:28:29すげーーーー!
書き込んだあと、いろいろ探してそれっぽいのは見つけたんだけど、このソースが一番短い!!!ありがとう!!
0895デフォルトの名無しさん
2008/11/23(日) 10:14:32URLリンク先取得
ttp://www.google.co.jp/search?hl=ja&q=VBA+URL+%E3%83%AA%E3%83%B3%E3%82%AF&lr=
>>892
ファイル検索
ttp://www.google.co.jp/search?hl=ja&q=VBA+File+%E6%A4%9C%E7%B4%A2&btnG=%E6%A4%9C%E7%B4%A2&lr=
0896デフォルトの名無しさん
2008/11/23(日) 15:47:12ちゃんとループ内に入ってることは確認済?
.readystate が変更される前に飛んで来てたりしてないよね
.document.readystate とか、document_completeイベントとかでのチェックはもう試した?
IE が値を返すタイミングはあんまり信用できないから、いろいろ試した方がいいかも
0897デフォルトの名無しさん
2008/11/23(日) 19:12:411を変数にしたい場合⇒RANGE("A" & format(i))というのを見つけたのですが、
Aを変数にしたい場合はどうすればよいでしょうか?
0898デフォルトの名無しさん
2008/11/23(日) 20:06:38普通に変数を & で繋げばOK
dim a as string: dim i as long
a = "A": i = 1
debug.print a & i ' ←これでも行けるけど
debug.print a & cstr(i) ' ←ちゃんと型を揃えたければこっち
つか、cells 使った方が効率いいよ
0899デフォルトの名無しさん
2008/11/23(日) 21:01:42ありがとうございます
とりあえず、a="A"(列名)を列番号からmid関数で取得して、使ってみます。
0900886
2008/11/23(日) 22:24:38ようやく仕事から帰りました
ループの囲みや最初のreadystateのチェック自体はOKだったのですが、
どうやら2回目以降のループで実際は読み込みが間に合ってなかった模様です
Do
Do
Application.Wait Now + TimeValue("0:00:01")
DoEvents
Loop Until objIE.Busy = False
Loop Until objIE.ReadyState = 4
として、最低1回以上のウェイトを挟んだ上でreadystateの値が4になるまで
ループを回す事で、きちんと最後まで読み込めるようになりました
0901デフォルトの名無しさん
2008/11/23(日) 22:57:44なんか回りくどいことするんだね、、、いいけどさ
>>900
オレなら外側のループにも doevents 入れたくなるんだけど、
動いたんならいっかw
0902デフォルトの名無しさん
2008/11/24(月) 07:27:53cells(1,1).select
ってやってみ。
0903デフォルトの名無しさん
2008/11/24(月) 19:35:430904デフォルトの名無しさん
2008/11/25(火) 01:56:12フリーのオブジェクトって何があるか教えてくださいエロイ人
BASP21なんかフリーだけど、送れるのはテキストだよね
試しにBodyにHTML書いてみたら、そのままテキストで着ちゃったよママン
0905デフォルトの名無しさん
2008/11/25(火) 04:26:56basp21 でできるはず
ttp://www.hi-ho.ne.jp/babaq/faq.html#M002
0906デフォルトの名無しさん
2008/11/25(火) 08:00:48即レスありがとう
ありゃ?これは有料じゃなくて無料でもできるのですか?
ちょっと読んでみても区別がつかなかったので、あとでじっくり読んで見ます。
0907デフォルトの名無しさん
2008/11/25(火) 09:34:06どっちも同じ。
0908デフォルトの名無しさん
2008/11/25(火) 14:17:31今後この別窓のIEオブジェクトを掴んでアクティブにして操作するにはどうすればいいのでしょうか?
文系のなけなしの知識でウィンドウハンドルを取得すればいいと思い当たり、
For Eachで各ウィンドウのそれの取得だけはできました(たぶん)
Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long)
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
(中略)
hWnd = GetForegroundWindow
Set objShell = CreateObject("Shell.Application")
For Each objIE In objShell.Windows
Debug.Print objIE.hWnd
Next
ウィンドウハンドルの値は取得できても、アクティブにしたい(操作したい)ウィンドウの
それだと判別する方法が解らないので、どなたかご教示&ご解説お願いします
0909デフォルトの名無しさん
2008/11/25(火) 14:55:04>>1★3,★4
お引き取り下さい
0911デフォルトの名無しさん
2008/11/26(水) 02:07:41俺も勉強してる時、ヘルプの使用例には
何度も泣かされたよ。
0912デフォルトの名無しさん
2008/11/26(水) 08:19:57次ぎは、どの様な本がお勧めですか?
0913デフォルトの名無しさん
2008/11/26(水) 19:41:470914デフォルトの名無しさん
2008/11/27(木) 10:36:04日本語わかる?
0915デフォルトの名無しさん
2008/11/27(木) 10:49:200916デフォルトの名無しさん
2008/11/28(金) 01:40:51教えてもえらなかったからって逆切れですか?
0917デフォルトの名無しさん
2008/11/28(金) 09:55:34ありませんでしょうか?
0918デフォルトの名無しさん
2008/11/28(金) 22:31:450919デフォルトの名無しさん
2008/11/28(金) 22:32:16OOP極めてるオレに聞け
0920デフォルトの名無しさん
2008/11/28(金) 23:54:440921917
2008/11/29(土) 00:15:40VBAとdesign patternで検索したら沢山ヒットしました。
http://www.google.com/search?client=safari&rls=en-us&q=VBA+design+pattern
書籍だと、VB+design patternってのは沢山あるのですが、
VBA専門となると見つかりませんでした。
0922デフォルトの名無しさん
2008/11/29(土) 08:07:51タイムスタンプとファイルサイズを取得することはできませんでしょうか?
0923デフォルトの名無しさん
2008/11/29(土) 08:38:150924デフォルトの名無しさん
2008/11/29(土) 09:27:04社内LANで繋がれたネットワーク上のドライブですよ。
VB.netでやった方がいいのかな。
0925デフォルトの名無しさん
2008/11/29(土) 09:29:220926デフォルトの名無しさん
2008/11/29(土) 10:11:340927デフォルトの名無しさん
2008/11/29(土) 10:36:38作れます。でも>>1
0928デフォルトの名無しさん
2008/11/29(土) 12:07:56「ドライブ」って何?
0929デフォルトの名無しさん
2008/11/29(土) 12:42:280930デフォルトの名無しさん
2008/11/29(土) 13:45:58Range("A1").FormulaR1C1 = "hello"
と
Range("A1").Value = "hello"
だと何が違うの?
Range("A1").FormulaR1C1 = "=R[1]C + R[2]C"
と
Range("A1").Value = "= A2 + A3"
も同じ結果になるね。
FormulaR1C1はダブルコーテーションの中をパースして「あ!RとかCがあるからこれはセルだな!」とか
独り言をつぶやきながらR[1]CをA2に置き換える作業をするところがValueへの代入と違うトコなの?
0931デフォルトの名無しさん
2008/11/29(土) 14:56:42で?
0932デフォルトの名無しさん
2008/11/29(土) 14:57:34a = 1とa = 1; b = aと何が違うの?
0933デフォルトの名無しさん
2008/11/29(土) 15:38:07記法の違い
0934デフォルトの名無しさん
2008/11/29(土) 16:03:19書いてあるサイトありませんでしょうか。
0935デフォルトの名無しさん
2008/11/29(土) 17:07:520936デフォルトの名無しさん
2008/11/29(土) 18:49:18死者が200人を超えるとも言われてるし。
0937デフォルトの名無しさん
2008/11/30(日) 10:08:03VBAって参考本みると簡単な操作で
いかにも思考ルーチンなんか作れなさそうなんですが
そんなことはないのですか?
VBAって入門書が多くて上級本がないように思うのですが
0938デフォルトの名無しさん
2008/11/30(日) 10:09:09オセロとか将棋か?
0939デフォルトの名無しさん
2008/11/30(日) 10:10:290940デフォルトの名無しさん
2008/11/30(日) 16:10:210941デフォルトの名無しさん
2008/11/30(日) 17:57:52言語の能力としては可能だが、VBAで組む必然性がない
0942デフォルトの名無しさん
2008/12/01(月) 00:16:33言語としての記述力に欠ける。
0943デフォルトの名無しさん
2008/12/01(月) 00:21:26落ち着いて作れないしな。
0944デフォルトの名無しさん
2008/12/01(月) 14:01:57VBAに取り込む方法があるんですか?
0945デフォルトの名無しさん
2008/12/01(月) 14:36:08APIが使えるから似たような感じでなら使えるんじゃないかな?
自作DLLではやったことないけど
0946デフォルトの名無しさん
2008/12/01(月) 16:53:26「参照」で取り込むかのどちらか。
前者の方が簡単。
0947デフォルトの名無しさん
2008/12/01(月) 17:37:53JavaScriptを使うか(もちろんScriptのCOMを使って)、
WSHでXML書いてCOMオブジェクトに仕立てあげるか。
0948デフォルトの名無しさん
2008/12/01(月) 20:13:060949デフォルトの名無しさん
2008/12/01(月) 20:15:46チミプログラム書いたことないでしょ?w
0950デフォルトの名無しさん
2008/12/01(月) 20:41:52レス数が950を超えています。1000を超えると書き込みができなくなります。