ExcelのVBAに関する質問スレです
前スレ
http://pc11.2ch.net/test/read.cgi/tech/1228372971/ ★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)
あー、またコピペしちゃったよ、この馬鹿
On Error Resume Nextってことで
投げっぱなしにするな インラインで処理しろ
淫乱で処理?
イランで再処理?
On Error GoTo 0ってことで
Newって昔のBASICだとソースプログラム消去なんだよな。 一番使い方の変わった予約語の一つだろうな。 F5で実行ってのはPC-8001の時代から変わってないのが面白い。
多次元連想配列というか、dictionaryに配列挿入して捜査は無理ですか? 自作関数作ったりしたんだけど、やっぱりobjメソッドで配列を取りだして操作ができなくて。 何かに使うとかではなくて、好奇心なのでお気軽な回答を頂ければ幸いです。
よくわからん、具体的なコードで
こんなか? Option Explicit call hoge call hogehoge sub hogehoge() Dim a(2) a(0)="apple" a(1)="berry" a(2)="cucumber" dim d set d=CreateObject("Scripting.Dictionary") d.add(1),a dim f for each f in d(1) wscript.echo f next end sub sub hoge() Dim a a=Array("apple","berry","cucumber") dim d set d=CreateObject("Scripting.Dictionary") d.add(1),a dim f for each f in d(1) wscript.echo f next end sub
ある列に下と同じ文字があればそのセルの下にあるラインの消去を行う。 また、ある列に上の値と同じ文字があれば行の高さを80とする ある列に下と同じ文字があればそのセルの下にあるラインの消去を行う。 また、ある列に上の値と同じ文字があれば行の高さを80とする プログラムを作ったが動きません。 どこが間違っているのか、だれか教えてください。 For N = 1 To LastRaw 'LastRaw は最終行 If WorkSheets("OutPut").cells(N,12).value = WorkSheets("OutPut").Cells(N+1,12).value Then WorkSheets("OutPut").Cells(N,12).xlEdgeBottom = False ElseIf WorkSheets("OutPut").cells(N,12).Value <> WorkSheets("OutPut").cells(N+1,12).value And WorkSheets("OutPut").Cells(N,12).value <> WorkSheets("OutPut").Sells(N-1,12).value Then Rows("N:N").Select Selection.RowHeight = 80 End If Next エクセル 2003 XP です。
誤 また、ある列に上の値と同じ文字があれば行の高さを80とする 正 また、ある列に上の値と同じ文字が無くまた 下にも無ければ、行の高さを80とする
>>14 1 With Worksheets("OutPut")
2 For N = 1 To LastRaw 'LastRaw は最終行
3 If .Cells(N, 12) = .Cells(N + 1, 12) Then
4 .Cells(N, 12).Borders(xlEdgeBottom).LineStyle = xlNone
5 ElseIf .Cells(N, 12) <> .Sells(N - 1, 12) Then
6 .Rows("N:N").RowHeight = 80
7 End If
8 Next
9 End With
1行目 全体をWithで囲めば、いちいちワークシートを指定しなくてもよくなる
3行目 Valueは省略可能。ただしこれは初心者にはおすすめしない
4行目 罫線の消し方はマクロの記録で調べる
5行目 この時点で下とは違うことが判明してるから上だけ調べればいい
6行目 いちいちSelectしない。ワークシートの指定が抜けてる
あと、行番号(左端の数字)は消さなくても丸ごとコピペで動くよ
ごめん。タイプミスとかあったんで上げ直し With Worksheets("OutPut") For N = 1 To LastRaw 'LastRaw は最終行 If .Cells(N, 12) = .Cells(N + 1, 12) Then .Cells(N, 12).Borders(xlEdgeBottom).LineStyle = xlNone ElseIf .Cells(N, 12) <> .Cells(N - 1, 12) Then .Rows(N).RowHeight = 80 End If Next End With
For N = 2 To LastRaw 'LastRaw は最終行 ↑ にしないと、1行目と2行目が違ってた時に0行目を調べようとしてエラーになる
>>14 VBAって論理式のショートサーキットしないんだっけ?
だとしたらこうかな?1行目の扱いが今ひとつ不明なんでループから出した。
With Worksheets("OutPut")
If .Cells(1, 12) = .Cells(2, 12) Then
.Cells(1, 12).Borders(xlEdgeBottom).LineStyle = xlNone
EndIf
For N = 2 To LastRaw 'LastRaw は最終行
If .Cells(N, 12) = .Cells(N + 1, 12) Then
.Cells(N, 12).Borders(xlEdgeBottom).LineStyle = xlNone
ElseIf .Cells(N, 12) <> .Cells(N - 1, 12) Then
.Rows(N).RowHeight = 80
End If
Next
End With
うわ、逆だった… With Worksheets("OutPut") If .Cells(1, 12) <> .Cells(2, 12) Then .Cells(1, 12).Borders(xlEdgeBottom).LineStyle = xlNone EndIf For N = 2 To LastRaw 'LastRaw は最終行 If .Cells(N, 12) = .Cells(N + 1, 12) Then .Cells(N, 12).Borders(xlEdgeBottom).LineStyle = xlNone ElseIf .Cells(N, 12) <> .Cells(N - 1, 12) Then .Rows(N).RowHeight = 80 End If Next End With
まだおかしい。何度もすまん。こんどこそ… With Worksheets("OutPut") If .Cells(1, 12) = .Cells(2, 12) Then .Cells(1, 12).Borders(xlEdgeBottom).LineStyle = xlNone Else .Rows(1).RowHeight = 80 EndIf For N = 2 To LastRaw 'LastRaw は最終行 If .Cells(N, 12) = .Cells(N + 1, 12) Then .Cells(N, 12).Borders(xlEdgeBottom).LineStyle = xlNone ElseIf .Cells(N, 12) <> .Cells(N - 1, 12) Then .Rows(N).RowHeight = 80 End If Next End With
試してから書き込め
23 :
デフォルトの名無しさん :2009/02/25(水) 14:30:58
セルA1〜セルA10にある一次元の要素と セルZ1〜セルZ10にある一次元の要素を 一つの二次元配列に格納する方法を教えてください><
>>23 dim v() as variant
dim i as long
v()=range("A1").resize(10,2).value
for i=1 to 10
v(i,2)=cells(i,"Z").value
next i
VBAはショートサーキットしないね。(現状では)
26 :
デフォルトの名無しさん :2009/02/25(水) 17:50:59
グラフのマーカをRGB関数で現したいです ネットでも『RGB関数を使うと近い色になる』との答えが多く、 自分でも試したのですがその通りでした 良い方法があればご教授ください OSはXP エクセルは2003です
VBAから秀丸マクロを呼び出すことって可能ですか?
28 :
デフォルトの名無しさん :2009/02/25(水) 18:13:30
RSS.EXEを起動していないなら、RSS.EXEを実行するというマクロ を書いてください。よろしくお願いします。
お断りします。
30 :
デフォルトの名無しさん :2009/02/25(水) 19:55:57
書けもしない香具師の、わざわざの断り口上、ごくろうwww
Absolutely not.
どうやれば呼び出せますか?
>>28 そのロジックはまずいよ
> RSS.EXEを起動していないなら、RSS.EXEを実行するというマクロ
の途中でもしRSS.EXEが起動したら2重起動になっちゃう
>21 ありがとうございました。 参考にして 成功しました。
37 :
26 :2009/02/25(水) 23:59:13
カラーパレットは56色までなので無理という事でしょうか? 以下のマクロできれいなグラデーションの様なグラフを作成したいのです Sub test() Dim aaa As String Dim i As Integer aaa = ActiveSheet.Name '仮データ作成(1列目に1〜225の数字を入れる−−−−−−−−−−−−−−−−−−−−−−− For i = 1 To 225 Cells(i, 1) = i Next 'グラフ作成−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− Columns("A:A").Select Charts.Add ActiveChart.ChartType = xlXYScatter ActiveChart.SetSourceData Source:=Sheets("Sheet3").Range("A1:A225"), PlotBy _ :=xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:=aaa ActiveChart.HasLegend = False 'マーカの色付け−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− For i = 1 To 225 ActiveChart.SeriesCollection(1).Points(i).Border.Color = RGB(0, i, 225) ActiveChart.SeriesCollection(1).Points(i).MarkerBackgroundColor = RGB(0, i, 225) ActiveChart.SeriesCollection(1).Points(i).MarkerForegroundColor = RGB(0, i, 225) Next End Sub
>>37 フルカラー使いたいなら画像を貼り付けるかExcel2007に乗り換え
>>35 このマクロを必要とする場面は、RSS接続をせずに現在使用中のマクロを実行すると
外部接続確認メッセージの応答を300回しなければならなくなるのを回避するためです。
2重起動は、RSS.EXEの場合は、やっても問題は発生していませんので、気にしてません。
shellと変数名の扱い方が肝腎かなとは思っているのですが、さっぱり、出来なくなっている
のでここに来ました。
41 :
39 :2009/02/26(木) 15:53:02
>>40 サンクス。踏ん切りがつきました。APIでやります。
それってExcelのDDEInitiate(app, topic)でやってる話じゃないの? appがなければ起動する。 その場合appがPATHにないと失敗する。 なので、RSS.EXEのショートカットを作って ファイル名をapp.lnk、RSS.EXE.lnkかRSS.lnkか、にして PATHに置けば済む話とちゃう?
43 :
39 :2009/02/26(木) 20:34:24
,.=-''' ̄ ̄ ̄ ̄ ̄ ̄` -、 / \ ./ .\ { } .| / ̄""''-=,,,,_,,,,,,==-'''"\ | .l, .( ,. - ' .、 ,. - , .} | l > ,=ニ\ ゛ | ''゛_,=ヘ、 r' {_ /~''i //_\_..`7| l、{''″/__`>ヽ |r`i l .{`|./ ヽ二・ニゝチ、 ! .ゝrニ・二r } ! i l { {(l { ノ | | ヽ :: }| ソ/ ヽヽ|.{ / | | \ i.|// \|.i / ,,.. | l._,, . \ i !/ 乂i / - (__,)-゛ ' {丿 .l .!、. ,. !., ., / | 人 \ .!''''" ̄~ ̄`''! / 人 ./ | .\ ,\ '-"" ゛-' / / | .ヽ ノ .{ \ .ヽ,., .: ,イ / } ヽ -'″ l `' 、`.───″ .} ヽ
>>44 それは
> RSS.EXEを起動していないなら
の答えになってないだろ?
>>46 全般的な使い方じゃなくて、
このこの方法で起動した分だけ気にすると言う要件なんじゃないの?
何を言ってるのか全然わかりません
わからないときはするーしよ
和文解釈能力と和作文能力には相関関係ありや?
52 :
デフォルトの名無しさん :2009/02/28(土) 00:15:42
OS:Win98 2000 XP 2003server vistaで Ver:Excel2000 2003 2007についての質問です。 VBAはコードサイズに限界がある(?)のであまり複雑な事はさせられない という話を聞いたのですが、具体的にどのくらいなのでしょうか? コマンドボタンやテキストボックス等にイベントをガシガシ記述していたら ワークシートへの入力がほとんどないにもかかわらず気が付いたらファイルサイズが1MBを超えていました このくらいならどうという事はないと思うのですが、ふと気になりました。 よろしくお願いします。
300MB超えるときつい。
入門書は大村あつしのがいちばん分かりやすいんですか?
>>54 へたくそでもとにかく動けばいいってレベルを目指すならいいんじゃない?
入門書なら谷尻かおりがいいよ。 概念も説明してくれるので、プログラム初心者でも読めるから。 他のは使い方の説明ばっかで使い物にならない。 最近はvbaの入門書を探したときないから、 このごろ出版されたものについてはどうだか知らないけど。
ちなみに、大村あつしがダメって意味ではない。 大村あつしの本を使ったことがないだけ。
本って使うものなのか
枕とか?
使うだろ
文学書は読むが技術書は使うだろ?
エロ本もな
俺の場合 拝むな
技術書を1回読んで終わりってパターンはあるな。
誰が書いた本でも良いから、初級→中級→上級 と、3冊くらい読むのが良いよ。 レベルアップして行くのは当然として、3冊読んでみると同じ事が書かれているのが分かると思う。 「これ読んだからいらねー、飛ばそ」 じゃなくて、同じ内容を復習も兼ねて読んでみる事。 同じ事が書かれているって事は、それだけ重要な概念って事だからね。 あと、実例集やサンプル集は買う必要無い。裏ワザ系の本もいらない。 他の人が作ったプログラムを改編するだけじゃ自分の物にならない。 んで、基本的な概念が理解出来たならば、自分の業務に特化した本を買いあさると良いよ。 (今はネットで調べる方が便利だけど)
>>65 VBAに中級とか上級とかの本があるかねえ・・・?
谷尻かおりだか誰だか忘れたがとにかく女性の書いた本だったと思うが、中身を本屋で立ち読みしたらかなり下手糞だった。 やっぱ女は駄目だなと思ったよ。
奈良お前が書いてミロのビーナス こき下ろすだけなら馬鹿でもできる
そんなのイランの核開発
>>66 マクロって何?なレベルの本
↓
OBJや変数が分かるレベルの本
↓
VBSやWIN32APIの呼び方が分かるレベルの本
↓
業務で必要なジャンルに特化した本
な感じで良いんでないかい?
>>70 > マクロって何?なレベルの本
> ↓
> OBJや変数が分かるレベルの本
> ↓
> VBSやWIN32APIの呼び方が分かるレベルの本
ここまで、ピンクいろのざっくりした入門書に載ってたレベルじゃね?
72 :
デフォルトの名無しさん :2009/03/01(日) 22:56:51
教えてください。 A1に1入れたらB1に丸一個 A2に2を入れたらB2に丸二個というようにAに数字を入れたら自動でBに○を数字分いれる式を作りたいのですがどのようにすればよろしいでしょうか。
>>72 >>1 >★2 ExcelのVBA以外の部分に関する質問はNGです。
> 但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
>>74 このコードはアツイ。
煽りじゃなくて、マジでこの考え方好きだ。
うん、おもしろいw でも○が5個までしか表示できない件について。 rept関数にすれば幸せw
発想の転換とか出来るやつはマジ羨ましい
無駄な転換をしてしまうのはどうかと この場合、ワークシート関数のREPT、VBA関数のStringと 目的そのままの関数があるのに、わざわざ弊害がある方法へと転換しなくても・・・・・
S="" For I = Cells(1, 1) S = S + "○" Next Cells(2, 1) = S
マクロを起動するとOUTLOOKで特定の相手にメールを送る処理って作れませんか? OSはXP、EXCELは2003です。
多分それが 発想の転換なんだと思っているんだと 思う
84 :
謝礼男 :2009/03/03(火) 22:17:41
解決してくれた方にはマジで現金振込みで謝礼します。 解決スピードにもよりますが2万なら余裕で出せます。というかそれ以上に困ってます。 助けてください。クビになりそうです。 マクロあんまり詳しくないのにネットで探していじってたらわからなくなりました。 ■現状:会社の機密書類に誤ったPASSをかけてしまいファイルが開けず困っています。明日取引先のプレゼンで使う資料が多数あって明日朝までに開けないとマジで上司に殺される。てかクビ。 ■背景:上司のPCのエクセルファイルに全部passをかけてと頼まれたが1000個くらいあったので、マクロを使ってpassをかけようとした。途中までは順調だったが途中からpassが謎なものになってしまい、開けない。 ■行動:とりあえずありえそうなpassは入力。フリーソフトでpass解読試みるが解読できず。 ■依頼:可能性としてマクロが誤作動したのが原因ではないかと考えられるため、マクロ詳しい方にありえそうな誤作動ぶりを解明して、パスを解明してもらいたい。詳細は↓
85 :
謝礼男 :2009/03/03(火) 22:18:20
■詳細:簡単に説明すると 指定したフォルダ(D1)にあるエクセルファイルに指定のpass(C4)をかけるというマクロ また別のマクロを使ってD列にはPC内のフォルダを列挙しており、上記作業が終われば次のフォルダに移動する。 で、実行したのが以下のマクロ
86 :
謝礼男 :2009/03/03(火) 22:18:46
Private Sub CommandButton1_Click() Dim c As String Columns("A:B").Select Selection.ClearContents Range("C1").Select Selection.ClearContents Range("A1").Select a = Range("D1") b = Dir(a & "\*", 2) ChDir a For l = 1 To 300 If b <> "" Then Cells(l, 1).Value = b
87 :
謝礼男 :2009/03/03(火) 22:19:32
If (Right(b, 3) = "xls") Or (Right(b, 3) = "XLS") Then c = a & "\" & b On Error Resume Next Workbooks.Open (c) If Err.Number = 0 Then Workbooks(b).Activate ActiveWorkbook.SaveAs Filename:=c, _ FileFormat:=xlNormal, _ Password:=Range("C4").Value, WriteResPassword:="", ReadOnlyRecommended:=False, _CreateBackup:=False, _ ConflictResolution:=True Workbooks(b).Close Cells(l, 2) = "○" Else Cells(l, 2) = "×" End If Else Cells(l, 2) = "×" End If b = Dir(, 2) Else l = 300 End If Next Cells(1, 3) = "終了" Range("D1").Select Selection.Delete Shift:=xlUp End Sub
88 :
謝礼男 :2009/03/03(火) 22:20:35
■実際にした作業 ・当初:マクロのとおり。ボタンクリックして、置き換えますかのyesをクリックして次へ次へ。 ・途中1:そもそもパスがかかっているやつがあってそのファイルを開くpass入力求められたときは 面倒だったのでescおしてpass入力画面消して、置き換えますかのyesボタンも面倒になったのでyキー連打。 ・途中2:さらにマクロ実行のコマンドボタン押すのが面倒になったので、マクロにショートカットキーをつけることに。 プライベートサブにショートカットのつけ方がわからず、 以下のマクロをプライベートサブではなくて普通のモジュールのマクロとして保存(macro1)し、macro1にショートカットキーを付加。ちなみにショートカットは ctrl+y ・途中3:↑のショートカットを使いctrl+yおしてescとyを連打する作業。 そしてその結果わかったのが。 プライベートサブでなくしてからは、passがかかっていない。(ほぼ全部) しかし、時々passがかかっていて、なおかつ指定したpassではなくなっていた。 ってな感じでpassがわからなくなりました。 長文駄文失礼しましたが、本当に困っており、助けてくれる方をお待ちしています。 本気で謝礼いたしますので、なにとぞよろしくお願いします。 ちなみにwin2000のエクセルはなぜか97でした・・・・・
>>88 新規ブックに
Private Sub Workbook_Open()
MsgBox "一身上の都合により退職させていただきます。" + vbCrLf + _
"僕の事は探さないで下さい。[2009/3/3]"
End Sub
90 :
デフォルトの名無しさん :2009/03/03(火) 22:47:29
解決ですな。
91 :
デフォルトの名無しさん :2009/03/03(火) 22:49:41
ざっくりと見たところ、対象xlsのC4セルでパスワードかけるんじゃね。これ。 なので、「元エクセルのC4の内容」が必要かと・・・ パス有xls触ったこと無いが・・・ デバッグで対象xls開いた後のC4が元パスになってるか見てみてくれ。
>>84-88 シートモジュールにマクロを置いた場合、Range("C4").Valueはそのモジュールが属するシートのC4になるが
標準モジュールにマクロを置いた場合、Range("C4").Valueはアクティブシート、つまりこのコードでは
パスを掛ける対象ブックのアクティブシートのC4になる
パスを掛けたブックの内容が解らないと、具体的なパスの予測は不可能
多少なりとも内容を覚えているか予測できるなら、その値を試してみることだ
ブックを送ってくれるなら、そこらのフリーソフトより強力な強制解除を試してみても良いが、
機密書類と言うからにはそれは無理だろうし、強制解除は不正にも使えてしまうから、
強制解除方法自体を教えるのも無理だ
それに、その背景と現状でバックアップすら無いなら責任は上司の方が重いぞ
93 :
デフォルトの名無しさん :2009/03/03(火) 22:51:49
んで、解決方法だが、 Public void TaisyokuProc()みたいな処理が必要かと。 元xlsねーのか?
94 :
謝礼男 :2009/03/03(火) 22:53:18
>>91 糸口サンクス。
しかし、C4には本来のpass(仮にabc)がはいったままなんだが
開かないファイルはそのパス(abc)にはなっていないんだ。
ちなみに当初成功した分ははabcで開きます。
OpenOfficeをダウンロードして、Excelファイルを開いてみたら? もし、開けたら別名で保存。
96 :
>>91 :2009/03/03(火) 22:55:30
>>91 ん〜とね、
ActiveWorkbook.SaveAs Filename:=c,
FileFormat:=xlNormal, _
Password:=Range("C4").Value,
ここのrange(c4)が対象ExcelのC4内容ではないの?という意味。
つまり、対象C4で暗号化してるんではないかと・・・
97 :
謝礼男 :2009/03/03(火) 22:56:20
>>92 ありがとうございます。
91さんのおっしゃっていた事もこれ読んでちゃんと理解できました。
プライベートじゃないから 元エクセルを参照してしまったということなんですね。
自分の無知具合に唖然です。
正直元ファイルの内容はほぼわからないので、解読は不可能そうですね。
98 :
91 :2009/03/03(火) 23:01:27
グーグル先生で「excel パスワード 解除」でGigazineのやつ試してみたら? うまくいくかもよ。がんがれ!
99 :
デフォルトの名無しさん :2009/03/03(火) 23:07:54
バイナリエディタかあらパス設定されてるワークブックを開いてみる。 そのなかからDPB=って文字列を検索してみそ。 その中のDPB=に挟まれたわけわかめの者がパス ってのでいいんじゃないのかい???????? みなさんどうおもうよ この惨めな男に慈悲あたえてあげようじゃないの
100 :
デフォルトの名無しさん :2009/03/03(火) 23:33:18
>>99 謝礼さんではないが、俺のExcel2000で[保存]-[ツール]のパスワードだと、DPBって無いんだが・・・
それって、マクロロックじゃまいか?
2000使ってるのは突っ込まないでくれ。軽いんだよね・・・
101 :
デフォルトの名無しさん :2009/03/03(火) 23:43:46
>>82 MAPIでググって見ればサンプルあるよ。
けど、MAPIだとOutlook系しか送信できなかったと思った。(違ったらごめん)
CDOだと送信のみOK。受信不可。
セキュリティー系の送受信するなら、BSMTP.DLL使うのが楽チン。
けれど、BSMTPやるならVBアプリ作ったほうが・・・
102 :
デフォルトの名無しさん :2009/03/04(水) 00:02:13
謝礼さん 暗号化とけないのは仕方ないでしょ。上司のBU取っとかなかったのは痛いが。 こんなんで辞職はないから大丈夫でしょ。(それこそ上司が悪い) 粘着厨といわれるからこれで退散。がんがってね! 最後にこんな感じで変数とか改行とかつけると良いかも。以上です。 '/** ' * Excelの列番号から、A1形式の文字を返す。 ' * @param columnNumber Excelの列番号 ' */ @return String A1形式のExcel列番号 Private Function ColumnNumberToString(columnNumber As Integer) As String Dim columnString As String '戻り値用 Dim uBit As Integer '上位桁用 Dim remain As Integer '余り用 If columnNumber <= 26 Then '列番号 <= 26 ("A" - "Z") columnString = Chr(columnNumber + 64) Else uBit = Int(columnNumber / 26) '列番号 > 26 ("AA" - "ZZ") remain = columnNumber Mod 26 '列番号を26で割って、余りを出す If remain = 0 Then columnString = Chr(uBit + 63) & "Z 'Chr(63) = 'A' Else columnString = Chr(uBit + 64) & Chr(remain + 64) End If End If ColumnNumberToString = columnString 'A1形式の列文字を返す End Function
SendKeysでOutlookを操作
「そもそもパスがかかっているやつがあった」って書いてあるけど それと自分が処理したファイルとの区別はついてるんかな? パスのわからないファイルの更新日時は確認したの? もともと上司がパスを設定していたのなら、謝礼男に開けなくても当然かと思う…。
で、その後どうなったの? 報告して〜!気になるじゃん!
106 :
82 :2009/03/04(水) 23:44:12
>>101 サンプルは何個か見付けましたけど、これって全部なにかしらのソフトをインストールしないと
使えないんですかね?
この機能を作ってるのが、余計なソフトを入れられない会社のPCな上に
複数のPCから利用されるのを目的として作りたいんですけど。
利用するすべてのPCで何かしらインストールしないと無理なんですかね?
107 :
101 :2009/03/04(水) 23:54:53
>>82 相当昔に業務ツール作成で使っただけなので間違いがあるかもしれないが・・・
MAPI :
特に無し。Office&OutlookExplessでOK。けど、Textの標準ソフトが秀丸とかだと動かなくなるので注意。
それと、OutlookがPopBeforeSMTPかなんかの暗号送受信ができなかった気がする。
MAPI対応MTUならOutlookじゃなくてもいけるはず。Beckyは無理だったと思う。
CDO:
2000系のCOMだかで動いたかな?送信NGでXP以降NGだったから早々にあきらめた。
.Netは違うのかな?
BSMTP:
フリーの超有名DLL。ツールとDLLを配布すれば誰でも使える。
このDLL自体がMTUなので、他にソフトはいらない。
しかし、25番とかのPort制限解除が必要。(ウィルスソフトとOS ポート制限)
>>82 みたいなのってわざわざエクセルのマクロでやる必要あるんか?
ふつうにDelphiとかでアプリ作ればいいんでないの?いややり方は知らんけど
Exelファイルを添付したいとかか?
109 :
101 :2009/03/05(木) 00:11:36
個人的にはPHPで作りますかね・・・PHPは初心者ですが、簡単に作れたはず。 企業だとサーバー立てるのメンドくて無理ですね。配布の制限とか無いんですが。 まあ、Excelで集計したデータをサーバーで自動更新したいのではないかと。 サーバーAPP作って、そこにxlsを放り込むとかでもできますよね。
>>108 操作しやすいExcelで登録した先に、スパムを送り付けたい。
Excelって10万件ぐらいデータ入れたら重くて開くのも大変にならんか? この程度じゃSPAM業者として成立せんだろ。2桁ぐらい少ないと思う。 Excelの操作をケータイで監視したいんじゃね? Outlookにこだわらなければコマンドラインツールを使うとか。
113 :
デフォルトの名無しさん :2009/03/05(木) 07:05:36
マクロを使ったWebクエリについて詳しく解説しているホームページ又は書籍を知っている人いたら教えてください。
ところで謝礼男は生きてるのだろうか? 気になるね。
115 :
デフォルトの名無しさん :2009/03/05(木) 12:12:01
ものすごく基礎の質問で申し訳ないのですが Editorで作ったプログラムをワークシートで使うためにはどうしたらいいのでしょうか?
116 :
デフォルトの名無しさん :2009/03/05(木) 12:33:32
>>115 VBEのこと?
ワークシートにボタン貼り付けたり、[マクロ]-[実行]でいいんじゃまいか?
違うのかな?
117 :
デフォルトの名無しさん :2009/03/05(木) 12:50:54
>>116 VBEです
ユーザーフォームでプログラムを作り、VBE上で実行はできるのですがワークシートで実行する方法がわかりません
マクロのところにも作ったプログラムは表示されてないです
メニュー→マクロで実行できる
119 :
デフォルトの名無しさん :2009/03/05(木) 20:38:13
functionプロシージャでソルバーを使うことはできますか? 例えば exp(x)+n*x=0 (n=1,2,3,など) の解xを求めたいとき、nをfunctionプロシージャの引数として変化させ ソルバーで求めたxを返したいのですが。 XP、Excel2003です。よろしくお願いします。
120 :
デフォルトの名無しさん :2009/03/05(木) 21:05:16
121 :
119 :2009/03/05(木) 22:09:13
>>120 さん
早速ありがとうございます。
試してみたのですが、なんかうまくいかない。。。
セルA1を =EXP(B1)+1*B1
セルC1を =test(A1,B1)
として次のプログラムを書いてみたのですが、B1の初期値を返すだけです。
Function test(y As Range, x As Range)
SolverOk SetCell:="y", MaxMinVal:=3, ValueOf:="0", ByChange:="x"
SolverSolve Userfinish:=True
test = x
End Function
できれば=EXP(B1)+1*B1もセルではなくFunctionプロシージャに記述したいのですがムリでしょうか。
122 :
デフォルトの名無しさん :2009/03/05(木) 22:34:52
>>119 引数の使い方間違ってると思う。
y As Range -> SetCell "y" では、A1:B1とかではなく、文字列"y"になる。あと、Val系引数は文字列でよいのかな?
引数をstringにするか、int x0,y0,x1,y1とかで、Range(x0 + ":" + y0)とかにしないと駄目かと。(書式とか文法は脳内変換よろ)
列番号をA1形式に変換するのは、
>>102 見てほしい。多分常套手段。
さっき書き忘れたけど、ソルブだっけ?はシート必須になるんじゃないかな。
何で、TempとかMacroといった作業シートが必要と思います。
さすがに関数そのものを取り込むのは無理かと。
どっかのHPで見たけど、マジでやる場合は2次方程式のルーチンを書いていたような・・・(これがソルブだよね?)
123 :
デフォルトの名無しさん :2009/03/06(金) 00:28:08
>>113 グーグル先生で[vba webクエリ]で上から10件以内でもろヒットなんだが・・・
株系がわんさか出てくるがこれじゃまいか?あまりVBAでやらないと思うが・・・
124 :
119 :2009/03/06(金) 00:32:24
>>122 さん。ありがとうございます。
ちょっと煮詰まってきまして。。。
セルA1を =EXP(B1)+1*B1
としてSubプロシージャで
Sub solv()
SolverOk SetCell:="A1", MaxMinVal:=3, ValueOf:="0", ByChange:="B1"
SolverSolve Userfinish:=True
End Sub
で解を求めることは確認できたのですが(上のA1をChr(65) & Chr(49)としても大丈夫でした)、
Function test1(x)
SolverOk SetCell:="A1", MaxMinVal:=3, ValueOf:="0", ByChange:="B1"
SolverSolve Userfinish:=True
test1 = x
End Function
についてC1セルを =test1(B1)とすると
「内部エラーが発生しました。またはメモリ不足です。」
となってしまいます。
せっかく回答いただいたのですが、もうすこし考えて見ます。
ソルブはシート必須であれば最適化プログラムを自分で書かないといけないのでしょうか。
125 :
デフォルトの名無しさん :2009/03/06(金) 01:35:21
久しぶりにVBAやったら意味がわからんくて吹いたwwwCDいるしwww 引数が4個必要だから、fx組み込み関数の用には使えるのかな?ごめん。セル直内のマクロ関数作ったこと無い。 VB6の代わりにしか思ってないから・・ セル = fx(B1, B2, B3, B4)が可能なら、下記Funcの引数を変えればOkかと。 >124の最後は、循環しているから。@B1=test() Atest()かB1を読みにいく →つまり、test() B以下無限ループ。 124の引数の意味は分からんが、下記のようにやればうまくいくのでは? 使い方が良くわからんが頑張ってくれ。仕事あるので寝るよ。 '/** ' * イチローの打率予測計算。Solverの初心者HPのを元にマクロ記録で起こす。 ' */ Option Explicit 'テスト関数。 Private Sub test() Call TestFunc("$B$6", 3, 0.4, "$D$5") End Sub 'Solverテスト関数。 Private Sub TestFunc( setRange As String, maxMinval As Integer, targetVal As Double, changeRange As String) SolverOk SetCell:=setRange, _ maxMinval:=maxMinval, _ ValueOf:=targetVal, _ ByChange:=changeRange SolverSolve Userfinish:=True End Sub
>>125 最小インストールかカスタムインストールでVBEを選択肢から外さない限りCDなんか使わんぞ
どうせHDDなんて有り余ってんだから男は黙ってフルインストール
127 :
デフォルトの名無しさん :2009/03/06(金) 01:44:52
>>126 Solverが追加アドインだからCD要求受けたのですわ。
基本全インスコだが、2000だからだろうか?基本VB6用でしか使わないから、アドインは良くわからん。
129 :
デフォルトの名無しさん :2009/03/06(金) 01:54:19
おいおい、俺のxp & 2000では動くぞ。 参照設定でSolverいるがなwww俺はそこで10分以上はまったwww それに、Solver用データがシートに必要だ。 質問者さんは基本データがシートにあるから、このソースで意味は分かる。 まじで眠い。これ以上は誰かよろ
130 :
デフォルトの名無しさん :2009/03/06(金) 01:58:13
あっ、ごめん。もしかして、Privateのせいか? 外から使うならFuncをPublicでやってくれ。デバッグしかしてないから、Privateで作ってるわ。
それだけじゃねーよ つーか、本当にユーザー定義関数(ワークシート上から使う関数)作ったことないんだなw
132 :
デフォルトの名無しさん :2009/03/06(金) 02:29:03
>>131 (仰るとおりユーザー関数は無知です orz)
Subで作ってる理由はきちんとある。
Solverの結果がレンジの場合があるっぽいので、そういったものを単一セルで表現できるのか?
それが分かりませんでした。
なんで、質問者さんはTestFuncをPublic Functionにして利用してね。
戻り値の書き方は
>>124 見る限りわかるんだよね?
あとは
>>131 さんが教えてくれるよ。
歯磨き終わったのでおやすみなさい。
133 :
119 :2009/03/06(金) 07:39:08
みなさん寝落ちしている間にいろいろありがとうございます。 当方のやりたいイメージは以下のように方程式をfunction内で定義し ソルバーで解いた解を返すようなプログラムなのです。 Function test(n) y = Exp(x) + n * x SolverOk SetCell:="y", MaxMinVal:=3, ValueOf:="0", ByChange:="x" SolverSolve Userfinish:=True test = x End Function みなさんの回答をもとにまた今晩考えてみます。
どんだけスキル低いんだよ。125-132でFAだろjk クレクレは帰れ
135 :
デフォルトの名無しさん :2009/03/06(金) 15:44:31
VBAのエディタって行番号を表示できないんでしょうか? 8年以上は悩んでいます。
ないよ。俺はデフォでホイールが動かないのが悩み。
137 :
デフォルトの名無しさん :2009/03/06(金) 15:59:36
Excel VBAを勉強中なんですがちょっとつまずいでしまって。 エクセルシートに以下のように100行2列の表があるんですが、 東京 台東区 千葉 ○○町 〜 これをFormのListBoxに表示していますが、 東京なら東京だけの情報をリスト表示したいのです。 現状はこうなっています。 UserForm_Initialize()内で lstBox.ColumnCount = 2 lstBox.RowSource = "アドレス!A2:B103" これを東京または千葉だけのリスト表示にするには RowSourceをどのように記述すればいいんでしょうか? 他にいい方法などありますか・
1 AdvancedFilter 2 1から作る ・AとBのデータ全取得 ・コンボボックスでAを表示 ・選択データでBを初期化
139 :
デフォルトの名無しさん :2009/03/06(金) 17:01:26
レスありがとうございます 教えていただいたことを調べてみます
> RowSourceをどのように記述すればいいんでしょうか?
RowSourceだけではどう記述しても無理
俺だったら連想配列とクラス使って実装するが
100行くらいなら
>>138 でも十分だな
>>140 んなモンにClass使うか
サブルーチンで十分
てか、
>100行くらいなら
>>138 でも十分だな
より、一番簡単なのが連想配列だろjk
データ加工するなら動的配列かCollectionじゃね? 少なくとも、配列, end(xlup) end(xlleft) for ifは覚えてくれ
143 :
デフォルトの名無しさん :2009/03/06(金) 17:56:58
VBAってソートのメソッド無いよね。 ○○ソートアルゴリズムでソートするってこと?
CreateObject("System.Collections.SortedList") つかえ
146 :
143 :2009/03/06(金) 22:02:42
>>145 System.Collections.SortedListは使えなかったがSystem.Collections.ArrayListが
使えた。
というか、自分の勝手な思いこみでコレを使える事を知らなかった。
キモすぎ!デブおた君の
>>144 ↓
/ ̄ ̄ ̄ ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( 人____)<日本語でおk。自前実装しる
|./ ー◎-◎-) \______________
(6 (_ _) ) カタカタカタ
| .∴ ノ 3 ノ ______
ゝ ノ .| | ̄ ̄\ \
/ \__| | | ̄ ̄|
/ \___ | | |__|
| \ |つ |__|__/ /
/  ̄ ̄ | ̄ ̄ ̄ ̄| 〔 ̄ ̄〕
| | ̄
質問です。 単純に指定フォルダを開くモジュールを作って、プロシージャ(?)で動かしたいんですが、 以下のようにコードを書いても 「ファイルがありません」とエラーになってしまいます。 調べても書き方はあっているように思うんですが、何がいけないかお教え下さい。。。 Private Sub CommandButton1_Click() Const pass As String = "C:\aaa" OpenFolder (pass) End Sub Public Function OpenFolder(pass As String) As String Shell "explorer" & pass, vbNormalFocus End Function
passじゃなくてpathな あとは MsgBox "explorer" & pass でも見て見ろ そのエラーが当然だと気付くから つーか、この程度の確認すら出来ないってどうなのよ?
5分ほど前にvbを始めたもんで・・・ ただこれだけの事だったとは非常に恥ずかしい。。。 サンクス
もう一個質問。 VBとVBAって別もの?独立してるかしてないか? エクセルからシートをフォームに見立ててボタンつけたりなんだってして、 visual basic editor開いてコード書いて・・・って普通のVBのようにモノを作ってもさ、 エクセルからしか起動できないんだよね? 普通にビルドしてexe作って単体で動かすとかはムリ?
exe作りたければVB6買え VBAでは当然ながらexeへのコンパイルは出来ない 多少言語が変わっても良いなら、VB.NETは無料のでexe作れる これから始めるならVB.NETなりC#.NETなりの方がいいかもな
vb6は店頭販売終了だからMSDN購入しかない やっぱり無料2008落としてC#がBest VB.NETやるならC#覚える方がのちのち楽になるよ。書き方同じだし。
オクで正規品買えるよ MSDNの横流しも多いが
154 :
デフォルトの名無しさん :2009/03/07(土) 15:26:34
>>146 System.Collections.ArrayListってVBAで使えるの?
.net系の定義だと思うのだが
(スレチだが、
>>143 の質問方法だと煽らて当然かと)
CreateObjectしてみれば?
参照設定の一覧の中にmscorlib.dllがある。
>>154-156 がオートメーションエラー(80131700)でNGです。誰か教えて。
2000 sp4 .net2.0
office200 sp3
参照設定にmscorlib.dll
Sub Sample1()
Set DataList = CreateObject("System.Collections.ArrayList")
Set DataList = Nothing
End Sub
土曜日の仕事を金曜日にかたずけたいと思いプログラム を考えましたが動きません。 if WeekdayName(Weekday(Date))=6 and Hour(Time) >14 then ActiveSheet.PageSetup.CenterHeader = "&24&B&I"+ Date +1 ’金曜日の2時以降は土曜日の日付のヘッダー else ActiveSheet.PageSetup.CenterHeader = "&24&B&I"+ Date ’平日は当日のヘッダー end if ActiveSheet.PageSetup.RightFooter = "&36&B&Uテスト" これのどこが間違っていますか? 環境; os xp v 2003
>>158 Debug.Print WeekdayName(Weekday(Date))
>>158 Date型を文字列として足す場合は+じゃなくて&を使う
161 :
デフォルトの名無しさん :2009/03/09(月) 21:23:07
すみません教えてください。 最近会社のパソコンが新しくなったのですが エクセル2003でコードを記入しようとすると ツール−マクロの次が セキュリティしか表示されません。 何か原因があるのでしょうか。
1万件Union、素人なりにがんばってみますた。うちのネットブックで6秒です。Core2のデスクトップなら2、3秒でしょう。 掲示板の行数制限とかあるんで配列の大きさとループの回数を定数にしたんで汎用性ゼロです。 Declare Function timeGetTime Lib "winmm.dll" () As Long Sub aaa() T1 = timeGetTime() ScreenUpdating = False Dim a(270) As String Dim si As Integer Dim s As String For i = 1 To 10000 w = "A" & (i * 6 - 3) If Len(s & w) <= 255 Then s = s & w & "," Else a(si) = Left(s, Len(s) - 1) si = si + 1 s = w & "," End If Next a(si) = Left(s, Len(s) - 1) Set r = Range(a(0)) For i = 1 To 233 Step 29 Set r = Union(r, Range(a(i)), Range(a(i + 1)), Range(a(i + 2)), Range(a(i + 3)), Range(a(i + 4)), Range(a(i + 5)), Range(a(i + 6)), Range(a(i + 7)), Range(a(i + 8)), Range(a(i + 9)), Range(a(i + 10)), _ Range(a(i + 11)), Range(a(i + 12)), Range(a(i + 13)), Range(a(i + 14)), Range(a(i + 15)), Range(a(i + 16)), Range(a(i + 17)), Range(a(i + 18)), Range(a(i + 19)), Range(a(i + 20)), Range(a(i + 21)), _ Range(a(i + 22)), Range(a(i + 23)), Range(a(i + 24)), Range(a(i + 25)), Range(a(i + 26)), Range(a(i + 27)), Range(a(i + 28))) Next Set r = Union(r, Range(a(262)), Range(a(263)), Range(a(264)), Range(a(265)), Range(a(266)), Range(a(267)), Range(a(268)), Range(a(269)), Range(a(270))) Cells(1, 2) = ((timeGetTime() - T1) / 1000) & "秒" r.Value = "うにお" '念のためテストデータ書き込み ScreenUpdating = True End Sub
下記のInputBoxでキャンセルしたとき 「実行時エラー'424': オブジェクトが必要です。」のエラーがでるんだけど 後続のIf文で MsgBox "NG" の処理をさせるにはどうコーディングすればいいですか? そもそも使い方間違ってる? Public Sub test() Dim c As Range Set c = Application.InputBox("", Type:=8) If c Is Nothing Then MsgBox "NG" Else MsgBox "OK" End If End Sub
on error resume next
>>165 うまくいきました、ありがとうございます
質問なんですけど、Object型変数が空になるケースがある判定では
On Error Resume Next を事前に書いておくのが一般的なんですか?
ふつうなんじゃね?variant で受けて
もとい 普通なんじゃね? variantで受けて、isobjectとかで分けても、たいして良いこと無いだろうし。
169 :
166 :2009/03/10(火) 00:49:51
>>168 わかりました、ありがとうございます
variantで受けて、isobjectとかで分けて〜とかもよくわからないので
もうちょい調べてみます
Application.Cursor = xlWait でマウスポインタが砂時計にならないのって どういう原因が考えられるでしょうか?
砂時計を表示するまでも無いほど短時間で終了する処理を実行した場合
>>163 ScreenUpdating = Falseってなんや?
変数の宣言は強制せなあかん。
Application.ScrenUpdating = False
Application.ScrenUpdating = False は無意味だがOption Exolicit書いてないとScrenUpdating = Falseでも動くんだよなw 今回はチラチラする処理じゃないからたまたま気がつかないかも知らんが、チラチラする処理だと「何で?」となる。
質問です。 ブックオープン時に指定フォルダのvalueを 単純にボタンのキャプションに代入して表示させようと思ったんですが、上手くいきません。 オブジェクトが不正だと言われるんですが何故でしょう。 ボタンダウンの機能として全く同じコードを記述すると問題なく動くんですが。。
↑ フォルダじゃなくセルでした。
>>173 ScreenUpdating = False
だと「表示更新を止める」ではなく
ScreenUpdatingというユーザー定義変数に
Falseを代入するって動作になるって話だろ
しかも表示更新は最後の1回のみなので
表示更新止めても1回、止めなくても1回で意味無い
しかも汎用性無さ過ぎで無価値すぎて泣けてくる
上のソースコードです。 Private Sub Workbook_Open() Dim SH As Worksheet Set SH = ThisWorkbook.Worksheets("Sheet2") CommandButton1.Caption = SH.Range(SH.Cells(3, 2), SH.Cells(3, 2)).Value End Sub ThisWorkbook(コード)内に記述しています。 色々調べてはみたんですが、どうしても「CommandButton1.Caption〜」の ところでエラーが出てしまいます。 どうかご教授願います。
バリューじゃなく テキストにしたら
今度は変数が定義されていないと言われまた出来ませんでした。。。
>>178 そのソースまんまコピペして実行したら、エラー出ずにちゃんと設定されたぞ
>>181 一つ書き忘れていました。
sheet1にボタンがあって、
sheet2のセルから文字を読み込みたいんです。
自分はやはり同じくエラーになるんですが。。。
CommandButtonを配置してるシートにコードを書きましょう
>>183 そうするとブックを開いたとき、自動的に読み込まれなくなりません?
モジュールにcaption読み込むコード書いてcallしても同じくエラーでちゃうし・・・
何バカいってるんだw
>>184 すまね、ぜんぜん読んでなかったよ
Worksheets("Sheet1").CommandButton1.Caption = SH.Range〜 に
どのシートにあるボタンかを指定しないと
それはボタンがあるのがsheet1だから
sheet1(コード)に
>>178 をそのまま書けって事ですか?
中にmsgbox追加してみたんですが、動いてないんですが・・・
>>186 ボタンもシートの指定が必要なんですね。。
おかげでやっとうまくいきました。
遅くまでありがとうございます!
>>177 汎用性がどうのこうのって、Unionを使うこと自体がだめだよ。
いくら工夫したってだんだん入れ物を多きくしていくことに変わりはない。
Unionでまとめて処理するより、小分けに処理した方が速ければ何の意味もない。
だいたいUnionが必要な時ってほとんどないだろ?
まともなやつは使わんよ。
的外れな回答ばっかだなw CommandButton1.Caption = SH.Range(SH.Cells(3, 2), SH.Cells(3, 2)).Value なんてのが動くのかよ。 同じセルを指定したとき動くか動かないか試してないが、常識的には CommandButton1.Caption =SH.Cells(3, 2),Value もしB3にアドレスを書いてるのであれば CommandButton1.Caption = SH.Range(SH.Cells(3, 2).Value).Value のどちらかだろ?
すまん
>>190 の1行目は取り消す。
ThisWorkbookにのOpenイベントだったのかよ。
それじゃ当然だめだよな。
久々に来たが初心者ばっかになったのかw
178のように同じセルを指定すると動くみたいだな。 MsgBox Range(Cells(3, 2),Cells(3, 2)).Value で動くには動くけど無駄だから MsgBox Cells(3, 2).Value とするのがjsk
>>193 は相談書でUnionで許容範囲内で出来るとか言ってた馬鹿かも知らん。
Union使わなきゃもっと速く出来るだろ?
可哀相な奴
あの基本が出来てないやつかも知らんねぇ。
なんでこの子の書き込みはこんなに解りやすいんだ?
たとえばオブジェクト変数は値渡しとかな。
止まったなw
自分のこと言われてるのに気付いてないw
203 :
デフォルトの名無しさん :2009/03/11(水) 11:20:37
a
204 :
デフォルトの名無しさん :2009/03/11(水) 11:24:10
現在Sheet1がアクティブのときに、 Sheet2の行3にデータが何列目まで入っているか知りたいのです。 アクティブなシートなら、マクロの記録で Set ws = Worksheets(2) ws.Cells(3, 256).Select Selection.End(xlToLeft).Select col = Selection.Column みたいにして、データが入っている最後の列colを取得できたのですが、 Sheet2をアクティブにせずにやるとエラーします。 どうしたらいいでしょうか?
selectするからエラーがでるんではないの
selectしない書き方。 selectとselectionを削ってつなげると出来上がり。 col = ws.Cells(3, 256).End(xlToLeft).Column
マクロ内で生成したオートシェイプを 右クリックしたときにマクロを起動させることは可能ですか? 左クリックならOnActionプロパティに関数を入力すればOKですが 右クリックやダブルクリックはどうしたら良いのでしょうか?
208 :
デフォルトの名無しさん :2009/03/11(水) 22:13:07
セルに入力されている日付(2009/03/11)を参照して ファイル名(200090311.xls)をつけsheet(2)を移動して保存したいのですがどうすれば良いですか?
>>208 君が書いてることを、日本語ではなくVBA語で書けば良いだけだよ
VBA語(笑)
with ActiveWorkbook .Sheets(2).Move Workbooks(Workbooks.Count).SaveAs .Path & Replace(ActiveCell, "/", "") & ".xls" end with テストしてないから動くかわからん
あ、.Path は .Path & "\" & にしておいてね。 まあ、保存場所は好きなのにしたほうがいいけど。 次のOfficeが出るまで買わないことにしたのでOfficeが手元にない(´・ω・)
213 :
デフォルトの名無しさん :2009/03/12(木) 00:53:59
まずセルに5をいれます その時に他に指定したセルに下一桁増やした5.9とゆう数字をいれたいです また5.5なら5.51とか5.59を他のセルにいれたいです VBA可能でしょうか?またどのようにしたらよいでしょうか?
日本語があやしいね
5.9とゆう
自己流で色々組んでいるのですが、プログラムをユーザーフォームに全て打ち込んでいます。 標準モジュールに打ち込んだ方が良いのでしょうか?
そんなの使い分けだよ 全てを対象に、必ずしもどっちかが良いなんてことは無い あとはクラスも仲間に入れてやれ
219 :
デフォルトの名無しさん :2009/03/12(木) 19:56:41
追加したシートの取得の仕方がわかりません どうやって今作成したばかりのシートを取得したらよいでしょうか?
オブジェクト変数に取得したいってこと? それなら追加するとき取得します。 Set newsheet = WorkSheets.Add 追加したあとで取得は俺には分らん。
221 :
デフォルトの名無しさん :2009/03/12(木) 20:34:32
おお、Setってやらないと入らないんですね ありがとうございます
Setをわざわざ使うのは、Set無しで書いてしまった場合 オブジェクトのデフォルトプロパティへの代入及び呼び出しを意味してしまうから。 他言語から入ってきた人間だと間違いやすいね。
追加したあとでの取得だが、もしシートのCodeNmaeをいじってなきゃ可能だな。 各シートのCodeNameからSheetの部分を削って、数字を数値に変換して一番大きなのがそうだ。
224 :
デフォルトの名無しさん :2009/03/12(木) 22:17:10
VBA は初心者です.いま,Excel の Add-In を作っています. 標準コードモジュールに Function を書くと Public/Private によらず UDF としてプロジェクトの外から参照できてしまうのがうれしくありません. Function を UDF として公開せずに, プロジェクト内だけで visible にする方法はありますか? 理由は,意図しない名前空間の汚染を避けたいからです. Function を ThisWokrbook や Wokrsheet オブジェクト上に置くなど, 論理的な意味が変わってしまうような代替案は NG とさせてください. また,Application.Caller を調べて,VBA プロジェクト内からの呼び出しか, ワークシート関数による呼び出しかを区別して,後者を禁止することは可能ですが, 名前は見えたままという意味では同じことです. なお,Excel のバージョンや OS は特に指定しませんが, できるだけ cross-platform なアプローチが望ましいです.
>>224 マクロの一覧に名前が出ないようにするだけならOption Private Module
完全に使えなくする方法は知らん
質問です。 シートにボタンを設置し、ユーザにはどこかセルにファイル等のパスを入力しておけば、 そのボタンからそのパスのファイルを開けるようにしたくコードを作成しています。 今分からないのが、そのパスにエクセルのファイル以外を入力された場合の回避の仕方です。 現状では、ただのstring型にパスを読み込んで受け渡してます。 一応、dir関数を使い、ファイルの有無は調べてオープンしてます。 また、フォルダとファイルのオープンを指定できるようにしたいんですが、 これも1を指定したらファイル、0はフォルダ、みたくしたいんですが、 この場合も0なのにファイルとかの場合のエラー回避がうまくいきません。 どうかご教授願います。
キモイ句読点に、アホっぽい半英語。 該当する人物像は、・・・釣り?
VBA はnewbieです.now then,Excel の Add-In をcreating. Standard Code Moduleに Function をWrittenすると Public/Private にwithout as UDF としてoutside projectからreferableのがnot good. Function を UDF としてopenせずに, just inside project で visible にするwayはthere exists? because は,not intendedしないnamespaceのpollutionをwanna avoid. Function を ThisWokrbook や Wokrsheet onto Object or, logicalなmeaningがhas changedなようなalternative ideaは NG とnot acceptable. and,Application.Caller をlookup,VBA project内からのinvokeか, by worksheet function invocation かをcut offして,successor を restictすることはpossibleですが, nameはis still visibleというmeaningではsame entirely. you see,Excel のversionや OS はespeciallyにspecifyしませんが, as youcan cross-platform なapproachがwe need.
>>227 >キモイ句読点に、アホっぽい半英語。
どこが?ごく普通に見えるが。
まぁ考えても分からないただ煽るしか出来ない無能なお前は引っ込んでろ。
俺は考えるのはいいがすぐには分からん
おれも>>226のことだと思って「なんだ荒らしか」とおもってたら >>224のことだとわかって納得した
まぁプログラム板で釣りか?とか言ってくるやつは大抵知識もなくそいつが釣り
together しようぜ!
> まぁプログラム板で釣りか?とか言ってくるやつは大抵知識もなくそいつが釣り とか言ってくるやつは大抵バカにされて悔しかった本人
>>226 通常はFileOpenDialogを使用して、ファイルを選択するんじゃない?
それなら、拡張子やOpenエラー等が解決できる気がする。
それ以外ならWin32APIでファイル属性の確認や、
マジックナンバー調べてファイル別の処理とか。
面倒だから極力やらんけど。
煽りが多いようだがガンガレ!
>>234 ありがとうございます。
しかしdialogを使うのは毎回自分でファイルの位置を探したり
選択しなきゃいけなくなりますよね?
その手間を省く為に、一つのシートに開くボタンをいくつかまとめて作って
パスを自分で指定したらそれっきりいつでも開けるようにしたいんです。
>>235 俺ならこーするかな?それしかなくね?
@ユーザー入力部分に制限。不正ファイル指定不可。
Aファイル/フォルダ判断はWin32API。FileSystemObjectでもいけるかな?
まぁ、何かしらの制限を強いるしかないでしょ。多分。
>>236 ちょっと始めたばかりの自分にはレベルが高すぎですかね。。。
ちなみに入力制限は、普通にセルに入力させたいんですが、
それはエクセルに規則制限の設定があるって事ですか?
>>237 シート入力制限(Excel)&入力インターフェースとエラー制限(VBA)だよ。
初心者さんには厳しいかもしれんね・・・
内容見てると、VBAよりも運用で逃げれそうな面が多いので、
Projectに制限がないなら、運用/仕様で逃げるべき。
仕事なのでそれでは〜!
239 :
224 :2009/03/13(金) 16:48:05
自分の知らない言語仕様がもしかしたらあるかもと思い質問しました Ruby の Duck Typing も最初は抵抗がありましたが、 言語の基本理念に合わせれば幸せになれたように、無駄な抵抗はやめて VBA ではグローバルな名前空間で一意の名前を使ったほうがよさそうですね 句読点もここの習慣に合わせることにします 半英語 (笑) は確かに悩みの種ですが、カタカナ語は読みづらいし、 英単語を「てにをは」でつなぐくらいなら全英語のほうがまだましです プログラムを書くときは公開が前提のため、ドキュメントを含め全て英語ですが、 白熱した議論となると英語では正直しんどいんですよね... これまで Microsoft 独自仕様の言語は避けてきたのですが、 表計算 w/ OOP という計算言語モデルは最近面白いかもしれないと思いつつあります Excel (w/o VBA) のみでも stochastic なアルゴリズムを使うことで、 割と複雑な問題でも現実的 (?) な労力と計算時間で解けることは確認しました VBA にも標準で正規表現や SQL パーザなどのライブラリが用意されているようですし 何か面白いことはできないかとくちゃくちゃ遊んでいるところです
いま、独学でVBA勉強しているとこなんだが これを使って将来仕事に生かせるかどうか不安なんだ 書籍見てもどう約竜野かいまいちわからないし この板にいる名人方は経験値豊富そうだから意見を聞きたい 役に立つのか?
はっきり言って全く役に立たない。 手作業では数日がかりでも終わらないデータ集計が 数分で1円の間違いも無くレポートの体裁に整えられるくらいが関の山
通貨、「Excelとハサミは使いよう」だ
>>240 すごく役に立つよ
でもどう役立つのかいまいち分らんなら素質ないかも知れんから
使えるやつを捕まえてうまくおだててやらせるすべを覚えときゃいい
そいつが全部やってくれる
仕事するにあたって便利になるように、小物ツールを作る程度だな
今の管理職にはパソコンの使い方自体覚束ないような人が多い プログラムで効率化したところで、彼らには何をやっているのかすら分からないから 一切評価されない。空いた時間以上に無茶振りされて仕事が増えるだけ そういう意味では役に立たない
246 :
デフォルトの名無しさん :2009/03/13(金) 21:00:12
メインの言語何か別にやってて 必要なとき覚える程度ならいいけど この言語が初めてとか、病気になるよ(笑)
>>246 ABAPとVB6.0しか実務で扱ってないので、転職先が無い・・・
ピボットテーブルがあるのになんでVBAなんか使うの?
249 :
デフォルトの名無しさん :2009/03/13(金) 21:21:57
SAPいいじゃん あとはうまくでっちあげろ
ピボットテーブルでは集計しか出来ないから
この言語ででかいもの組まれると作るのはいいが 引き継ぐ人間のことを考えると涙しかでないな
おれはVBAしか出来ないからどう困るか想像できんのだけど
253 :
デフォルトの名無しさん :2009/03/13(金) 22:27:19
>>252 あって然るべきものがフツーにない場合が多い
のと、シート毎に行数を取って置くのが面倒だからと隅っこに忍ばせた白文字の行数とかIDとかテラウザス
開発者のちょっとしたお茶目がとんでもない殺意を生み出す
さらに別に無駄に出力してるわけではなく
当然客がいじりたおすわけで忍ばせた文字が残っている保証もなければ
忍文字と内容が一致してるわけもなくさらにフォーマットからいって違う可能性もあるしで
仕様やそこに至った経過をしらんとどうしようもないような要素がさらっと入る
バージョン管理ツールも効かないしね
この言語で綺麗に組むって多分目的からズレてんだろうなってフツーに思うけど引き継ぐのは嫌
なるほロケット
そのレベルの奴しか周りにいないなんて可哀相だな
>>238 返事が遅くなりました。
アドバイスありがとうございます。
もうちょっと勉強を進めていきたいと思います。
>>250 Excelなんて集計にしか使わないだろ。
集計なんてAccessでしかやらんが。
別に誰が何やってようと関係どうでもいいことだ くだらない雑談は終わりにしようぜ
ExcelVBAは基本的にCOMコンポーネントだけの言語なので、 COMができる仕事ならExcel VBAでも出来る。 これを集計しかできないとか、レポートにしか使い道が無いというのは…。 俺がよくやっていたのはXMLのパージングと生成やらテストデータの作成。 ほかにも死ぬほどの仕事をExcelVBAに叩き込んだ。 たぶん今やってるプロジェクトの数パーセントは俺のマクロだより。 EmacsやPerlと心中するような奴でもExcel VBA覚えるべき。 ExcelVBAはWindowsの糊言語だよ。
やだなぁなんも蓄積してかないし vbaはあくまでもメインのプログラムとの橋渡しだけにしたいなぁ バージョン管理も効かないし 作ったはいいけどエクセルデータ触るたびにvbaも修正が必要とかなりそう
全部思いこみだねえ
ていうか、集計やレポートの作成以上難しいことをやったらいかんよ できるできないは別として
262みたいな子って、結構居るよ。 組込マクロ言語から入って単独開発言語を囓り始めた時期に こういう症状が出ることがある。 基礎が出来てりゃあんなバカな発想はしないんだけどな。
266 :
デフォルトの名無しさん :2009/03/14(土) 06:34:13
基礎云々じゃなくて作るだけの人と保守までしなきゃならない人との違いだろ
基礎が出来てないから、VBAの保守ごときで右往左往してしまう件
集計するならピボットもVBAもイラン いまのとこ数式で事足りてる
やたらとセルにどっからでもアクセスできるからソースはクソになりがちではある
とあるExcelで作られたシステムを引き継いだんだけど これってVBで作ったほうがよくね?って思ってる。 なぜExcelで作ったのかなぞだ。
この話題が出てるときに、このあからさまなネタw
この話題だから書いただけなのに
で?
<font size="2">
そんなにExcelがすきなの?
すべてvbaで作って自分しか保守れないようにするんだ
</font>
>>262 プログラムを書いたことが無いのかもしれないが、
入出力が変わったら、どんな言語ツールでもプログラムを書き換えるだろ。
280 :
デフォルトの名無しさん :2009/03/14(土) 15:27:06
マクロって隠すことできるんですか? たくさんマクロが組まれてそうなファイルを手に入れて 分析したいのですが、標準モジュールには簡単なマクロしか 入ってません。 フォームのボタンらしきもので色々動くファイルなのですが ボタン自体が保護されているような状態。
281 :
デフォルトの名無しさん :2009/03/14(土) 15:30:39
デザインモードでアクセスできました すみません。
俺はRDBをExcelにDumpingして、VBSの正規表現を使って仕事してる。 どんな会社でも、どんな業種でもExcelファイルなら開けるってシェアの大きさは有利だよ。 シェア率って、本当に大切だよ。
COMのVBScript.RegExpのことじゃないの?
285 :
デフォルトの名無しさん :2009/03/14(土) 19:27:11
質問ですー VBEの画面でOと0の見分けがつかんの何とかならんですか?
フォントは自由に選べますよ
>>285 プロポーショナルフォントじゃ無くせばOK。
例)Pゴシック→ゴシック って意味ね。
区別できるフォントを捜して設定すればいいんですね 週明けに早速試してみますありがとうございます
Range("A" & i)
質問です。 指定した1秒未満の短い時間(0.5秒など)だけマクロを停止させたいと考えています。 Application.Wait メソッドなどでは最短でも1秒は停止しなければならないようですが これは可能なのでしょうか?
APIでSleep()がGetTickCount()定義して処理する
基本的なことだが、VBAとVB6はほぼ同じ。 グーグルでVB6をつけて検索すれば大抵のことは解決する。 初心者さんはまずVB6で検索してくれ。
>>291 Sleepを使う事で解決できました。ありがとうございます。
Application.Wait [NOW()+"0:00:00.1"]
WaitやOnTimeは、1秒未満を指定してもエラーにはならないけど 1秒単位に丸めて処理されるから意味無いよ Application.Wait [NOW()+"0:00:00.1"] Application.Wait Now() は同じで Application.Wait [NOW()+"0:00:00.6"] Application.Wait [NOW()+"0:00:01"] も同じ
うそ、仕様が変わったのか?
Sub a() t1 = Timer Application.Wait [NOW()+"0:00:00.1"] Debug.Print Timer - t1 End Sub 0.1103516 0.1000977
確か丸めは環境依存だったような。 確実な方法では無いから普通は使わないけど。
これが環境依存とは聞いたことないな。 みんな普通に使ってるようだけど。
>>297 やってみたら
97%くらいは
0
3%くらいが
0.015625
だった
Waitやってるやつ環境くらい書けば? XP, Excel2000,はOK
302 :
デフォルトの名無しさん :2009/03/15(日) 13:38:34
これさ ミリ秒単位ってほぼとれてなくない? 数字の上でどうでてようととれるもんはめちゃくちゃなんだけど? 0ms5msって交互にとれるけどホントか?これ?(笑)
今やってるのは100ミリ秒だろ
Application.Wait [NOW()+"0:00:00.1"] は、うちでも0.1秒前後になるけど、WinAPIのSleepと比べるとものすごくばらつきが大きい。 Sleepだと100回やって100〜104msと100ms未満になることは無かったし超過も僅かだが Application.Waitは80ms台が数回出たし、超過誤差もSleepの10倍以上。 処理上、僅かな超過が出るのは仕方のないことだし、それは環境にも依存することだが その超過量が同条件でのSleepより遙かに大きかったり、指定未満になったりするのは 明らかにApplication.Waitの欠陥で、1秒未満の処理がまともに出来ているとは言いがたい結果だな。 因みに環境はWinXP/Excel2003
>>304 Application.Wait [NOW()+"0:00:00.25"]
だとどう?
>>304 あるいは、
Application.Wait [NOW()+"0:00:00.0625"]
とか
>>297 はXPSP3 Excel2007
10ミリ秒の精度が必要か?
所詮、いくらSleepの精度が高くてもCPUやメモリなどの競合で
処理の遅延することは避けられないし
まあ、そもそも
>>290 がどんな要件に使うのかすら、オレには想像つかない。
そうか?
>>290 は1秒じゃ長いから0.5秒くらいで待ちたいと言ってんだろ?
そのときに0.01秒の誤差なんか気にするか?
0.1秒の誤差も気にならないかも
俺はそんなもの測れると思ってないけどね 長年ゲームアプリ作ってきた勘 テキトーな間隔でテキトーに止まるとは思うけど 数秒に数回成功するって目安だな
そうか? 1秒で待つか0.5秒で待つかで実際やってみると体感的に違うけどな
VB6のSleep() APIでも数ミリ秒の誤差はある VB系でミリ秒気にするのは病みすぎ スレッド使える他言語でやれよ (ActiveX使えとかWindowsじゃ無理とか言うなよw)
お前ら、よく知らんことには口出すな
314 :
デフォルトの名無しさん :2009/03/15(日) 19:19:44
教えてください。 上位のコンボボックスの選択しだいで、下位のコンボボックスが空の場合も、値が入っている場合もあります。下位のコンボボックスに値が入っている場合のみ実行したいコードがあるのですが、条件式としてはどのように記述すればいいのでしょうか? お願いします。
なんらかのトリガ時に両方見ればいくね?
316 :
314 :2009/03/15(日) 19:32:44
>315 ごめんなさい。よく分かりません。
ボタンかなんか押してプログラムが動くんだろ? だったら、ボタン押した時に2つのボックスの中身を見て判断すれば良いんじゃねーの? この内容が分からないんなら、コンボボックスの使い方を説明してるHP見たほうが早い。
>>314 上位のコンボボックスの選択されている値をみればいいんじゃないかな
下位のコンボボックスに値をセットしたり空にしたりする処理があるんだから、
そのための判定式がその処理のとこにあるだろう
320 :
314 :2009/03/15(日) 22:45:03
>319さんへ わざわざ親切にありがとうございました。 私の説明が悪かったのですが、「下位のコンボボックスが空」とういうのは、「ボックスに何も 表示されていない状態」のことではなく、「ボックスに何も表示されていないし、ボックス中に 何の選択肢もない状態」のことなんです。上位に対応する下位がない場合、ボックスを空に しているのです。「ComboBox2.Text <> ""」という記述は前者のようです。 もしよかったらまた教えてください。
>>320 どちらにしろTextが空なんだからそのIfでOKだろ?
嫌ならListCountで項目数判定汁
322 :
314 :2009/03/15(日) 23:02:24
ListCountでできました。 ありがとうございました。 じぶんなりによく考えて、よく調べたつもりだったんですが・・・ まだまだ初心者の域を抜け出せてないようです。
>>314 ユーザー入力でCombo Textの空文字判定が曖昧になること心配しているなら、
ComboをReadOnlyにするという方法もある。
まあ頑張って下さい。
324 :
デフォルトの名無しさん :2009/03/18(水) 22:02:18
2007 xlsm vista 今まで(2003 xpでは)正当に動いていたマクロが機能していません。 どのように修正したらいいものかさっぱりの状態ですので、教えてください。 よろしく。 sub モジ() Aマクロ Bマクロ Cマクロ end sub で、Aマクロの中にapplication.run "dataweb" があるのですが、 webデータ取得(を全くすることなく)前に、 Bマクロにさっさといってしまいます。
ブックごとうpしろ 出来ないなら帰れ
326 :
324 :2009/03/19(木) 00:57:50
ブックごとのアップはできません、悪しからず。 調べる端緒がほしいので、よろしく。 2003で同期だったものが、2007では非同期になってしまうということです。 そうゆうことはあり得るのでしょうか?
>>326 Bマクロでブレイクすれば、データが取れるの?
328 :
324 :2009/03/19(木) 01:46:10
Bマクロでブレイクして、データ取得はできます。 なお、Aマクロ単独での動きは、2003及び2003互換モードで正常ですが、 2007ではやはり、勝手に先に動きます。
Call
>>326 それは同じマシンでもそうなるの?
2007から複数コアCPUがサポートされてるから、そうなる可能性はあるとは思うが
関係ないかもしれないが、一度マルチスレッド計算のオプションはずして試してみては?
331 :
324 :2009/03/19(木) 10:51:06
>>330 サンクス。
2007 XP機で試してみました。ちゃんと正常に動いたことから、
VISTA機でのみ正常に、動作していないことになります。
マルチスレッド計算のオプション外しもやってみましたが、変わり無しです。
なお、VISTA機ではmsgboxだけなら止まるのですが、msgboxの次にendがあったりすると
msgboxは流れています。
inputメソッドも止めることなく、流れていってます。
この症状は、Aマクロの中でも、Bマクロの中でも同様に起こっています。
332 :
324 :2009/03/19(木) 10:55:03
>>329 Callは書いても書かなくても一緒でした。
333 :
デフォルトの名無しさん :2009/03/19(木) 11:23:15
procedureの呼び方ですが、 「プロシージャ」と「プロシジャー」 どちらが一般的なのでしょうか。
334 :
デフォルトの名無しさん :2009/03/19(木) 11:30:57
プロシージャ
prэsi':dзэ(r)
336 :
デフォルトの名無しさん :2009/03/19(木) 15:41:11
手続き と日本語で解釈b
>>331 msgboxは流れる ってのがよくわからんが、msgboxでok押す前に次の行が実行されてるってことか?
簡単に試したがうちではそうならないし、現象が発生する最低限のコード晒して見たら
質問です。 userFormのTextBoxsに09と入れ、セルに入力すると9になります。 変数(string)代入しても、上手くいきません。 どうしたらいいでしょう? 対象セルの書式設定も文字列にしています。
' を頭に結合させてみてはいかがかな。 cells(1,1).value = "'" & textbox.value のように。
>>339 上手くいきました!
ありがとうございます!
>>338 対象セルの表示形式が文字列になってれば、おれんとこじゃ09になるけど?
>>324 あんたの質問内容ってこう見えるよ。何を答えろと・・・
今、車で走ってて道に迷いました。今まで普通に走ってきた道ですが・・・
どうしたらいいでしょう。よろしく。
出発点
ルートA、ルートB、ルートC
到着点
ルートAに看板があるのですが、暗くて分かりません。
Q そもそもどこ走ってる?A 言えません
Q 地図ねーの? A 今までの地図と違うみたいです
Q 誰か近くにいねーの?A 止まってくれません・・・
コード晒す気がないみたいだから答えてほくないんだろ もしくは荒らし
やっぱりそうだよね。真剣に考えて損したよ。
一応、エスパースレいってみれば?
>>324
>>338 文字列変換用関数というのもある。こっちの方が便利かと
string str = Format$(123, "00000")
346 :
デフォルトの名無しさん :2009/03/20(金) 19:39:25
リアルタイム処理を考慮されてない言語で無理矢理ゲームを作るのは 趣味としてやるには面白いかもしれないけど実用性は低い
ミニゲーム系はFlashの独壇場。 Excelでやる必要性はない。
はぁそうですか
Excel VBAしか知らないから 俺には丁度いいかも
VBAで出来ない事じゃないし、やってる人もいるけどさ・・・。 それはあくまで ”出来る” であって、向いてる訳じゃないのよ。 例えば、アクションゲームならばFPSって概念を持ってるFlash(ActionScript)で作った方がいいよね。 衝突判定の関数をVBAで組むならば、ASにはその物ズバリの関数が既にある訳。シェイプが接触したいるかどうかをbooleanで返す。 Flashはドローツールから派生してるんで、シェイプを扱う能力が超高い。現状だと最高峰。 MovieClipって形で、duplicate、attack、色んな複製をしつつ、それら全てにプログラムを組みこむ事も出来る。 リアルタイムで動くタイムラインを、全てのシェイプが保持出来る訳で、ゲームには凄く向いてる。 決してVBAがダメと言ってる訳じゃないよ。VBAが光る分野は別の所。 向き不向きがあるから、それに則る方が良いかも。と言う観点で。
だいたいなんらかのプログラムが組めるなら別の言語なんて習得に1週間かかんねぇだろ やらないで怖がってるだけの奴は馬鹿 なんでもかんでもVBAでやろうとすんな
Flash厨うぜえぞ
354 :
デフォルトの名無しさん :2009/03/21(土) 13:18:32
「セルをドットに見立ててゲームをつくる」とかすごすぎw なに? >ワークシート上のセルを方眼紙のように正方形にしてどっとに見立てて、ワークシートを >縮小して表示することで、グラフィックを表現する手法で、セルの1つ1つの背景色が >そのままドットの色になります。 って
attachですた。
attach No.1・・・って、違うか?!
オートシェイプをスプライトに見立てて作ったゲームってのも あってもよさそうだが見たことがない。 みんなワークシートにドット絵を描きたがるのはなんでだろう。
>>357 座標関係じゃね?セル位置のほうが初心者には直感的。
もしくは、オブジェのNewとか、オブジェクトの一意のID指定がメンドイとか。
個人的には、VBAで2Dゲームは初心者に向いてると思う。
描画の基礎は勉強できるでしょ。
>>352 スレチだが言語によると思うぞ。俺はVC/JAVA屋でC#に四苦八苦。
さらにDirectXなんかは思想の理解にてこずるし。
まあ、言語というよりはフレームワークの問題だが・・・
あと、半月くらいVB系触らないと構文殆ど忘れるしw
>>354 アラン・ケイの本に、セルを使って棒グラフを表現する例が載っていたから、
画期的なアイデアと言うほどではないな。
すいません。次のことをしたいのですが、簡単だと思ったのですが、 出来なく困っています。 最初にB列の任意のセルを一つ選び、 その選んだB列のセルに、常にR24のセルをコピーし 貼り付けたいのですが、色々やりましたが出来ません。 例えば、 セルB28を選び、マクロを実行したらR24をコピーし同じくB28に貼り付ける。 セルB30を選び、マクロを実行したらR24をコピーし同じくB30に貼り付ける。 セルB77を選び、マクロを実行したらR24をコピーし同じくB77に貼り付ける。 たったこれだけのことですが、このマクロの部分が相対参照にしても出来ません。 識者の方宜しくお願い致します。 なお EXCEL;ver2000 OS:win2000 VBA;多少使えます。 宜しくお願い致します。
ActiveCell = Range("R24") > VBA;多少使えます。 それはないだろ…
lol
デフォルトプロパティを省くな
>>362 有難うございます。しかし調べ、いろいろ試し下記のコードを作成したのですが・・・
ActiveCell = Range("R24").Copy
ActiveCell.Offset(30, -2).Range("A1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
End Sub
↑出来ませんでした。R24だと手間が掛かってしまうと思うので、
任意のB列のセルにセルA1の値をコピーし貼り付ける。
という例で結構ですからコードをお願いできないでしょうか?
例えば、
セルB5を選び、マクロを実行したらA1をコピーし同じくB5に貼り付ける。
たったこれだけで良いです。宜しくお願い致します。
cell(2,5).value = cell(1,1).value cell(2,5).interior.colorindex = RGB(255,255,255) こんな感じだった気がする
>>366 cell → cells
colorindex → color
セル情報全部コピーしたいって前提なら、↓で良いと思うがね。 Sub test() Cells(1, 1).Copy ActiveCell End Sub
「R24だと手間」があったからValueにしてみた 色は関係ないのか。斜め読みスマソ
>>365 VBAがまったくわかってないようなんで、ヒントじゃなくて完成したマクロを書いといてやる。
Sub Macro1()
ActiveCell = Range("R24")
End Sub
371 :
365 :2009/03/22(日) 17:16:18
皆様本当に有難うございます。 只今仕事からかえってきました。んでまた仕事ですorz。 報告は後ほどさせて頂きます。
>>370 プロパティを省略するな。と何回言わせるのだ・・・。
373 :
デフォルトの名無しさん :2009/03/22(日) 21:30:20
openのメソッドを勉強中ですが、 「updatelinks」引数の説明の中で、 「リモート参照」と「外部参照」という2つの言葉が出てきました。 「リモート参照」「外部参照」とはどういう意味ですか? ググってみても出てきませんでした (T_T;)。
>>372 ケチつけてるヒマがあったら正解を示せ。と何回言わせるのだ・・・。
375 :
デフォルトの名無しさん :2009/03/22(日) 22:54:11
Sub test() selection.value=range("A1").value End sub A1の値を今選択しているセルの値に
376 :
デフォルトの名無しさん :2009/03/22(日) 23:03:17
↑あ、説明間違った。 今選択しているセルにA1の値を入れると。 ちなみにこの場合はActivecellよりselectionの方がいいと思うよ。
>>374 え、付けるべきプロパティが解らないの?
コードが根本的に間違っていると言ってるわけじゃないのに
それでも「正解を示せ」と言うからには、それくらいしか思いつかない…
378 :
365 :2009/03/22(日) 23:33:25
365です。
あれから
>>370 さんのコードをそのまま頂いたら、
出来ました!!!
>>370 さん本当に感謝です。
コードまでそのまま書いてくださり大変助かりました。
しかしこんな簡単なコードで出来るとは、
拍子抜けです。
勉強不足を感じました(汗。感謝。
>>366 さん
>>368 さん
わざわざ有難うございます。
どうやら私の説明が悪く、
何をしたいのか正確に伝えれなかったみたいです。
アドバイスいただきましたが、
それとはちょっと違いました。
ですが親切に本当に有難うございました。
ではお騒がせしました(ぺこり
おれが即座に
>>362 でレスしたのはスルーだったわけだ
381 :
365 :2009/03/23(月) 00:07:42
>>380 いえ、
>>365 の最初
ActiveCell = Range("R24").Copy
で使わせてもらいました。
>>362 さん=
>>370 さん
だと思っていたのですが・・・。
最初に回答を頂いていたようで有難うございます。
しかし、これは「ヒント」だと思ったので、
>>365 のような長居コードになってしまいました。
>>377 なんか本気で自覚がなさそうだから親切に教えてあげるけど、
デフォルトのプロパティがどうとか正解が知りたいんじゃなくて
「煽りがウザイ」って遠回しに言ってるんだと思うぞ。
プログラマーの精神年齢が低いのは世界共通の現象らしく、
とある海外のプログラミングの入門書にも
「まず大人になれ」みたいに書いてあって吹いたわ。
383 :
デフォルトの名無しさん :2009/03/23(月) 00:10:19
プロパティの重要度も分かってない奴が適当な回答して悦に浸るのは間違ってる。
>>365 ではコピペしようと試みてるのに、destination使ってコピしてる
>>368 のコードは違うと言いきってるし。
どういうこっちゃ。
だいたいから、なんで .value を省略する馬鹿が多いんだ?
プロパティ省略なんて百害あって一利無しだ。
可読性もひったくれもあったもんじゃない。
なんでマジになってるの?
まあ今の時点でValueやらTextやら書いてもどうせ意味分からんだろうし 省略してることで壁に当たったとき、もう一度勉強しなおせばいいさ
プロパティの呼び方も分かってない奴がプログラマーとか笑わせるなよw マジで。
> 百害あって一利無しだ。 コードが短くなるという利があるでしょ
皮肉や嫌みが通じないのは、目の前のコードを100%文法通りに解釈する訓練を受けた弊害だな
プロパティは知らなくても俺には関係ないが、それなら copyメソッドを勧めるべきだろ。
>>387 横から突っ込むけど
それって利点なのか?w
必要なことを表現してない短縮って百害あ(ry・・・以下ループ
古いバージョンのVBAだとRange( )よりRange( ).Valueのがかなり高速だったんだけど、 今のバージョンでは差が出ないんだよな。 当のMSもデフォルトプロパティの省略は推奨してないんだけど、言うことを聞かない 日曜プログラマが多いから仕様を変更したんかな。
一般論として、変に省略すると、うっかり複数のセルが選択された状態でマクロを呼んだら エラーになったり関係ない周囲のセルを書き換えたりすることがあるから もうちょっと丁寧にコーディングした方がいいと思う。
右辺を省略すると誤作動起こす可能性があるぞ。
xp 2003のADODB.Streamに関する質問です shift-jisで読み込んだファイルをutf-8に変換して バイナリモードにして.Wirteした後にさらにバイナリデータを追記したいのですが .Write bytData .Write chr(10) とすると'実行時エラー3001'になってしまいます。 どうかご教示よろしくお願いいたします。 With SecondObj .Position = 0 .Type = adTypeBinary .Position = 3 '先頭から削除する文字数 bytData = .read .Write bytData .Write 追加したい文字列 .SaveToFile saveFile, adSaveCreateOverWrite .Close End With
Write バイト配列
すいません。 シートにプリントスクリーンで貼り付けた写真や図やらがあるのですが、 定期的に全て削除したいのですが、 VBAでやりたいと思います。 調べたのですが分かりませんでした。 識者の方、ご教授お願い致します。 なおexcel=2000 OS=2000 でう。宜しくお願い致します。
どう調べて、どこが分からなかったのか? まずはそれをそっとささやいて欲しい
>>397 すいませんでした。
ネットと手持ちの本で調べたのですがのっていません。
自分でやったら、
数式
データ
書式設定
これらは削除できるのですが、
プリントスクリーンの画像だけは残ってしまいます。
>>398 なんかシートごと消した方がいいような感じの発言ですね
でも一応
For Each shp In ActiveSheet.Shapes
shp.Delete
Next shp
でアクティブなシートのシェイプが全部消えるよ
>>399 有難うございます!!!
今やったら出来ました。
大感激です!!!!!
本当に有難うございました!
>シートにプリントスクリーンで貼り付けた写真や図やらがあるのですが、 >定期的に全て削除したいのですが、 興味本位だけどどういう使い方してんの?
402 :
デフォルトの名無しさん :2009/03/23(月) 23:54:03
すみません初歩的な質問なんですが オートフィルタで抽出した可視セルの値を配列変数に代入したのですが うまくいきません。 Sub test() Dim atai() As Variant Dim gyo() As intger Sheets(1).Range("A1").AutoFilter 3, ">0" ReDim atai(0), gyo(0) atai(0) = Sheets(1).Range("A2", Range("A2").End(xlDown)).SpecialCells(xlCellTypeVisible).Value gyo(0) = Sheets(1).Range("A2", Range("A2").End(xlDown)).SpecialCells(xlCellTypeVisible).Count Sheets(2).Range("A2", "A" & gyo(0)).Value = atai(0) End Sub 上記のコードではうまく配列に値を代入できません。 どなたかご教授願います。
>>402 おかしな部分が多すぎて、どこから教えたらいいのか…
自分で考えながら作るのもいいけど、まずはマクロの記録やってみ?
無駄がないように手順を良く考えてから、余計なキーを押さないよう、
余計な場所をクリックしないよう、慎重に操作しながら記録してみて、
それでもできあがったマクロは無駄が多いから、
それを自分で修正していくのがいいと思う。
404 :
デフォルトの名無しさん :2009/03/24(火) 00:50:11
↑自動記録でどうやって配列変数に値を代入するの?
>>401 株です。
ライトカッターって言うソフトで下部のチャートを切り取って、
それで明日の作戦を立てるのですが、
一週間もすると莫大なページを消費してなにが何だかになるので、
今回のVBAが必要になりました。
オートフィルタに1件もひっかからなかった場合を考慮してないから注意な Sub test() Dim atai() As Variant Dim gyo As Long Dim i As Long Dim R As Range Sheets(1).Activate Range("A1").AutoFilter Field:=1, Criteria1:=">0" Set R = Range("A2", Range("A" & Rows().Count).End(xlUp)) gyo = R.SpecialCells(xlCellTypeVisible).Count ReDim atai(gyo - 1) i = 0 For Each C In R.SpecialCells(xlCellTypeVisible) atai(i) = C.Value i = i + 1 Next R.Copy Destination:=Sheets(2).Range("A1") End Sub
>>404 少なくとも最初のエラーはマクロの記録で解決するはず
自分で直せる部分は自力でやらせる方針なんで
408 :
デフォルトの名無しさん :2009/03/24(火) 02:08:30
質問です。 エクセル2003を使ってグラフの散布図作成するマクロを作っているのですが データの範囲に変数使用する方法が分かりません。 マクロの記録で Charts.Add ActiveChart.ChartType = xlXYScatter ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("J4") ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R1C3:R300C3" ActiveChart.SeriesCollection(1).Values = "=Sheet1!R1C1:R300C1" ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1" これを作成したあと、グラフの読み込む範囲が今300なのに対して ここの300を変数に格納した数値を利用して変化させたいのです。 ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R1C3:R300C3" ActiveChart.SeriesCollection(1).Values = "=Sheet1!R1C1:R300C1" ここにどのように変数を絡めたらいいのでしょうか。 変数には、行の一番最後を記録しています。 宜しくお願いします。
>>408 gyou = 300
ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R1C3:R" & gyou & "C3"
ActiveChart.SeriesCollection(1).Values = "=Sheet1!R1C1:R" & gyou & "C1"
とか
410 :
408 :2009/03/24(火) 02:24:39
>>409 ありがとうございます。
その&の前後の半角スペースが必須なのですね…。
そのやり方を試していたんですが、やっと解決しました。
本当に助かりました!!!
スペースの有無で&記号の意味が変わるのってVBの最大の欠点だよな。 誰でも一度ははまったことあるはず。
412 :
デフォルトの名無しさん :2009/03/24(火) 07:47:15
c言語より後にできたくせにc言語より駄目な言語ばっかりで凹むよね
VBSのRegExpをユーザー定義関数としてADDIN化するとか、 Excelの機能自体を拡張出来るスクリプトとしては優秀だな。 ワークシート関数で、リアルタイムで正規表現使えるのは便利だYo! 使ってる人多いから、ADDIN、ADDONもネットで簡単に拾えるし楽ちん。
質問です。 forをつかってstr(i)に繰り返しデータを入れるようにして、 複数のボタンのキャプションを設定したいと考えてます。 bt1、bt2、bt3…と一部の数字だけ違うのですが、 上手くループで処理する方法はありますでしょうか。
ありがとうございます! 後、追加で知りたいんですが、 空のセルをstring型に取り込むと、空のままだと思うんですが、 それをcase文で判定するには、nullや””じゃうまくいきません。 セルが空の時は何かまた違う値が入るんでしょか?
セルの初期値はEmpty(定数:vbEmpty)だけど、Emptyなら「Case ""」にマッチするはずだし String型変数にEmptyを代入するとNullStringに変換されるので、尚更「Case ""」で問題ない。 因みにNullString(定数:vbNullString)は""と同義ね。 「Case ""」にマッチしないなら、セルが空ではない可能性が高いと思う。 Debug.Print Len(変数) 若しくは Debug.Print Len(セル) で、0になるか確認してみそ。0じゃなかったら空セルじゃないってこった。
>>417 ありがとうございます。
一応、msgboxで確認してました。
今よくよく考えたら、""ではなく、" "にしちゃってたかも知れないです^^;
もうアドバイスを踏まえ、もう一度試してみます!
ちょっと色々やってみたんですが、controlsを使うものがうまくいきません。。。 Controls("CommandButton" & "i").Caption = "test" というのを、ソースに直接書いても動かないんでしょうか? Me. Controls("CommandButton" & "i").Caption = "test" にしても動きません。 ネットで探してみても、Moduleに書け的な事もありますが、 Public Sub chg(ByVal i As Integer) End Sub の間に書いて、callしても動きません。 どこがいけないでしょうか?
変数「 i 」が「 1 」だとして Controls("CommandButton" & "i") だと、ボタン名は CommandButtoni だぞ。 CommandButton1 なら Controls("CommandButton" & "i") ではなく Controls("CommandButton" & i) だ。 こういうのもMsgBoxやDebug.Printで MsgBox "CommandButton" & "i" などを確認すればすぐに解ることなので、そういう問題起きたら 動かねーって騒ぐ前に初歩的な確認を行う癖を付けようぜ。
すいません。 書き間違えました。 ソースはしっかりiのみで、””で囲んではないです;;
Me. Controls ↑このスペースはNGだ。 これも書き間違いなら Me.CommandButton1.Caption = "test" が動くか試せ。
ソースはコピペしろ 書き間違いがなくなるし早いだろ
すいません。セルを選択して、選択したところから左側のセルに、 「時刻」「日付」をそれぞれセルに書き込むコードを書いたのです。 該当部分のコードは なのですが、そうしたら、時刻しか現れず、日付が出ません。 あれこれやって見て分かったのですが、 時刻と日付の順序を反対にすると ActiveCell.Offset(0, -13).Range("A1").Select Selection.Value = Date ActiveCell.Offset(0, -14).Range("A1").Select Selection.Value = Time こうすると、日付は出るものの、今度は時刻が現れません。 色々試行錯誤をしたのですが、なぜか分からず困っています。 識者の方、何卒ご教授お願い致します。 なお、 excel:2000 OS;win2000です。 宜しくお願い致します。
426 :
424 :2009/03/26(木) 09:33:52
>>424 です。コードが一部抜けてました。
>>424 は破棄し、
丸々訂正させてください。丸々1から書き直すと下記になります。
すいません。セルを選択して、選択したところから左側のセルに、
「時刻」「日付」をそれぞれセルに書き込むコードを書いたのです。
該当部分のコードは
ActiveCell.Offset(0, -14).Range("A1").Select
Selection.Value = Time
ActiveCell.Offset(0, -13).Range("A1").Select
Selection.Value = Date
なのですが、そうしたら、時刻しか現れず、日付が出ません。
あれこれやって見て分かったのですが、
コードの時刻と日付の順序を反対にすると
ActiveCell.Offset(0, -13).Range("A1").Select
Selection.Value = Date
ActiveCell.Offset(0, -14).Range("A1").Select
Selection.Value = Time
こうすると、日付は出るものの、今度は時刻が現れません。
色々試行錯誤をしたのですが、なぜか分からず困っています。
識者の方、何卒ご教授お願い致します。
なお、
excel:2000
OS;win2000です。
宜しくお願い致します。
あのさ、そのコードだと日付と時刻のセルの間が12〜13列空くってことは解ってるか? 間違っても日付と時刻が隣同士にはならないぞ。 とりあえずエスパーすると ActiveCell.Offset(0, -14).Range("A1").Value = Time ActiveCell.Offset(0, -13).Range("A1").Value = Date で良いんじゃないかと思うのだが。
428 :
424 :2009/03/26(木) 09:58:12
>>427 有難うございます!!!あっけなく出来ました。
感謝です。
しかし、
>そのコードだと日付と時刻のセルの間が12〜13列空くってことは解ってるか?
これは分かってますが、
>間違っても日付と時刻が隣同士にはならないぞ。
え?これがなぜだかサッパリ分かりません。
少なくとも隣り合うと思うのですが。
>>426 でも
(0,-14)(0,-13)
と位置を指定したのですから、-14の次の数字は-13ですから、
少なくとも隣り合うと思っていたのですが。。。
一応本は読みました。
私のコードのどこがいけないのか、
もう少しご指摘願えないでしょうか。
429 :
424 :2009/03/26(木) 09:59:37
>>425 有難うございます。しかしそれではなかったです。
offsetで - の値を使うときは用心すべし。 どうしても使うならば、 if activecell.columns < 13 then を挟むとかしてエラー回避しないと、何ともお粗末になってしまうよ。
if activecell.columns < 13 then
↓
if activecell.column < 13 then に訂正。
>>429 ActiveCell.Offset(0, -13).Range("A1").Select
Selection.Value = Date
ActiveCell.Offset(0, -14).Range("A1").Select
Selection.Value = Time
activecell.column が100で開始したとき、
offset(0,-13) で、87 を "select" してるでしょ。
んで、次に offset(0,-14) を "select” してるから、73に書かれる。
select したら activecellの場所変わるでそ。
432 :
424 :2009/03/26(木) 10:14:10
>>430 >>431 431さんご親切に有難うございます。
>select したら activecellの場所変わるでそ。
そういうことか!!!と思いました。
ご指摘頂きやっと意味が分かりました。
>>431 のご説明は、間違えたコードの下にメモとしてコーピーさせて頂きます。
勉強不足を感じました。
本当に有難うございました。
Controls("CommandButton" & i)でもやはり動きません… subかfunctionがないと言われます。 またMeなどつけてもオブジェクトがおかしいと言われます。 何か宣言しないといけないとかありますか?
>>433 Controlsはフォーム上のコンポーネントにしか使えない。
ワークシートに貼り付けたボタンの場合はControlsじゃなくて
Worksheets("Sheet1").OLEObjects("CommandButton" & i).Object.Caption = "test"
>>433 >>414 ではコマンドボタンのオブジェクト名が bt1、bt2…だけど、実際のオブジェクト名は?
エラーメッセージが「Sub または Function が定義されていません。」なら
>>434 で正解の可能性が高い。
質問するときはエラーメッセージを1文字も間違えずにそのまま書くのが基本だよ。
たとえ意味が通じても、勝手に略しちゃだめ。悪い例→「subかfunctionがない」
それにメッセージをそのまま検索すればたいてい解決方法が見つかる。
質問です。 ブックオープン時に、publicのstringに セルを読み込んでいます。 最初のうちはうまい事その中身を使えるんですが、 ずっとブックを開いたままにしていると、 気が付いたら変数の中身が変わってるのか、 消えるのか分かりませんが、最初の状態ではなくなってしまいます。 変数に値を入れたものを ずっと保持しておく事はできないんでしょうか?
>>434 >>436 ありがとうございます!
ご教授頂いた記述でうまくいきました。
>>435 携帯から書き込んでいて面倒だったので省きましたが、実際は普通にCommandButton1です。
>>437 Option Explicitは書いてある?
>>439 書いてないです。
それを書けば延々保持され続けるんでしょうか?
モジュールレベル変数の値は ・任意に代入、初期化 ・モジュール内編集 しない限りは保持される。 誤って気付かない内に初期化するコードを書いてる可能性が無いのに不意に初期化されてるなら、 「モジュール内編集」に因るものの可能性が高い。 「モジュール内編集」とは、モジュールレベルの宣言部(Public xxx As Stringとか書いてるところ) を書き替えるとか、新しいプロシージャを作成・削除するとか(既存のプロシージャ内の編集は非該当) デザインモードを使用するとかね。 「モジュール内編集」を行ったらモジュールレベル変数が初期化されるのは当然のことでそれはどうしようも無い。
まぁ、それ以外にも初期化されることがあるんだけどな
例えば?
あー、そのページで、「モジュール内編集」以外が何なのか明記しておいた方がいいか。 ・プロジェクトの構造の変更 ・コンパイルエラーの発生 ・コントロールを削除して [元に戻す] を実行する ちなみに、そのほかにも初期化されることが経験上あった。 いずれにせよ「何もしてないつもりでも、変数が初期化されることはありうる」という前提で プログラミングすべきで、意図しない初期化が困る場合は、シートに値を保存するなどを しておく必要がある。
あー、さらに追加。 「そのほかにも」の内容は、「なにもしてないつもり」だったので、何なのかは具体的にはわからない。
へー
staticでも無力ですがな
モジュールレベルの変数が初期化されるとき つまりモジュールが初期化されるときは モジュールレベルのプロシージャも初期化され プロシージャレベルで保持されるStatic変数も プロシージャの初期化に伴い当然初期化される
ななめ読みしてレスで悪いんだけど、非表示シートに書き込んでおけば?
すいません。 もし選択したセルがA1であれば、B1の値を7にする。 というのは何とかできました。 If ActiveCell = Range("A1") Then Range("B1").Value = 7 End If これと似たように もし選択したセルがA1からA10のいずれかであれば、B1の値を7にする。 というのが出来ず困っています。一応下記のようにしましたが If ActiveCell = Range("A1:A10") Then Range("B1").Value = 7 End If どうしても出来ません。 もし出来なければ、 「選択したセルがA列のいずれかであればB1の値を7にする。」 ということでも良いのですが。 識者の方お力をかしていただけないでしょうか。 宜しくお願い致します。 なおexcel:ver2000 OS:win2000になります。 宜しくお願い致します。
If ActiveCell.Column = "1" Then
>>453 有難うございます!
今日はもう遅いので、明日試させていただき、
追って報告します。
455 :
452 :2009/03/28(土) 02:53:18
すいません。列のいずれか、というのを教えていただき本当に助かります。 感謝してます。 しかし出来れば、 「もし選択したセルがA1からA10のいずれかであれば、B1の値を7にする。」 というケースも分かれば嬉しいなと思います。、 どなたか教えていただければ助かります。
If Not Intersect(ActiveCell, Range("A1:A10")) Is Nothing Then Range("B7").Value = 7 End If
ここは質問スレだがおまえの宿題手伝いスレじゃねーぞ んなクソ簡単な命令くらい自分で調べて作れアホ
458 :
452 :2009/03/28(土) 13:39:05
>>453 有難うございます!出来ました!助かりました。
>>456 有難うございます!
出来ました。
お二人に助けていただき、エラーを防ぐプログラムが出来るようになりました。
本当に感謝します。
>>457 勘違いしてます。私は既に自分で調べて、試行錯誤して、
それでも分からなかったのでここで聞いてます。
>んなクソ簡単な命令くらい自分で調べて作れアホ
クソ簡単って。。。
自分まだVBA初めて10日ぐらいなんですよ。
あなたにとってはそんな簡単なこと、でも私にとっては
チンプンカンプンで難しいことが一杯あるんですよ。
でもなんとか自分で試行錯誤してるうちに、
これでも最初に比べれば飛躍的に自分で対処できるようになったんですよ。
>>458 > 自分まだVBA初めて10日ぐらいなんですよ。
>>361 > VBA;多少使えます。
> VBA;多少使えます。
> VBA;多少使えます。
ふ〜ん
>>1 > ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
> コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
> ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
お前のやってることはまるで教えてクンだ
まあ俺の顔に免じてゆるしてやれよ
亀レスだけど・・・。
>>437 シートに保持させるのが嫌なら、レジストリに放り込んでおくとか、
CGIでインターネットに変数保管しておくのはどう?
>>463 >CGIでインターネットに変数保管しておくのはどう?
ネットにつながらない環境の時とか接続に失敗したらどうするのさ
それが問題になるなら、それを選択しなければ良いだけじゃね?
bookopenのイベントでレジストリキー書き換えが強固だな。
437です。 レジストリに値をってのはやり方は全くわかりませんが、 その動作や処理自体特に問題のないものなんでしょうか?
WSHでレジストリに変更加える訳でも無ければ、 ExcelVBAから触れるレジストリ領域は一か所だけだね。 VBAで触れる部分をどんだけ滅茶苦茶にしても問題は無いと思うけど。 個人的には、レジストリやINIの肥大化が嫌いなんで、 きちんと管理出来ないなら使わない方が良いかも。と思うよ。 レジストリエディタでVBAを介さずに値の削除、書き込みが出来ない内はお勧めしないよ。 今回の状況だと、素直にワークシートに値を書き込んでおくのが良いんじゃないかな。
ExcelVBAのビルドイン関数って意味ね。
>>468 ありがとうございます。
もう少し色々調べたいと思います。
初歩的な質問ですみません。マクロの記録で操作記録されないようでお手上げです。 OS ビスタ Excel2007使用です。 スピンボタンの設定で LINKEDCELL = TARGET.ADDRESS という部分をその左隣のセル指定に変更したく色々やりました。 稚拙な質問ですみません。よろしくお願いします。
特定のフォルダに「品番」.jpg A1〜A10に「品番」の羅列 B1〜B10に「品番」.jpgを自動的にセルのサイズに合わせて貼り付け(もし該当するファイルがなければunknown.jpg A列の品番が変わると自動的に差し替え 現在は A列にフルパスで参照したい画像のファイル名 挿入の数だけ下記のマクロ作ってやってます Range("A2").Select ActiveSheet.Pictures.Insert(Cells(1, 1)).Select OSはXP エクセルは2003です 宜しくお願い致します
丸投げ感たっぷりだなぁ
すいません 最初考えた時はできなくて現在の妥協案になりまして やっぱりもう一度やり直そうと考えたんですが、やっぱり挫折・・・ 正直、丸投げしました
>>472 ChangeイベントでTargetやTargetからの相対位置を対象とすれば良し
これで解らなければ、諦めるか、この程度は理解できるレベルまで自分で勉強しろ
shell関数について質問です。 アプリケーションをwinword.exeを指定した時、 空白を含むパスのファイルが開けません。 C:\test 1\test.txtだと、 file:///test%201/test.txtと記述しないとうまくいきません。 セルからパスを読み込ませ開きたいのですが、 うまく開く方法はないでしょうか?
>>476 """C:\test 1\test.txt"""
セルに「C:\test 1\test.txt」と入っているなら
"""" & Range().Value & """"
>>477 ありがとうございます。
今は外にいるのでまた明日試したいと思いますが、
ご教授頂いた記述はどういった意味になるんでしょうか?
>>478 ここは初心者スレじゃない
基礎的な構文規則くらい自分で調べろ
初心者スレなんてないんだから、初心者の質問でもいいだろ。 まぁ俺は答える気ゼロなんだがなw
プログラム起動時のパラメータはスペースで分割される。 スペース入りのパスを渡す場合には、分割されないようダブルコーテーションで囲む必要がある。 ダブルコーテーションの中にダブルコーテーションを書く場合場、""と書く。 以上をあわせると、 """abc def""" """" & range.value & """" の意味がわかるはず。
質問スレだろ? 変な研究とかの丸投げじゃなきゃ質問に答えてやれよ どーせ分からないだけだろ
>>482 偉そうなこと言ってる暇があるならお前が教えてやればいい
それとも質問者本人が煽ってるだけなのかな?
これわからない奴なんてほとんどいないだろw
>>483 そんなくだらん煽りなんかしないで、お前が答えてやれよ。
丸投げでも良いじゃない。人間だもの。
いや、俺にはわからん。
A2なのに(1, 1)になる理由とか、、、
>>484 はわかるのか。すごいなあ。
ExcelVBA覚えるのにおススメの本ありませんか? 当方のレベルは、超簡単なシェルスクリプトぐらいなら作りますが VBAの文法とか構造がさっぱりわからなくて初学者向けから勉強したいと思ってます。
Excel VBAのプログラミングのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに!
本屋に行って手に取ってみるぐらいの労力惜しむなよ…
大村あつしの入門書っぽいの選んどけ
うちのばあちゃんが、人の悪口ってのはコンプレックスの裏返しだって言ってた。
つまり
>>489 自己紹介乙
>>493 (1) 書評欄を埋めるため
(2) 評論家がゼニをふんだくるため
497 :
490 :2009/03/30(月) 23:46:29
ありがとうございます
>>491 よさそうですね。見てみます。エロゲみたいなタイトルですが
>>492 >>494 実はすでに大村あつしの入門書を見たんですが最初は簡単だったのにいきなりむずかしくなって
自分には合わないなって思いました。
ほかたくさんあったんですがイマイチピンとこずここで聞きました。
できる大辞典 Excel VBA がオススメ 大村あつしは知識はあるが根本的にバカなので こいつの書いた本は素人にはオススメしない バカな内容に引きずられないだけの基礎スキルを持っていて 知識だけ上乗せしたい中級者以降なら構わないが
500 :
472 :2009/03/31(火) 00:04:55
ヒントありがとうございます。助かります。 別のイベントで指定すれば良いんですね。やってみます。
(^p^)あうあうあー
>>475 changeイベントなんて1文字打ち込むごとに…
…は発生しない 確定された時にのみ発生する あとは変更確定されたセルが、目的のセル範囲かで条件分岐して処理すれば良いだけ
1文字打ち込むごとにchangeイベントが発生するのはComboBoxやTextBoxなどだな
Excel-VBAでXMLデータを引っ張ってるのですが
--------------------------------------------------------------
NGパターン
Set xmlHttp = CreateObject("MSXML2.XMLHTTP.4.0")
xmlHttp.Open "POST", "
https://192.168.1.1:8080/xml/ ", False
xmlHttp.Send xmlData
--------------------------------------------------------------
--------------------------------------------------------------
OKパターン
Set xmlHttp = CreateObject("MSXML2.XMLHTTP.4.0")
xmlHttp.Open "GET", "
https://192.168.1.1:8080/xml/ ", False
xmlHttp.Send xmlData
-証明書確認画面が出る。(主導ではいを選択)-
Set xmlHttp = CreateObject("MSXML2.XMLHTTP.4.0")
xmlHttp.Open "POST", "
https://192.168.1.1:8080/xml/ ", False
xmlHttp.Send xmlData
--------------------------------------------------------------
POSTでリクエストを出すとエラーが返ります。
GETでサーバ証明書を取得後にPOSTを続けるとエラーが出ないので、証明書関連だと
おもってるのですが、オレオレ証明書でも無視して続行する方法を
教えて頂けないでしょうか。
507 :
デフォルトの名無しさん :2009/04/01(水) 01:57:32
XPのExcel2007です。 次の流れのプログラムを作成しました。 1.テキストファイルを読み込み 2.不要データの削除 3.作表(列の追加など) 4.罫線・セルの色付け プログラム自体は稼働し、結果も希望通りのものができました。 しかし、一度実行した後にもう一度実行すると、初回時に比べて処理時間がかかります。 マクロの最初と最後に、画面更新の停止と解除(screenupdating)も追加してみたのですが、改善にいたりませんでした。 一度ファイルを終了し、再度開きなおした場合の初回はやはり処理は早いです。 そういった現象を回避できる手掛かりを探しています。 ご助言をいただけましたら幸いです。
再実行の前に、初回の実行したときのデータをすべて削除してるか?
>>509 ありがとうございます。
データの削除は最初に行っています。
(Cells.Delete Shift:=xlUp)
使用しているシートは2つ。(2つとも削除しています)
1.テキストファイルを読み込むシートと読み込んだ後に、
2.別シートにすべてコピーしてから、不要データの削除や罫線処理を行っています。
何度か確認したところ、別シートにコピーしてからの処理が重くなるようです。
>>507 証明書を入れて回避する方法は探せたけど
認証を無視する方法がみつからない。(回避じゃダメなので)
ぐぐって見つかるサイトがあるならURLを教えてください。
>>510 とりあえずブックうp
外部に出せないデータとかは、適当な文字列と置き換えていいから
事務所名でてるから早く消せ
>>516 最後にあげたのは全部消したはずなので、大丈夫だと思います。
ありがとうございます。 先程削除しました。 今後はあげるのやめときます。 お騒がせしてすいませんでした。
諦めるって事か お疲れさまでした
>>510 >データの削除は最初に行っています。
これは、マクロの中でやってるのか?
再実行する前に手で全部削除(コピー残すんじゃなくて)して再実行してみてどうだ
考えられる可能性は、コピーを残すことによりデータ量が増えて遅くなってるとか
空シートのクリアは早いがデータの多いシートのクリアは遅いとか
まあ、まずマクロのどこ(どの命令)が遅いか確認したら?
落としたやつを動かしてみたが、枠線とか背景色とかをいじってる所が遅くなるようだ。 セルでなくシートを削除して、新しいシートで実行すると速度が変わらないので、Excelの仕様の問題かと。 シートの中に何か覚えている部分があるんだろう。
>>521 、522
ありがとうございました。
その後、メモリの消去の命令とかいろいろ追加してみましたが、やっぱり駄目でした。
仕様ということであきらめてみます。
お見苦しいところを、多々お見せして、申しわけありませんでした。
>>523 upし続けてくれる?
直ぐ消すと
見てくれる人も見てくれないよ
開放する命令を出さないとダメだぞ。
open ?
初心者なんですが質問をさせてください。 ワークシートのセルに関数を入れて 4(=index(〜)とかで4になったもの) n = ↑のセル range("a1")=n とかにするとa1には=index(〜)がそのままはいってしまって。 値(この場合4)にしたいんだがどうすればいいか教えてください。説明が下手で申し訳ありません。
自己解決しました。 マクロの記録でコピペして値のみでできました。 もし他にも方法があったら教えてください。
ここって日本の掲示板だよな? あまりにも日本語の質問が少ないんで 何処か日本以外の国の掲示板に迷い込んだのかと錯覚する…
自然言語がちょっと乱れた程度で外国語と間違えそうになるなんてすごいです。 尊敬します。先生と呼ばせてください。 ところで先生は文末に約物だけを付けるのは正しい日本語とみなす派なんですね。
どうしたの?
自分で不自由て自覚あるみたいだから好きに呼ばせておけばいいよ
4(=index(〜)とかで4になったもの) もうね。メタ文字が入ってると、どんなパターンなのか考えてしまってダメだわ。
日本語でOK
>>527-528 だいたい俺んとこじゃそういうふうにならないんだが。
仮にC1に=INDEX(D:D,4)となってて
n=Range("C1")
Range("A1")=n
と.Valueを省略して書いてもA1には値が入るぞ?
536 :
デフォルトの名無しさん :2009/04/04(土) 16:16:24
かつてoffice2003で作ったxlsファイルでVBAを組んだのですが それをoffice2007のxlsxで開こうとするとエラーになってしまいます。 もちろん保存するときにxlsで保存すれば開けるのですが。 xlsで作ったVBAはあくまでもxlsファイルでしか開けなく 互換性はないのでしょうか?
>>536 マクロ付きの場合、xlsxではなくxlsmになる。
名前を付けて保存のダイアログのファイルの種類のところから、それ選べ。
538 :
デフォルトの名無しさん :2009/04/05(日) 09:46:08
ボタンが一個置いてあり、その下に、数字がはいった二つのセル(仮にセルA、セルBとする)がある。 で、ボタンを押すと、別シートの表の中からセルAと一致 するセルをもつ行のうち最初にみつかったセルの1マス右側のセルにセルBの内容を書き込む・・・ というようなことをVBAでやりたいのですが、 単純化したサンプルでいいんでどういうコードになるか教えていただけませんか
539 :
デフォルトの名無しさん :2009/04/05(日) 10:28:13
オートシェイプにMouseMoveとかのイベントはありませんか? オートシェイプ上にカーソルが移動すると オートシェイプに合わせたデータを表示する というのプログラムを組みたいのですが
>>538 With Sheet2
.Range(.Cells(1, 1), .Cells(10, 1)).Find(what:=Sheet1.Cells(1, 1)).Offset(0, 1) = Sheet1.Cells(2, 1)
End With
Sheet2が別シート、Sheet1がボタンがあるシートな。
541 :
デフォルトの名無しさん :2009/04/05(日) 11:04:03
>>540 ありがとうございました。
ちなみにセルAとセルBじゃなくて、
列Aと列Bだったとして、
列Aの内容と一致するデータを別シートから検索し、右隣のセルに列Bの
内容を書き込む、みたいな場合はどうなるんでしょうか
丸投げよくない
>>539 シェイプ系には無い
ActiveXオブジェクトには有る
矩形で良いならコントロールツールのイメージオブジェクト使うのが手っ取り早い
凝った形が良いならActiveXオブジェクト作って取り込めば良い
>>539 無い。けど、マウス座標からObject位置判定を自前でやれば同じことはできる
できたとしても、定義済みシェイプを使う方法が面倒だと思う
シェイプと情報をうまく自動リンクさせる手法の方が難しいと思われ
デフォルトプロパティって書くべきなんだよな?
関数だと必ず()にして表記したほうがわかりやすいよな 仕事としての意味で
>>451 非表示シートって表示できるの?
矛盾した質問で申し訳ない
セルの値を二元配列に組み込みたいのですが、 簡単にする方法はありますか? data(0, 0) = A1.value data(0, 1) = A2.value data(1, 0) = B1.value data(1, 1) = B2.value data(1, 2) = B3.value のように一度に格納したいのです
>>548 Dim ary As Variant
ary = Range(Cells(1, 1), Cells(3, 3)).Value
これで配列に入る。
添え字は1始まり。
>>549 拾ってきたソースで非表示シートに値を入れてるのがあって
それを目で追うために見えるようにしたかったんだよ
表示できない場合、うっかり非表示にしちゃったときどうするんだ
>>545 保守的には書いたほうが良い。書くべき。
けど、VB6に限れば書かない方が速度が速い。もしかしたらVBAも・・・?
まあ、所詮Excelなんで筋違いか。2008は知らん。
どこぞのサイトに書く場合と書かない場合の計測結果があったな
書いた方がわずかに早いけど、そこまでスピードにこだわる処理にVBAは向いてない気が
質問です。 Variantに複数のRangeを代入した際の動きって どこかにドキュメントとかありますか? いまいちアレが配列になる理由がわからない。
それは代入以前の問題だろ 君は複数範囲のRangeオブジェクトのValueプロパティが、配列を返すってことを理解してないだけじゃん。 変数は単にValueプロパティが返した値をそのまま保持しているだけで、Variant型変数に代入したときに 何か変換とかが行われてるわけじゃないし。
>>557 variantでメモリを確保します
最低16バイトです
そこに配列の値を入れていきます。増えたらVariantが確保してるメモリ量も増大します
終わり
多分可変長ってところでひっかかてるんじゃないかな
>>558 ,560
複数のRangeといったのは、下記のような代入です。
Dim var as Variant
var = [A1:B3]
なんでvarに配列が入るのか不思議だったので聞きました。
(普通に先頭要素の値が文字列として入ると思っていたから)
>>559 うーん、そういうExcelのCOMの作り方であって、
別にVBA的な何かというわけではないのですね。
デフォルトプロパティの動作についてドキュメントないのかな。
CVarでも動作同じなのかな。
つまり勘違いしてただけか
Range型に不用意にVariantを使用しない。後で意味が分からなくなる。 デフォルト云々の前に、Variantは不定形型ということを理解すべき。
range == stringの認識も改めたほうがよさそだね
>>564 を見てふと思ったんだけど、
やっぱり比較演算子と代入演算子が同じってのは分かりにくいよね。
>>563 ユーザー定義関数なんかで、セル指定or文字 を引数で使うみたいに、
明確にvariantじゃなきゃ条件分岐がしっかり出来ないって用途は限定されるしね。
まぁ、そんな目的だとしてもTypenameあたりでしっかりと何型が入ったかを判定させるべきだと思う。
入れっぱなし、とりあえず問題なく動くからOK。って作り方はわしゃ好まん。
VBAでカレーライスって作れますか?
>>567 外部マイコンをVBAで制御すればできる
もちろん、マイコンでカレーライスが作れるように設定しておいてくれ
だがそれは、はたしてVBAで作ったことになるのだろうか?
『パソコンはC言語で動いてる』の考え方次第じゃない? 目に見える結果にプログラミング言語は限定されないと思う しいて言うなら、カレーライス製造装置の制御ソフトの大半がVBAなら、VBAで出来てるといえるのでは? 最悪、かーちゃんにメールするだけでも成立しそうだが 激しくスレチ乙
なるよ
「パソコンで年賀状作った」 「それはプリンタに作らせただけだろう」 みたいな話か
最後にちょっと国内で加工すれば国産になるのと同じ道理ですな
>>563 は何か勘違いしてるの?
セルの値の配列をいっぺんに入れるならVariant型しかないじゃん。
Range.Value()の代入先がVariant()型に限るってのもVBAの妙な仕様の一つだよな。 別にDouble()やString()を許容してくれてもよさそうに思えるのに。
プロパティの定義が Value As Variant なんだから、妙でもなんでもなく当然だろ? というか、配列じゃないときに変換関数も通さず別型の変数に代入できてしまう方が妙だ。 自動型変換なんてのは行われないのが普通だからね。 VB6以前やVBAにどっぷりハマっていると、自動型変換されるのが当然で、プロパティの戻り値を プロパティの型とは別型の変数に代入できないという当たり前のことが不自然に感じてしまうものなのか?
ならばセルに数値が入ってる時TypeName(Range("A1").Value)ってやると Doubleが返ってくるのをやめてほしい。 Range("A1").ValueTypeみたいなデータ型を調べるプロパティを用意すべき。
>>577 それはTypeNameが内部型を返すという仕様通りの結果だろ?
結局全てに置いて理解が浅いだけの話じゃん。
そして問題点を指摘しているのではなく、「俺の妄想通りに動かない」とブー垂れてるだけ。
ホント、どうしようもないな。
じゃあ問題なのは一部の演算子で自動的に型変換が行われてしまうってこと? VBAだと暗黙の型変換を禁止する方法ってないよね?
>>580 それ、結構重要だと思うわ
最近のスクリプト言語でも思う
勝手に型変換して書いたソースをなんとか動く形に解釈してしまうのは
俺もダメだわ
単純な変数への代入だと勝手に型変換してくれるのに 配列への代入だと型変換してくれない。 なんで統一してくれないの?
VBAは中途半端に型があるからなぁ VBSみたいに、もう型なんてバリアント以外禁止!にすればよかったんだよ 実行環境が勝手に型変換するのは、勝手に型変換するコードを書くからなんだがな それは問題なんじゃなくて、そういう言語だと理解して使うしかない
>>577 それって意味あるの?
ValueTypeプロパティがあったとして、
VarType/TypeNameが廃止なら、現状のVarType/TypeNameと何も変わりない。
見た目が変わるだけ。
一方、VarType/TypeNameが存在するとしたら、そっちは何をするんだ?
例えば、Variantであるという戻り値なら、そんなものソースコードを見れば自明だ。
ほかの方法は思いつかない。まさかValueTypeと同じとは言わないだろうし。
「variantの使い方は気をつけよう」でおk? 初心者はよく勉強すること 熟練者は的確なスレをすること 反論だけのキチガイはスルーすること
スレをする?
Variantはまだいい方。 一番わかりにくいのはRangeオブジェクトだと思う。 よく使われることを想定したためか、かなりの省略が許容されているおかげで誤解も多い。
別に解りにくいなんて思ったことは無いけどな 理解度が低かった初心者の頃以外は
EntireRowとかのRow自体のRangeとか、 結合セル時のOffsetとか、Find・FindNextとかはわかりづらいと思った。
理論的な思考が出来る人なら問題にはならないけどね 結局は個人の問題
んなアホな
まあ出来ないうちはそう思うのは仕方ない 解ってみれば単純な物だが
うゎ、こいつうぜ
ここはヒトの理解というものについて考察するスレじゃないというのは、 論 理 的な思考が出来る人なら問題にはならないけどね。
悔しかったの?
Cellsの使い方がおかしい奴は多いねぇ。 Set r = Range("a1:b5") r.Cells(2,1).hogehoge なんてやつ見るとアフォかと。
なにやってんのそれ?w
やってることはどうでもRange("a1:b5") がセルの集合だからCellsを使うのはおかしいってこと。
>>597 複数セルに対するCellsで第二引数まで指定するのは確かにおかしいが
やってる奴は滅多に見ないぞ
複数セルに対するCellsで第一引数のみの指定や
単一セルに対するCellsで第二引数まで指定するのならよく見るが、これらはちゃんと意味有るし
前者は範囲内、若しくは範囲の延長上で右下方向に何番目のセルという指定で
Range("A1:E5").Cells(12)なら、A1:E5の5行5列範囲で右下方向12番目ということで
1 2 3 4 5
6 7 8 9 10
11 12
のような感じで3行2列目のB3を返す
後者はOffsetの初期インデックス違いのようなもので、Offsetが0始まりなのに対して、Cellsが1始まり
Debug.Print Range("A1").Cells(3, 3).Address(0, 0)
Debug.Print Range("A1").Offset(2, 2).Address(0, 0)
因みに前者のような使い方があるので、「(親が)セルの集合だからCellsを使うのはおかしい」って言い方は不適切だな
問題は、RangeもCellsもRangeオブジェクトを返すのに、その明確な 使い分けができてないことだろ
使ってればそのうち使い分けられるようになるさ。
いや、たしかに自然と使い分けてるんだが、 問題としては、使い分けの方法ってか、指針を説明できないってことなんだ 今だから白状するが、俺は初心者の頃は、Cellsは単一セルそのものを返してると思ってた まあ、だからRangeとCellsの使い分けはあんまり悩まなかったが、かといって 範囲が1×1のレンジ操作はCells使えってのも、なんかちょっと違う気がする
>>597 がおかしいのは
r.Cells(2,1).hogehoge じゃなくて
rItem(2,1).hogehogeとかr(2,1).hogehogeって書けって意味だよ。
r.Cells(2,1).hogehoge ってr.Cells.Item(2,1).hogehoge の意味だけどセルの集合にわざわざ再度Cellsを使うのは無駄ってもんだ。
例えばCells(2,1)もCells.Cells.Cells(2,1)も同じセルををさすが、動けばいいってもんじゃねーからな。
EntireRowとかのセルの集合じゃないものにCellsを使うのは意味があるが
>>597 ではCellsは無意味だね
r.Cells(2,1).hogehogeがr.Cells.[_Default](2,1).hogehogeの意味だって突っ込みは無しよ。
>>605 デフォルトプロパティを省略するなって議論が上の方にあったな
だが実際問題、Cells.Item(2,1)なんて書かないなぁ
デフォルトプロパティがインデクサとして作用するなら普通みんな書かないんじゃない
まあ、そのせいで、Cells(2,1)はプロパティ取得じゃなくて、
Cellsというメソッドを2と1という引数で呼び出してると勘違いしてる時期があった
VBAの入門書とか、そのへんちゃんと解説してるようなのはほとんどないと思う
ちゃんとしたコード読まないと、ちゃんとしたコードかけるようにならないってことだな
ただ、Range.RangeとかCells.Cellsとかは感覚的におかしいと思うんだが
Range.Cellsは感覚的におかしいと思わないんだよなぁ
>>607 Excel95の頃はCellsはメソッドじゃなかった?
中身は実質変わってないのかな?
ソース見てRangeがオブジェクトかプロパティかわからない俺参上 Range("A1") = "abc" たとえばこれはオブジェクトでデフォルトプロパティのValueが省略、でいいの?
Rangeはオブジェクトを返すプロパティだよ
611 :
デフォルトの名無しさん :2009/04/07(火) 17:35:05
EXCEL2003です セルの書式設定の[表示形式]定義が[文字列]かどうか 判断する方法を教えて下さい。 やりたい事は「日付を表すデータ」([表示形式]が[日付]とは限らない)が 元々どのように入力されているか判断したいのです。 具体的には、 文字列で「3/1」、「2009/3」「2009/3/1」と入力されて いるのか、日付データで「2009/3」等と入力されているのかの 判断方法は、どうすれば良いかということです。 よろしくお願い致します。
613 :
デフォルトの名無しさん :2009/04/07(火) 22:14:32
文字列で"0.1"とか"1"をDoubleに変換したいです。 且つ、"abc"のようなものなら失敗して欲しいです。 CDbl()でよいと思うのですが、"abc"などを渡した場合どのように失敗を通知してくれるのでしょうか? 例外などですか?このときの例外の補足の仕方を教えていただけますか? 宜しくおねがいします
On Error GoTo xxxx でエラートラップ Err.Numberでエラーの種類しらべてしかるべき処理 はっきりいってVBAのエラー処理はおまけみたいなもんだ 変換してエラーでる可能性があるとわかってるなら、 変換する前に変換元が数字かどうかぐらい自分でチェックするほうがいいと思うぞ
>>614 ありがとうございます。m(_ _)m
アドバイス助かります。自分でエラーチェックすべきか、
オブジェクトの例外スローに期待すべきかも悩んでました。
とりあえず試してみます。
例外が送出され、それを捕らえて上手くメッセージが出せたらそれに越したことはないものですから。。
>>615 エラー処理ルーチンにうつった場合の、それ以降の処理が非常にややこしくなるんだ
まあ、詳しくは構造化エラー処理あたりでぐぐってみてくれ
で、613はJava系のプログラマか?
VBAで例外スロー、キャッチとか考えんほうがいいぞw
つーか、IsNumericじゃダメなの?
IsNumericかregexを使う
vbのエラー処理ってこんなかんじだったかな 1: on error resume next (処理) if err.number = xxx then 〜 end if on error goto 0 2: on error goto eh (処理) exit sub/function eh: (errで分岐したり処理したりする。resume next で戻ることも出来るが、大体はそのままプロシージャを抜ける。)
負の日付を判断する関数ってあります? もしくは負の日付か判断する方法があったら教えてください isDate(負の日付)や変数 = 負の日付とかするだけでエラーに飛んでしまって・・・
まず、負の日付の定義についておしえてくれ
1899/12/29以前ってことか? 俺のとこじゃDate型の変数にCdate("1872/8/13")を入れてMsgBox IsDate(変数)とすりゃTrueだけどな。 直にMsgBox IsDate(-10000)だとFalseだが。 エラーにはならんな。
>>622-623 説明不足でもうしわけないです
表示形式が「日付」のセルに、例えば9999999999って値を打つと
####と表示され、マウスカーソルをあてると「負の日付または時間は####と表示されます。」
と出てきまして、そこの値をvbaの方で参照しようとして落ちているという状況です
(日付型のとこには0〜2958465以外の数値だと日付シリアル対象外でこうなるようで・・・)
関数があれば〜と言いましたが、代入するにしろ引数にするにしろ、
参照した時点で落ちてるので関数があっても意味がないと思い、
結局エラーに行かせた先で判断するようにしました
どうもありがとうございました
>>624 Value2プロパティが2958465以下かで判断する方法もあるかもね。
ValueプロパティだとオーバーフローのエラーだがValue2だとオーバーフローしないから。
>>625 知らないプロパティだったんで早速調べてみたんですがこれで行けそうです!
>>625 氏の言うとおりの方法で範囲外なら無効な日付とメッセージを出すようにしてみました
出来ればエラーに飛ばしたくないと考えていたので助かりました
どうもありがとうございます!
627 :
611 :2009/04/08(水) 17:37:10
>612 レスありがとうございます
628 :
デフォルトの名無しさん :2009/04/09(木) 00:08:50
EXCELファイルがどのバージョン(EXCEL97、2000、2003)で 作成されたものか調べる方法を教えてくれ神ども。
拡張子は?
質問です。 保護されたセルのキャプションやプロパティを変える方法ってありますか?
キャプション? プロパティ? それってセルではないのでは? というか保護されてるのに変えられたら保護されてる意味無いのでは? 単に保護の解除、変更、再保護を自動化したいってなら可能だけどね。
>>633 ついオブジェクト等のノリで書いてしまいました。
セルのバリューやフォント等です。
使う人には入力不可能にしたいんですが、
一定の状況下では処理で内容を書き換えたりしたいと思ってます。
それなら一番下の行の方法だね
マクロの記録って素晴らしいよな この機能のおかげでVBAに取っ付き易いし、ヘルプより役に立つときもある 似たような感じで、JAVAとか勉強できないのかね
アプリケーションマクロじゃないと「記録」にならないからな 純粋な開発言語では記録する対象が存在しない Excelのマクロの記録だって、記録されるのはApplication以下のオブジェクトに対する操作だけだろ
そうやって欠点ばかり見るのは君の悪い癖 来い、キスしてやる
何処の誤爆だ?
キスされたい
ぶちゅうっ
ズキューン!!
643 :
デフォルトの名無しさん :2009/04/10(金) 18:09:16
EXCEL2003です。 シート上にあるオートシェイプ(テキストボックス)の名前と位置を VBAで知る方法を教えて下さい。 よろしくお願いします。
Debug.print ActiveSheet.Shapes(1).Name,ActiveSheet.Shapes(1).top,ActiveSheet.Shapes(1).left
どなたか教えてください。 VBAを使ってボタンを配置したいのですが、コントロールボックスが灰色になっていて配置できません これはなぜなんでしょうか? 元々もらったファイルなのでなにか設定されているのでしょうか?
647 :
デフォルトの名無しさん :2009/04/11(土) 08:00:40
ユーザーフォームで入力された変数を、そのフォームを呼び出した親フォームで受け取りたい場合、 グローバル変数で受け渡すしかないんでしょうか? ユーザーフォームをクラスにして、それにPublicなメンバ変数を持たせて、 呼び出し側の親フォームは、このユーザーフォームのインスタンスの生存期間中、そのメンバ変数にアクセスしたいとか思ってます。 VBAでも可能なのでしょうか?
648 :
デフォルトの名無しさん :2009/04/11(土) 08:20:17
ListBoxにAddItemした文字列があるとします。 その文字列自体ではなく、その文字列にマッピングした数字を得ようとする場合、いい方法あります? Win32だと、LV_ITEM::lParamなんかに、そのアイテムに紐づく任意の値を保持できるじゃん。 そしてListCtrlをソートしたり、アイテムを追加削除した後でも、ユーザが選択した文字列から、それに紐づく任意の値がとれるじゃないですか。 VBAで、ListBoxで、AddItemした場合、追加した順番がそのままListIndexに対応するって考えていい? ソートしたり(できるか知らんけど)、アイテムを後から削除してまた追加したりすると、ずれる?
>>647 子で取得した変数を親で呼び出したいって事だよね?
publicを使うとしても、いきなりpublicに子から代入するんだと、拡張性が著しく落ちるんで、
子の処理の最後に、publicに受け渡す方が良いと思う。
>>648 LV_ITEM::lParamをAPIとして呼び出して使えば良いんでない?
>>648 レスサンクス。
結局Win32のListViewを使うことにしました。
で、
mylistview.ColumnHeaders.Add(0, "_Name", "名前", 50,,)
ってやってみたんだけど(もちろんどっかのサイトのサンプルをぱくって)
これだと文法エラーの赤い表示にされる。。
でもカッコ('('と')')を取り除くとOK。引数の数はどっちでもあってるのになんで(?_?)
VBA難しすぎる。
VBでは、戻り値を使わないなら括弧を付けない。使うなら括弧を付ける。 関数とステートメントが区別されていた古代のBASICの名残だと思う。 Callを使えばCall mylistview.ColumnHeaders.Add(0, "_Name", "名前", 50,,)と、 戻り値が無くても括弧を付けて書ける。
>>651 おおおおおお!!!!
ありがとうございます!!
そういうわけだったのかぁ。。
ぜんっぜん気がつきませんでした
どうもっす!
653 :
デフォルトの名無しさん :2009/04/11(土) 11:09:30
いつもお世話になっております マクロが登録されているオブジェクト(セルではないです)のプロパティ(色やフォントサイズ) を取得したいのですが、どのように指定すればよいのでしょうか? やりたいこととしては 青色と赤色と黄色それぞれで塗りつぶしたオートシェイプが1つずつあり 赤色の方にマクロを登録します 青色と黄色のオートシェイプを選んだ状態で マクロが登録された赤色のオートシェイプをクリックすると 青色と黄色のオートシェイプが赤色に変化する といったことです 説明不足等がありましたらご指摘ください よろしくお願いします
ひんと: foreach shape in Selection.Shapes debug.print shape.name next
>>654 レスありがたいのですが
そのマクロを実行すると
オブジェクトはこのプロパティまたはメソッドに対応していません。
と出てしまいます。
foreachはfor eachですよね?
シェイプ名で管理しておいて、 赤が押された時に、黄色と青色のシェイプが選択されているかを判定して、 それを通った場合に、赤くした方が良い。
657 :
デフォルトの名無しさん :2009/04/12(日) 01:29:31
只今、どこに選択セルがパッと見分からないので、 選択したセルを自動的に行、列共に罫線で囲い、 選択セル位置が変化したら、次の位置を行、列、共に罫線で囲う。 というプログラムを作っています。それでプログラムを作ったのですが、 半分上手くいき、半分上手くいきません。というのは、 次のセルを選択しても、前のセル位置でつけた罫線が、 残ってしまうのです。 コードは Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.EnableEvents = False With Target.Cells Union(.EntireRow, .EntireColumn).BorderAround Color:=RGB(255, 0, 255) End With Application.EnableEvents = True End Sub です。どなたか、ご指摘願えればなと思います。 また、excel2003 osはxpになります、宜しくお願い致します。
658 :
657 :2009/04/12(日) 01:40:24
お騒がせしました。その後自分で解決し、分かりました。 何時も皆様にお世話になって得るので、 このプログラムは結構便利だと思うので、もし良かったら買いときますので お役立て下さい。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.Borders.ColorIndex = xlColorIndexNone Application.EnableEvents = False With Target.Cells End With Application.EnableEvents = True End Sub こうすれば十字に罫線を引けました。
選択セルって何もしなくてもぶっとい枠で囲まれるじゃん。行列番号も色が変わるし。
Excelのプログラム用のライブラリというものはないかね。 自前で書く手間を省いて時間を節約したいんだが。
いくらでもあるよ
えっ、どこにある
>>657 static使うと前のセル情報をstaticに保持しておけるよ。
665 :
643 :2009/04/12(日) 09:05:41
666 :
デフォルトの名無しさん :2009/04/12(日) 10:52:53
関数からNullを返したいんですけど ”実行時エラー(94):Nullの使い方が不正です”って言われます。 Private Function foo() as String foo = Null End Function の様に書いてます。 なぜでしょう、またどうすればいいの?
>なぜでしょう 基礎を何も理解してないから。 >またどうすればいいの? まともに学習すること。
ググっても基礎なんてさっぱり出てこないし、 MSDNもでかすぎてどこで探したらいいか分からないし 言語仕様を知ってる人に手っ取り早く教えて欲しいです。 教える気がないならレスはいらないです。
言語仕様以前の問題だろ? String型の戻り値にString型以外の値を渡せばエラーになるのは当然のこと
671 :
デフォルトの名無しさん :2009/04/12(日) 11:43:50
それを言語仕様っていうんだよ
ほんとVBのコミュニティーはレベルが低いね こんなものなくなってくれりゃC++でバリバリかける よっぽどはええ
ここのアホの相手してたら時間が無駄になった。 自分で探したほうがよっぽど早かったww ほんっとお前ら使えないな。 VBしか出来ないんだろ?どーせww だからろくに引数の説明も戻り値の説明もない関数インタフェースを載せてるオナニーサイトばっかりなんだよ 戻り値もなけりゃ不定時の動作の説明もエラーの返却方法も書いてない ゴミみたいなサイトばっかりw言語がゴミだからやってる奴も文系まるだしのゴミばっかw なにがObjectだよ COMだろがどーせw おまえら威張り腐るからにはCOMがVBでどう生成されてるかぐらい書けるんだろーな?
哀れだな
>>671 型というものの存在自体を知らないならね
しかし型というものを知っている上で気付かないのは
無知(言語仕様知識が足りない)ではなく単なる馬鹿
>>672 確かにCは何でも出来るよね。
でも、VBAを使ってる人たちは、VBAが仕事の役に立つからやってるだろうね。
Excel帳票を処理する仕事に対してVBAってスクリプトが一番向いてるのは間違いないよ。
Cは何でも出来るけど、裏を返せば自分で全部やらなきゃいけない。
なんでも出来るけど自分で全部0から作らなきゃいけないって事の裏返しだよ。
Cが向いてる仕事ならCで作れば良いじゃない。
心配しないでも、このスレの連中は特化した言語って言う概念を持ってるから大丈夫。
VBAでゲーム作るって言った馬鹿に対して、Flashで作れ。って返答があったしね。
あと、シェアが高いってのは言語を扱う上で凄く大切だから覚えておくと良いよ。
ObjectでIDispatchの名前が出てこない奴は偽者。 ObjectのつもりでIUnknownを返しても、 ExcelはvtblがIDispatchであることを前提にアクセスしてくる。
>確かにCは何でも出来るよね。 C++ 何おかしなレスしてるのか。
方法を模索したのですが分かりませんでした。 宜しくお願い致します。以下、コードは簡単なのですが・・・ Sub 数式ある無し判定() If Range("AZ27").HasFormula Then Range("AZ27").Interior.ColorIndex = none Else Range("AZ27").Interior.ColorIndex = 13 End If End Sub つまり、「AZ27に数式があれば色なし、なければ背景色に色を付ける」 という式なのですが、これをAZ27からAZ330までの行全てに、 適応させねばなりません。 そうすると、end ifの判定を一つのセルに一つ必要で、 そうするとこの式が300個以上必要になり、困っています。 そんなことをせずとも解決する方法があると思うのです。 分かる方、宜しくお願い致します。 excel2003 osはxpになります。
AZ27が何行、何列か知らんが、例えば、 1,1〜100,100までfor使って走査したら?
>>680 Dim eachRange as range
For Each eachRange In [AZ27:AZ330]
eachRange.Interior.ColorIndex = IIf(eachRange.HasFormula, none, 13)
Next
>>681 数値でループするなら
Range("AZ27").Cells(rowIndex, columnIndex)
という相対指定ができたような気がする
うろ覚えだけど
680です。
>>681 for next を使うということでしょうか。何のことか分かりませんでしたが、
本で調べたら載っていました。これを応用すれば出来そうです。
ありがとうございます。
>>682 ありがとうございます。
親切にコードまで書いていただき感謝しています。
お陰さまで解決しました。本当にありがとうございました。
>>682 ループの中でIIfは使わないようにした方がいいよ
300くらいならさほど問題にもならないだろうが
IIf関数はIf...Thenステートメントの5〜10倍の時間が掛かるから
みんな詳しいなー 何時も感心しますわ。マジで、
ちょっとスレ違いだが、 VSTO 使っている人いる? VBA からの移行のために勉強中。
>>666 じゃないけどnullは0文字の文字列って定義じゃないの?
それをstringに格納できないのは良く分からない
>>671 の言うとおり、言語仕様ってことでいいのかな?
Nullは文字列(String)じゃないよ Debug.Print TypeName(Null) Debug.Print TypeName("")
>>675 俺は671じゃないが
その型を定義してるのが言語仕様でなくてなんなのだと?
まさか、型はどんな言語でも必ず同じだとおもってるのか?
>>688 VBAには一応型の観念があるんだが、これが非常にあいまいで
必要に応じて自動的に違う型として扱われたりするんだ
で、NULLは文字列でも数字でもない、特殊な型だと思ってください
VBAではNULLを文字列として評価すると、空文字列("")として評価されます
でもNULLは文字列型ではありません
数字として評価するとゼロになるけど数字型でもありません
>>690 型という物が存在することを知っていながら型違いを疑わないのは、
言語仕様という知識の不足ではなく、発想や思考の貧困さが原因
型という物の存在自体を知らずに、型違いによるエラーで悩んでるなら
言語仕様知識の不足と言えるが
693 :
690 :2009/04/13(月) 15:10:57
>>692 型違いはエラーになるから疑う必要がある、というのは言語仕様の知識なんだが
お前さんVBAの型については詳しいのか?
世の中には型チェックが厳密な言語だけじゃないんだよ
ま、質問関係ないしこれ以上はスレチか
ダメだこりゃw
俺はどうもVBSの全部variant型が気に食わないな・・・。
JavaScriptのフリーダムさに比べたら大分マシ。 逆に中途半端な気もするが。
PerlもJavaもかなりアバウトだよな 代入するだけで型変換までしてくれる
Javaは別にアバウトではないよ。(strongly typed languageと自分で言ってる。) プリミティブ方とかauto-boxingはアレだけど。ジェネリックはまあ…、ちゃんとしてる。 Perlに関して言えば、変数名について型を宣言できない。(VBScriptやJScriptと同様) Lispとかも自由だね。ただ値をスロットに埋めるだけだもんね。 型が厳しいっていったらDB2のSQLとか、Haskellとか、OCamlとかかなあ。 OCamlは小数点同士とかの足し算にいちいち配慮するのが面倒。
ボタンでプログラム割り当てたんだけど それぞれのボタンにどんなプログラムが割り当てられてるか 確認するにはどうしたらよいでしょうか? office2007です。
フォームのボタンなら、ボタンオブジェクト(シェイプ)のOnAction調べれば良い コントロールのボタンなら、コントロール名_Clickのはず
>>701 挿入からフォームのコントロールで作ったボタンなんですが
よくわかりませんでした。
すみません。
良く解らなかったら解るまで調べれば良いだけだね
解らなかったらそこで思考停止する人はここには来ないはずだから
>>1 ★5
>>702 そのボタンを右クリック→マクロの登録で、一番上に表示される「マクロ名」を見る
Dim b As Button For Each b In ActiveSheet.Buttons Debug.Print b.Caption, b.OnAction Next End Sub
>>704 どうもありがとうございます。
ようやくわかりました。
すいません、教えてください。 セルの値が変更されたら、文字の色を変更したいと思い changeイベントで実現出来るのは分かったのですが、 数式が入っているセルは色が変更しませんでした。 どうやったらSumなどの数式が入っているセルも 同じように実現できるのでしょうか?
>>708 Changeイベントはセルの値が変更されたときに動くイベントだが
数式の入ってるセルは、表示は変わってもセルの値である式は変わらない
だから、トリガーとすべきは数式が入ってるセル自体ではなく、数式が参照しているセル
A1 | 3
A2 | 4
A3 | =A1+A2
で、A3の色を変えたいなら、A1とA2をチェックする
知ってる方がいれば教えて欲しいのですが、 ExcelでOpenXML(xlsx)形式が利用可能かどうか調べる方法は無いのでしょうか? Application.FileConvertersを見ればいいのかと思ったのですが、 Excel2003 + Office2007互換パックの環境でFileConvertersがNullになっていました
VBってパッチを当てて自動更新みたいな事はできます? どっかサーバにマスター置いといて、 そのファイルのバージョンが今自分が開いたのと違ったら、 変わってるコードだけ書き換えるような。
>>710 拡張子の関連付けを調べたらどうだろう
>>711 モジュールの追加、削除なら可能
あとは工夫次第
713 :
デフォルトの名無しさん :2009/04/16(木) 20:11:03
excelの文章を縦書きにする事ってできますか? 枠自体を縦にしたいのですが
Excel VBAで彼女できますか?
冴子先生でよければ
718 :
デフォルトの名無しさん :2009/04/18(土) 10:03:26
EXCEL2003です。 シート上にあるオートシェイプとグラフオブジェクトの数を 知る方法を教えて下さい。 よろしくお願いします。
>>718 shapes.count
charts.count
720 :
718 :2009/04/18(土) 13:08:51
721 :
デフォルトの名無しさん :2009/04/18(土) 16:49:51
VBAの初心者ですが、形式を選択しての値の複写のマクロの記録なのですが、 出来たら、1行にしてあらわしたいのですが、うまくいきませんでした。 どう修正するのがいいでしょうか? Range("A5:A20").Copy Range("F5:F20").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
>>721 Range("F5:F20").Value = Range("A5:A20").Value
723 :
デフォルトの名無しさん :2009/04/18(土) 17:36:18
あぁー、なるほど。サンクスです。
724 :
デフォルトの名無しさん :2009/04/18(土) 19:28:02
すみません。ご教授下さい。 変数に入っている時刻データを、テキストボックスに表示するときに、 「0.622.....」とかじゃなく、ちゃんと時間で表示するにはどうすればよいでしょうか。
Excelの上級機能を残らず学習するだけでも大変なのに、VBAまで学習のは至難の業 ではないでしょうか。
[ ]内が抜けてしまいました。 学習の[するの]は
エクセルの上級昨日ってなんかあったっけ VBA覚えたら割と何でもできるから楽だよ
シナリオ、ソルバー、ゴールシーク、フィルタオプション、自動集計、アウトライン ピボットテーブル、MS-Query等ある。
自分が上級者であることを自慢したいようだな。
逆でしょ
中級とか大口を叩いてる割には、その機能を用いたVBAコードが無いじゃないか。
で?
エクセルの上級機能なんてそれこそVBAそのものだと思うんだけど ソルバーとかもそうなるのかね、使ったことないや
自分は配列数式や複素数で目から鱗が落ちてきた。
>>734 >で?
お前の言う中級機能を使ったVBAコードをアップしてみろ。
何でそんなに必死なの?
上級機能だと思って鼻高々だった機能を中級だと言われて怒り心頭。 こういう子は弄らず生暖かく見守ってやるに限る。
何だ、結局口だけのようだな。
その中級機能すらコードを書けないくせに。
中級とか言うなら、それを使ったコードを見せてから言えよな。
( ゚д゚)ポカーン
>>721 くらいが理解できればエクセル中級と言っても過言ではないと思う。
その程度か、と言う気もするが、VBAを知らない人間が圧倒的に多いことを考えればそんなもんだと思う。
中級機能のコードを書けないのに、口だけの自称上級者が、恥をかいたようです。
そういう事にしておきたいのですね、解ります。
恥かいてるくせに、虚勢を張らなくていいんだぞ。
言ってて情けなくならないか? ならないとしたら君は幸せな人だ
口だけで虚勢を張る人間のほうが情けないな。 そして、そうやってほっとけないお前もな。
ダメだこりゃw
自称上級者の恥の上塗り 回りから注目を集めろ、自称上級者。
己が嘲笑を買っていることには気付かないのでした。
素直に負けを認められないのが、さすが自称上級者だな。
この子おもしれーなぁ
自称上級者って、ほんとおもしれーなぁ
その話題VBA関係ないだろ。スレ違いじゃ。 いくら知識や能力があっても基本的なルールが守れない自称上級者は どこ行っても嫌われるだけ。
もしかして自分が弄られてるだけだってことに気付いてなかったりする?
いつまで意地を張ってるのだろうか。 まあ、自称上級者は失うものが大きいから、黙っておけないんだろうな。 こっちは自称上級者に弄られようが、失うものは何もないがな。
こんな面白い玩具を失うのは確かに大きい痛手だ
さすがは自称上級者らしい書き込みだな。
いつまで意地を張ってるのだろうか。
762 :
デフォルトの名無しさん :2009/04/19(日) 04:24:25
がきどもおちつけ
ここで質問するのは場違いかも知れませんが、 csv形式のファイルを読み込むと通常(普通)なら 左からA,B,C、・・・・と並ぶのに なぜか右からA,B,C、・・・・と並んで表示されます。 エクセル形式のファイルは普通の並びです。 しかしながら、CSV形式のファイルをエクセルのSHEETにペースト すれば通常の並びです。 CSV形式のファイル表示を通常の並びにする方法を知りませんか?
>763 OS:WIN XP VER:2003 です。
>>761 何だ、まだやってたのか、自称上級者。
そんな無意味な書き込みはしなくていいから、早く中級機能を用いたコードを
見せてみろよな。
初級:罫線・印刷・グラフ・関数(SUM等)・ショートカットキー 中級:VBAをマクロの記録で使える・ピボットテーブル・関数(indirect・row・ifやvlookupを入れ子で使える)・検索が出来る・オートフィルタ・シリアル値を理解している 上級:VBAをマクロの記録無しで使える・関数(clean・char)・論理和論理積を使える・エクセルの仕様(バグ)を理解している 一般的にはこの程度だろうな このスレならVBAのマクロの記録ができて初級者、配列やAPIを理解できればで中級者ってところか
768 :
デフォルトの名無しさん :2009/04/19(日) 09:22:22
COM(CreateObject関数)を使いこなせる、くらいが上級者じゃね?
私は操作方法はあまり知らないけど 表計算の「腕試し問題」を解くのは得意な頭の良い初心者です。
自分で頭の良いなんていっちゃった
釣りだろう
VSTOを一通り使っている、というのも上級者の条件かもしれない。 プライマリ相互運用機能アセンブリ使うのと似たようなものと考えているけど、 実際使ってみたら結構違うんだろうなあ。
773 :
デフォルトの名無しさん :2009/04/19(日) 12:50:30
また、vba初心者ですが教えてください。 9時前なら、A処理を行うを次のとおり、if文を書いたのですが、判別文が 効いてません。直してください、よろしくおねがいします。 ntime=Now If ntime <= TimeValue("09:00:00") Then A処理 End if
仕事によって使うObjectが違うから、COM必須とは言い難いけど、 COM使いこなせれば、ほとんどのVBA技術はググって調べられるだろね。
>>773 TimeValueの返す日付は、1900年1月1日か2日あたりになるだろうから、
その条件を満たすことはほぼ無いだろ。
ntimeからも時間の部分だけ取り出さないと。
776 :
773 :2009/04/19(日) 13:36:58
サンクス。おかげで、Dim ntime As Dateとしていましたので、 ntime=Now を ntime=Time と修正したらうまくいきました。
>>711 で質問した者です。
VSTO+clickonceについて調べてみたんですが、さっぱりで。。。
ほとんど初心者なんですが、理解しやすいHPがあったら教えて頂きたいのですが、宜しくお願いします。
778 :
デフォルトの名無しさん :2009/04/20(月) 10:18:32
シートのコピペで値だけにしたいのですが、 Selection.Copy Selection.PasteSpecial Paste:=xlValues この方法だと、条件付書式は値だけにならない事が分かりました。 条件付書式も同様に値に変更する方法ありますでしょうか?
文字列の中から複数の yyyy/mm/dd HH:MM:SSを取り出したいのですが 上手い方法はないでしょうか? 例) 2009/04/10 13:55:32 会議出席 2009/04/11 15:30:22 会議終了
780 :
デフォルトの名無しさん :2009/04/20(月) 12:11:14
>>779 ワイルドカード使って検索すればいんじゃない
>>778 Sub Macro3()
Range("B1").Select
Range("c1") = WorksheetFunction.Text(Selection, Selection.NumberFormatLocal)
End Sub
text関数に一回入れてしまえば良いんじゃないかなぁ
宜しくお願い致します。コピーし貼り付ける、という簡単なコードですが、 これをontimeメソッドを使い、時間になったら実行、というコードを作りました。 しかし、時間になってもならず困っております。コードは下記です。 Sub RSS最終気配値をコピー貼付() Range("CV27:CV320").Select Selection.Copy Range("CU27:CU320").Select Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False End Sub =================================== Sub RSS最終気配値時間で実行() Application.OnTime TimeValue("13:12:57"), "RSS最終気配値をコピー貼付" End Sub 以上です。コードのどこかにミスが無いか確認したのですが、分かりませんでした。 ご指摘の方宜しくお願い致します。OSはXP,excelは2003になります。 宜しくお願い致します。
TimeValue("13:12:57")が返す値とは、1899/12/30 13:12:57 →Debug.Print Format(TimeValue("13:12:57"), "yyyy/mm/dd hh:mm:ss") そんなのとっくの昔に過ぎ去っていて、PCの時計を弄らない限り二度と訪れない だから当然実行もされない 今日の13:12:57なら、Date + TimeValue("13:12:57") →Debug.Print Format(Date + TimeValue("13:12:57"), "yyyy/mm/dd hh:mm:ss")
>>784 783です。謎が氷解しました!!!
教えていただけなかったら、自力ではずっと分かっていなかった思います。
>TimeValue("13:12:57")が返す値とは、1899/12/30 13:12:57
これがサッパリ分かっていませんでした。dateが必要だったのですね(汗
教えていただき大変助かりました。
本当に有難うございます!
ウォッチウィンドウとか使うといいよ
(汗
ステップ実行中にローカル変数のウォッチウィンドウの+をクリックすると Outlookの新しいプロファイルの作成が開いてしまいます 対処法をご存知の方いらっしゃいましたらご教授お願いします
789 :
788 :2009/04/20(月) 20:55:24
環境はXPSP3+Excel2003です。
それ、俺も数日前になったわ。Outlook入れていないのに。 修正パッチ絡みで何かあったのかね?
791 :
デフォルトの名無しさん :2009/04/20(月) 21:57:27
ご指導お願いします エクセルで 毎日16:50 にコピー&貼り付け をするにはどうすればよろしいでしょうか
793 :
デフォルトの名無しさん :2009/04/21(火) 07:51:19
>792 すぐ上にあったのですね ありがとう一度試してみます
794 :
デフォルトの名無しさん :2009/04/21(火) 21:36:53
Excel2007でシート1に 黒澤明 七人の侍 木下恵介 笛吹川 周防正行 変態家族兄貴の嫁さん 黒澤明 乱 これをVBAかExcelの機能を使って シート2に 黒澤明 2 木下恵介 1 周防正行 1 みたいに集計を出したいのですが そうすればいいのでしょうか?
そうしてください。
COUNIF
C言語でなら分かるのですが、VBAでの書き方が分からないって場合ここで質問して大丈夫でしょうか?
いいよ
801 :
デフォルトの名無しさん :2009/04/22(水) 15:19:13
質問させてください。 現在の環境は WindowsXP Excel2003 なのですが CDOを利用したメール送信で、SMTPサーバにMicrosoft exchange server のサーバを使用することってできますか? また、できるのであれば、その指定方法を教えていただきたいです。
>>801 Microsoft exchangeのメール機能はSMTPと互換性がないので無理
>>800 それではお言葉に甘えて
iはループ用の変数
A,Bはセルから読み込んできた値
xは操作を加えたいセル上の値です
for(i = 0; i <= A; i++)
{
if(x < B * (i+1) )
{x = x - (B*i);
break;}
}
という操作をしたいです。
お願いします。
Dim i As Long Dim A As Long Dim B As Double Dim x As Double ' セルから値を取得 A = Range("A1").Value ' A1セル B = [A2] ' A2セル x = Cells(3, 1).Value ' 3行1列目(A3)セル ' お望みの処理(たぶん) For i = 0 To A If x < B * (i + 1) Then x = x - (B * i) Exit For End If Next i ' xをセルに代入 Range("A3").Value = x
>>805 ありがとうございます。うまくいきました!
因みにこれを行数がたくさんあるデータにあてはめたい場合は(例えば100行まであるデータに当てはめる)
Dim i As Long
Dim j As Long
Dim A As Long
Dim B As Double
Dim x As Double
' セルから値を取得
A = Range("A1").Value ' A1セル
B = [A2] ' A2セル
For j = 1 To 100
x = Cells(j, 2).Value ' j行2列目(Bj)セル
For i = 0 To A
If x < B * (i + 1) Then
x = x - (B * i)
Exit For
End If
Next i
' xをセルに代入
Cells(j, 2).Value = x
Next j
このような感じの書き方で大丈夫でしょうか?
さらに行数が未知のデータに適応させる(空白のセルを判定?してその手前のセルまで上記の操作を適応させる)にはどのようにしたらいいでしょうか?
>>806 複数行対応はすれでOK
末行取得は
For j = 1 To Cells(Cells.Rows.Count, 2).End(xlUp).Row
一つのメソッドの中でセルの指定の仕方がこうも違うと逆に爽快だな!
何故cellsで複数行指定できるようにしなかったんだろう 第三引数で列数、第四で行数選べるようにすればよかったのに RANGEめんどくさいよrange
>>809 そういうときにRange使う奴はバカ
普通はResize使う
Cells(3, 4).Resize(5, 6)
これでCells(3, 4)を基準に5行6列範囲だ
1000行ぐらい(実際の行数は可変、1行の幅も微妙に可変) あるデータがあるんですけど 印刷範囲の設定、具体的には改ページを綺麗にいれていく方法ってないでしょうか?
行の幅が取れるんだから計算すればいいんじゃないの
>>811 「綺麗」ってのは主観なのでプログラミングできない。
客観的な基準、ルールが必要。
>>811 rowheightを足して行って、○○になったら改行ってやればいいと思うよ。
改行じゃなくて改ページだろ
817 :
デフォルトの名無しさん :2009/04/23(木) 12:47:02
具体的には1ページに印刷できる行数が知りたいわけです
マージン設定でも全然違ってくるし、 行の高さによっても全然違うだろよ。 改ページプレビューで、デフォルト何行で改ページされてるか数えればいいじゃん。
819 :
799 :2009/04/23(木) 15:53:14
>>807 ありがとうございます。
若干目標と違う結果になってしまったのでEnd(xlDown)でやってみました。
>>808 >一つのメソッドの中でセルの指定の仕方がこうも違う
値取得の際にRangeとCellsが混じっているということでしょうか?
これは統一できるところは揃えた方がいいのですか?
>>809 改善方法があるようでしたらご教授いただきたいです。
申し訳ありませんが初心者なので出来ましたら具体的にお願いします。
Dim a(2, 2) と配列宣言し、fornext等で処理を行い、配列に値を格納しました この値をセル(A1:C3)に入れるにはどうすればよいでしょうか? fornextでcells(i,j)等とし、配列の値を順次入れていくんでしょうか
>>820 Range("A1:C3").Value = a
>>820 エクセルのワークシートは2次元配列を視覚化した物だから、
2次元配列と凄く相性良いから覚えておくと良いよ。
複数シート使えば3次元配列も簡単に展開できるしね。
.NETとかで制御するときは、アウトプロセスで呼び出しコストが高くなるから、 二次元配列で大量のデータを一気に転送できるこの方法は特に重要だな。 VBAでも速度を稼ぎたければ十分使う価値はある。
825 :
デフォルトの名無しさん :2009/04/23(木) 20:20:20
セルに書き込む度に一斉描画が始まるから 一度拡大率を最大にして書き込んで元に戻すと超速いよ そんなことしなくても描画更新停止ってある?(笑)
とうとう俺がVBAに本気だすことになったから。 一応言っておく おまえらチビるなよ
827 :
デフォルトの名無しさん :2009/04/23(木) 20:36:20
教えてほしいんですが Function Test(arg1 , arg2) End Functionと会った場合 Test("aaa" , "bbb") と実行するとエラーになってしまいます 引数が一つなら問題なく動くのですが 二つになるとどうしても動かなくなるんでしょうか?
わからねぇ。 あきらめろ
>>827 Function Test(arg1 As String, arg2 As String)
End Function
か?
830 :
デフォルトの名無しさん :2009/04/23(木) 21:14:09
>>829 コンパイルエラー:
構文エラー
になります
>>827 Call Test("aaa" , "bbb")
Test "aaa" , "bbb"
Dim ret
ret = Test("aaa" , "bbb")
もしかしてこういうことかも
つーか、エラーが出たって言う奴は、なんでどういうエラーが出たか書かないんだ?
>>825 Application.ScreenUpdating = Falseでも不十分?
worksheetを使うのに、なぜworksheetsコレクションを使わないと駄目なんですか?
特に重要というか普通に使うレベルじゃないの? むしろ違うやり方を聞きたいくらいだ。 forでまわして1セルずつとか言って笑わせんなよ?
>>833 コレクションはオブジェクトの集まり
いっぺんに処理できた方が便利なことが多いからコレクションが使えるようになってる
初心者は知らずにループ回して一つずつ処理することがある
ワークシートをコピーする コピーしたワークシートに好きな名前をつける ここまではできるのですがワークシート名に任意の日付をつける事は できないでしょうか?1日や20090401など日付ならとくに表示形式にはこだわらないのですが
>>837 指定した場所にコピーされる訳だ。
コピーされたシートの場所は、indexで調べられる。
日付を取得する。
sheets(X).name = 日付
で名前を変更出来る。
コピー先+1の名前変えても良いし、好きにやって良いんだぜ。
ありがとうございます。 がんばってみます
>>832 やっぱ、あるんだ・・・そうだよねw
ありがとうございます
明日、試してみます〜
Private Sub CommandButton2_Click() Dim a Dim i As Long, j As Long, k As Long a = Range("a1:k100") For i = 2 To 15 For j = 2 To 15 If a(i, j) = 0 Then End If Next Next End Sub If a(i, j) = 0 Thenでインデックスの範囲を超えていますとエラーてが出ます・・ 助けてください!
842 :
841 :2009/04/24(金) 13:43:09
すいません解決しました k列(12列目)を超えてるってことなんですね、失礼しました
IE8にしてからVBA内のinnerHTMLが認識されなくなってしまったのですがこういうものなのでしょうか 何かいい解決法があれば教えて欲しいです… よろしくお願いします。
> VBA内のinnerHTML って何? COM(CreateObjectや参照設定するやつ)の話じゃなくて?
InnerHtmlは文字列からURLのみを取り出す命令です。 この際言ってしまいますが、この問題が出るのはAozoraGetterという青空文庫にあるファイルを一括でダウンロードするという excelのマクロを利用したアプリケーションです。 IE6の頃にはちゃんと動作していたのに IE8にアップデートしてからは何故かマクロがうまく動作してくれません。 何故うまくいかないのかデバッグで確かめてみるとどうやら >HTMLソース = IEオブジェクト.Document.Body.InnerHtml がIE8だと対応できていないようなのです。そんな命令知りませんみたいな事を言われます。
IEオブジェクト、及びその下位メソッドなどの使い方についてはスレ違いだよ。
>>1 ★3★4
それはCOMコンポーネントっていうVBA用ってわけじゃない汎用コンポの質問になるからね。
それとinnerHTMLの提議も間違ってるから、ちゃんと勉強しようね。
「innerHTMLで出来ることの1つ」と「innerHTMLは〜です」という提議は別物だからね。
変数名の一部に変数を使うことってできますか? Counter = Counter + 1 "hoge" & Counter = バリアント型のデータ hoge1 hoge2 hoge3と処理したいんです。
Counter = Counter + 1 hoge(Counter) = バリアント型のデータ
849 :
デフォルトの名無しさん :2009/04/28(火) 05:38:00
WindowsXP、Excel200でVBAの勉強をしています A1に1 A2に2 A3に3、、、と入力した際に A1からA3までの数字を足してC1に合計を表示するVBAを作ってみたのですが Aの列に入力するたびにアクティブセルがC1になってしまうようになってしまいました 処理が終わったら自動的に直前まで作業していたセルに戻ってくるようにしたいのですがどのようにしたらいいのか教えていただけないでしょうか よろしくお願いいたします Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1:A10")) Is Nothing Then Exit Sub Else Dim Counter As Integer Dim Total As Integer Total = 0 Counter = WorksheetFunction.CountA(Range("A1:A10")) Range("A1").Select For i = 0 To Counter - 1 Total = ActiveCell.Offset(i, 0).Value + Total Next Range("C1").Value = Total End If End Sub
間違えていました 誤Excel200 正Excel2000 誤アクティブセルがC1になってしまう 正アクティブセルがA1になってしまう でしたごめんなさい
> Range("A1").Select
これはわかってるかも知れないが、セルをSelectしたらアクティブセルも変わる。
単一セルのSelectは、「Range("A1").Activate」と同じだからね。
とりあえず質問の件の目的を達するだけなら
Range("A1").Select
を消して
Total = ActiveCell.Offset(i, 0).Value + Total
↓
Total = Range("A1").Offset(i, 0).Value + Total
もしくは
For i = 0 To Counter - 1
Total = ActiveCell.Offset(i, 0).Value + Total
↓
For i = 1 To Counter
Total = Cells(i, 1).Value + Total
かな。
直前まで作業していたセルに『戻る』のではなく、最初からアクティブセルを変更せずに処理を行う。
どうしても途中でアクティブセルを変更する必要があって後から戻したいなら、処理に入る前(Total = 0の前当たり)に
Dim bActiveCell As Range
Set bActiveCell = ActiveCell
というように処理前のActiveCellを変数に保持して、処理が終わったて(Range("C1").Value = Totalの後当たり)から
bActiveCell.Activate 'と、『処理前に保持したActiveCell(bActiveCell変数)』をアクティブにする命令を出す。
まぁ、ぶっちゃけこのコードなら
If Not Intersect(Target, [A1:A10]) Is Nothing Then [C1].Value = WorksheetFunction.Sum([A1:A10])
の一行でも事足りると思うが、
>>849 はテスト段階で、実際にやりたいことは違うんだろうからな。
他にもいろいろ言いたいことはあるが、少しずつ覚えていったらいいさ。
君は、ちゃんと環境も書いてるし、コードも端折らず全部書き、まともな日本語で質問している優良質問者なのでこういうのは大歓迎だよ。
まともな人ならそんなの当たり前だと思ってくれるのだろうが、そんな当たり前のことが出来ない奴が多くてね。
こうじゃないのか? Private Sub Worksheet_Change(ByVal Target As Range) Range("C1") = Val(Range("A1").Value) + Val(Range("A2").Value) + Val(Range("A3").Value) End Sub
' Range("A1").Select For i = 1 To Counter Total = Cells(i, 1).Value + Total Next
' Range("A1").Select For i = 1 To Counter Total = Range("A" & i).Value + Total Next
Target.Select End Sub
>>851 詳しく書いていただきありがとうございました
処理前に保持したActiveCellを元に戻して上手く直前に戻ることができました
>>852 ありがとうございます
足すことが目的ではなく元のセルに返ってくる方法が何かないかと思い質問させていただきました
Dim R As Range Dim Total As Integer Total = 0 For Each R In Range("A1:A10") Total = R.Value + Total Next
>>857 Sub dd()
Dim r
Dim c
r = ActiveCell.Row
c = ActiveCell.Column
'処理
Cells(r, c).Select
End Sub
こんなんでいいの?
何でわざわざ余計なことするの?
861 :
デフォルトの名無しさん :2009/04/28(火) 15:49:02
選択された複数アドレスのコピーをする時、行でコピーするのは Selection.EntireRow.Copyで出来る事はわかったのですが、 列方向を使用している分だけをコピーすると少し時間短縮されるので 列方向を(下記例だとA〜H列に)変更する方法がありますでしょうか? 例1)選択アドレス[$C$2:$C$3,$C5] -> [$A$2:$H$3,$A$5:$H$5] 例2)選択アドレス[$2:$3,$5] -> [$A$2:$H$3,$A$5:$H$5] 例3)選択アドレス[$C$2:$D$3,$C$5:$D$5] -> [$A$2:$H$3,$A$5:$H$5]
いまいち分からないんだけど、行全部じゃなくて使用している部分だけをコピーしたいって事かな? SpecialCells(xlLastCell) → Ctrl+Shift+End や CurrentRegion → Ctrl+Shift+: とか cells(1,256).end(xltoleft).row あたりで 最終の列を取得するなんてどう?
>>861 Debug.Print Intersect(Selection.EntireRow, [A:H]).Address
Excel2007で並べ替えの記録マクロをとると、2003までとは全然違う見たこともないようなコードになっています。 2003と同じような記録マクロを取る方法はないですか?
質問です。 例えばセルに、1,15,30,31と入ってとします。 それを各数字を分けて認識するにはどうしたらよいのでしょう? stringに入れてそれを指定の区切り文字単位で 走査する方法があるのでしょうか?
splitで配列にぶち込む
>>865 dim var as variant
var = split(cells(1,1),",")
>>864 思うに、見たことのないマクロとは「excel4macro」のことではなかろうか。
2007ではマクロの記録に、このexcel4macroが所々出てくる。
ここの常連さん達は消える運命と教えられた人が多い。
通常のvbaに書き換えることはできるけれど、設定等で長くなるから、そのまま
使うのが、ベストと思う。
「excel 4macro」で検索してみて、その後、その部分だけアップして翻訳依頼してみたら
どうでしょうか?
もれ追加 excel4macroで記述されないように設定することができるかについては 折れにはできなかったとしか答えられません。 おそらく、復活したので、これが優先されるようになっていると考えています。
OS:WindowsXP Pro バージョン:Excel 2000 作成したデータをテキストに出力するVBAを組んでいますが、保存名のところでつまづいています。 ネットで調べると、保存ダイアログを表示させて保存する方法が載っていたのですが A1のデータ + ".txt" という具合に保存名が決まっているので、ダイアログを表示せずに保存ができると思い cnsFILENAME = A1 & ".txt" 上記のように指定しましたが、定数を入れなければならないのでエラーを吐いてしまいます。 うまいこと保存名をどこかのセルから取得する方法はないでしょうか?
BASICなんだから Open して Write# か Print# して Close するのが基本でしょう? なにやってんの?
cnsFILENAME = A1 & ".txt" ActiveWorkbook.SaveAs Filename:=consFILENAME,FileFormat:=xlCurrentPlatformText FileFormatが無くても保存できそうなんだけど
cnsFILENAME = range("A1").value & ".txt" ActiveWorkbook.SaveAs Filename:=cnsFILENAME,FileFormat:=xlCurrentPlatformText ちょっとだけ修正
cnsって何だよ
876 :
864 :2009/04/29(水) 20:32:18
>>868 記録マクロは下のようコードだけど、これって化石マクロ?
メソッドじゃなくオブジェクトになっちゃってるみたいね。
' Macro1 Macro
'
'
ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add Key:=Range("A2:A6"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet2").Sort
.SetRange Range("A1:B6")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
>>867 ありがとうございます。
試してみます。
>>877 その予測は誰でも最初によぎるが、定数として使われてるのではなく
A1セルの内容によって変動する変数として使われてるから聞いているのでは?
じゃあ チェンジ ネーム スンゲー の略
881 :
868 :2009/04/29(水) 23:32:29
>>864 全く、普通のマクロですw
見慣れないのはどこでしょうかと訊く気もしませんので、退散します。
VBAを学び始めたきっかけは、何ですか?
モテるから
884 :
870 :2009/04/30(木) 02:17:52
>>874 レスが遅くなりましたが、ありがとうございました。
886 :
861 :2009/04/30(木) 12:04:06
>>862 >>863 ありがとうございます。
Intersectで出来たんですね、勉強になりました。
>>888 On Error Resume Next
質問です。 Dim wSheet As Worksheetと宣言し、 最終的にはこのwSheetに 「
ミスりました。。。 Dim wSheet As Worksheetと宣言し、 最終的にはこのwSheetに 「Workbook("test01.xls").Worksheet("test02")」と入力しようとしてます。 ただ、「01」「02」の部分はstring型の変数に入っているので、 Set wSheet = "Workbook(" & """" & "test" & num1 & ".xls" & """" & ").Worksheet(" & """" & "test" & num2 & """" & ")" と書いています。 これではエラーが出てしまい、何がいけないのか分かりません。 上記のように、途中変数等をはさんでシート名をWorksheet型の変数に入れるにはどうしたらよいのでしょう?
文字列を代入したいのなら型はString Worksheetはオブジェクトなので文字列は代入出来ない。 コレクションのIndexには要素のNameを示す文字列を使用出来るので以下の表記が正解 Set wSheet = Workbooks("test" & num1 & ".xls" ).Worksheets("test" & num2)
>>892 ありがとうございます!
意味も分かりやすく助かりました!
Sub 四則演算() a = 10 a = a ^ a MsgBox a, Title:="10の二乗は?" End Sub 1時間前から勉強し始めたのですが、 答えが100になりません。 どこが間違ってますか?
>>894 こうかな?
Sub 四則演算()
a = 10
b = a ^ a
MsgBox b, Title:=a & "の" & a & "乗は?"
End Sub
aが10なんだから a = a ^ a は10の10乗だろ aの二乗なら a = a ^ 2 VBA以前に中学校数学の問題 因みに冪乗は四則演算じゃないからね 加減乗除の4つが四則で、冪乗(10の3乗=1000 とか)、冪根(9の平方根=3 とか)は含まれない
898 :
デフォルトの名無しさん :2009/05/01(金) 18:46:20
OSがMacOSX、Office2004なのですがアドバイスをいただきたいと思い質問させていただきました
VBAを利用してEXCELのセルA1などに本日の株価を表示させたいと思っているのですが
ソースを取り込む方法がわからないでいい方法がないか探しているのですがなかなか見つかりません
http://stocks.finance.yahoo.co.jp/stocks/detail/?code=6501 からソースを取り込み
正規表現でマッチングしていけば 本日の現在値である345をえることができると思っているのですが
VBAのハイパーリンクの機能などを使ってソースを取り込むいい方法はないでしょうか?
OSがマックということもありVBAの基本的な機能は使用できるのですがIE周りの機能が使えないのですが可能でしょうか?
スレ違いかもしれませんがWindows2000+Office2000だとこうすればIE使わないで可能だよなど
アドバイスがありましたらよろしくお願いいたします
>>898 Webクエリ
上記では出来ることがかなり限られてくるが
それ以上のことがしたい場合はスレ違いになるのでよろしく
>>1 ★3
教えてください スクロールボタンを直接シートに貼ろうとしてもできません エクセル2002で 表示-ツールバー-コントロールツールボックス-デザインモード ここまではできたのですが選択後ドラッグできません なんか設定があるのでしょうか
>>902 全部だめ
やり方はopenofficeでいけたのであってると思います
色変わるのかないけるとき
>>903 寝言は寝て言え。
OpenOfficeでできたから、Microsoft Excelでもできるって
どんな脳内理論だよ。
905 :
902 :2009/05/02(土) 00:28:08
ドラッグ&ドロップじゃなくて、選択してドラッグ もれのExce97だとね
いや普通にマニュアル通りでopenのほうは できたってことだよ
>>898 スレ違いなので詳しく説明しないけど,VBAじゃなくてAutomatorでできるよ。
908 :
デフォルトの名無しさん :2009/05/02(土) 20:29:15
質問です、お願いします。 VBAを使って あるサイトにいって”自動ログイン”って可能ですか?? 詳しい方おしえてください。おねがいします。
余程特殊なログイン方法でない限り可能です。
スレ違いなので具体的な方法の説明は伏せますが
>>1 ★3,4
910 :
デフォルトの名無しさん :2009/05/02(土) 20:36:55
このスレのユーザーの方でMSのVBA資格受けた人いますか? 自分は昨日からVBA勉強し始めたのですが、腕試しに受験しようかなと思ってます。 良かったら受験記お願いします。
昨日から勉強となると、流石に厳しいかもなぁ・・・。 他言語やってても、試験の内容のレベルまで到達するのに半年近くかかったよ・・・。
それはレベルが低すぎないか?
「やさしくわかる Excel VBAプログラミング 第3版」 今、読了。 自分は飽きっぽいので、興味が冷めないうち、 GWの間に更に完成度を高めたい。
917 :
デフォルトの名無しさん :2009/05/04(月) 12:45:51
VBAエキスパートなんて資格があるのか なんかExcelとAccessだけみたいだけど 資格はどうでもいいんだけど、教える時の体系だったあんちょこを探してたのでこれは役立つ、のかな?
918 :
デフォルトの名無しさん :2009/05/04(月) 17:31:04
WinXP,Office2003を使用しております。 元々あったエクセルのファイルを使いやすいものにしようと思い 標準モジュールを挿入して sub A、sub B、function Cの3個の関数を作成し A、B両方からCを呼び返り値をそれぞれのセルに代入すると言うVBAを作成しました。 ただオリジナルをいきなりいじるのは怖かったのでバックアップを弄るようにしました。 問題なくバックアップの方でマクロの実行ができましたので オリジナルの方に移植しようと 標準モジュールを挿入してコードをコピをしてマクロの事項をしてみたところ function Cで 「コンパイルエラー:ユーザー定義型は定義されていません」とエラーが出るようになってしまいました。 これを解決するいい方法はないでしょうか?
参照し忘れている予感
920 :
デフォルトの名無しさん :2009/05/04(月) 17:54:48
おおお 本当だ、、、、、 参照ってエクセル自体じゃなくてファイル毎に設定されてるんですね 勉強になりました 2時間ぐらいなんでだろと悩んでたもやもやが消えました!
ファイルっつーよりWorkbookみたいな?
Sub speakmsg() Dim strSpeech As String Application.Speech.speak "Hello !" strSpeach = "Excel VBA World !" Application.Speech.speak strSpeach End Sub で、” ” に、ひらがなを入れると喋ってくれないのですが、方法はありませんか?
日本語対応の読み上げソフトインストールする
XPならコントロールパネルの音声認識の 音声合成の音声の選択を けんじかなおこにしないと駄目 みたいよ
VBA初心者ですが、宜しくお願いします。 ver:Office 2000 新しいパスワードをつけるマクロを実行すると「実行時エラー438 オブジェクトは、このプロパティまたはメソッドをサポートしていません」となります。 ソースはここです↓ ActiveWorkbook.Password = "TEST" ほかの端末(office2003)では実行できるのに何故でしょうか
PasswordというメソッドがOffice2000では使用できないからじゃないの?
>>926 ありがとうございます。
解決しました。
ActiveWorkbook.SaveAs Filename:=myFilename, Password:="TEST"
にしました。
'ROUND2 関数 '数値を四捨五入して指定した有効桁数にします。 '書式 ROUND2(数値, 有効数字の桁数) '数値 四捨五入の対象となる数値を指定します。 '有効数字の桁数 数値を四捨五入した結果の有効数字の桁数を指定します。 Function ROUND2(aa, nn) '数値を任意の有効桁数に四捨五入する ActiveSheet.ActiveCell.NumberFormatLocal = "0.000" ROUND2 = Application.Round(aa, -Int(Application.Log(Abs(aa))) - 1 + nn) End Function 有効数字に四捨五入する前に、セルの書式を変えたいのですが、 計算させてみると#VALUE!となります。 どういう風に書けばよいのでしょうか?
>>928 念のために聞くけど、例えば3.14の有効桁数はいくつだと考えている?
有効桁数ってなんでしゅか?
>>928 ワークシート関数Round()との違いは何?
>>929 3桁です。
>>932 ワークシート関数ROUND()は
=ROUND(0.105,2) → 0.11
=ROUND(0.0955,2) → 0.1
=ROUND(9.55,2) → 9.95
となるのに対して、
=ROUND2(0.105,2) → 0.11
=ROUND2(0.0955,2) → 0.096
=ROUND2(9.55,2) → 9.6
と有効桁数を揃えることができます。
ただ、
=ROUND2(9.55,4) → 9.550
のはずが、末尾の0が表示されないので9.55になります。
セルの書式を弄れば良いのではと思い、試しに小数以下第3位まで表示するため、
ActiveSheet.ActiveCell.NumberFormatLocal = "0.000"
としました。
>>928 ユーザー定義関数からセルの書式を変えることはできない。
どうしても表示桁数を変えたいなら文字列にするしかない。
ユーザー定義関数の中で使用できないメソッドを使ったから#Value!エラーが出た。 そういうこと。
ActiveSheet.ActiveCell.NumberFormatLocal = "0.000" Application.ActiveCell.NumberFormatLocal = "0.000" または、ActiveCell.NumberFormatLocal = "0.000"
>>933 指数表示にすれば解決。
ていうかそれ以外の解決方法はない。
教えてください。 ActiveSheet.Range("a3:c7").Rows(5).Interior.ColorIndex = 3 5行目だけじゃなくて、5行目から10行目まで,塗りつぶすにはどう書いたら良いですか?
range(rows(5),rows(10)) で良いのでは?
>>939-940 ありがとうございます。
小出しにして申し訳ないのですが、
A列からC列の5行目から10行目だけを塗るつぶすには、どう書けばいいですか?
ActiveSheet.Range("a3:c10").Range("a5:c9").Interior.ColorIndex = 3 すいません,できました。 ↑でいいんですよね?
Range("a3:c10") は何のためにあるの? ActiveSheet.Range("a5:c9").Interior.ColorIndex = 3 でいい気がする。
質問です。 i = 1 Do While i < endYline 'endYlineは最終行 Worksheets("Sheet1").Range(Cells(i, 1), Cells(i, 10)).Copy _ Destination:=Worlsheets("Sheet2").Cells(i, 1) i = i + 1 Loop 上記のようにSheet1からSheet2へ1行ずつ10列分のコピーをしているのですが、 「表示しない」で表示を隠している行までコピーされてしまいます。 表示していない行はコピーしないようにするにはどうしたらよいでしょうか。 よろしくおねがいします。
>>944 Range( ).EntireRow.Hiddenプロパティで行ごとに表示されているかどうかチェックできるので、
1行ずつ非表示かどうか調べながらコピーする。
946 :
944 :2009/05/08(金) 00:30:30
>>945 できました!
即レスありがとうございました。
>>945 すいません,横レスですが、そういうことが分かるようになるまで、どれくらい勉強しましたか?
同じ経験をして 解決方法を考えて Hiddenプロパティを見つけて解決し覚える。 若しくは解決するためにネットで調べて方法が書いてあり覚える とにかく一定期間勉強すると分かるというよりも、問題があるときに調べて覚えるので 調べ方を覚えれば「そういうことが分かる」ようになったと言えるのではないでしょうか。
>>948 どうもありがとう。
自分は4月から勉強し始めました。
文を読めば、どういう処理をするのか想像できるようになったのですが、
”こういう処理をする文を書け”という問題になると、
どうしたら良いのかがわからない時が多いもので、
勉強の仕方が間違っているのかと思って、お尋ねしてみました。
どうもありがとう。
>>947 VBAを使うようになって2年ぐらい。
とくに勉強したわけじゃなく
わからない→ぐぐる、の繰り返しで
基本はサンプルのコピペだから
ちっょと難しいプログラムはお手上げ。
951 :
933 :2009/05/08(金) 01:23:49
勉強不足で申し訳ありませんでした。 ユーザー定義関数からセルの書式を変えることはできないんですね。 次は、文字列でやってみようと思います。 みなさん、本当にありがとうございました。
Rangeのプロパティ、メソッドを一通り目を通せば意外と使えるものがある。 すぐに役立つかどうかはわからないけどお薦めするよ。
今から必死に練習すれば野球選手あるいはサッカー選手になれるのか? と自分に問えば、答えはNOに決まっている。 それなのに、なぜプログラム言語を学べばどこかに採用されるはずだと思っているのだろう? それなりに何年かその職種で頑張ってきた人たちでさえ、求職に苦労しているのに、 未だ何のキャリアもなく、定職に就いた事も無い自分が採用される可能性など万に一つもないはずなのに。。 こんな事はすぐわかる事なのに、俺みたいに外部とのつきあいが無いと、 助言してくれる人がいないから、なかなか気づけずにただ無駄に時間だけを無駄遣いしてしまう。 やっぱり、俺には肉体労働か単純労働しかないのか?
質問です。 Application.GetOpenFilenameでExcelファイルを開き、 開いたExcelファイルのどのワークシートに対してマクロ機能を使うかという処理なのですが、 シート名を選択するような方法はないでしょうか? メッセージボックスで「マクロ機能を使いたいシートをアクティブにして下さい。」のように表示し、 手動でアクティブにした後、コマンドボタンを押したら・・・というのは考えられるのですが。 Excelファイル開く→シート名が一覧で表示される→任意のシート名を選択する のように一連の動作としたいです。 よろしくお願いします。
955 :
デフォルトの名無しさん :2009/05/09(土) 02:54:07
開かれたブックからシート名をすべて取得してユーザーフォーム。 Inputbox に文字でシート名と番号を表示して、番号を入力させるちょっと見た目ショボイ方法でもいいかも。 ※左下のタブ表示移動の三角を右クリックするとシートが多いときに出てくるダイアログは Application.Dialogs では出せなかった。
for each sht in thisWorkbooks.Sheets debug.print sht.name next でシート名を引けるからリストボックスなりにアイテム追加すればいい
>>955 >>956 レスありがとうございます。
やはりユーザーフォームを使うしかないのですね。
GetOpenFilenameのようにシート選択も標準メソッドとしてあったらよかったのですが・・・
シート名を取得してユーザーフォームに表示する方法で進めてみます。
アドバイスありがとうございました。
>>953 >未だ何のキャリアもなく、定職に就いた事も無い自分
確かにそうだろうが、好きなら趣味でやれば良い。
好きでもないのに、義務感?でやってるなら、他の事をすれば良い。
>>953 野球選手やサッカー選手って、0歳から教育してたとしても、
なれるのは更にそのごく一部だよな。
ピアニストやバイオリニスト考えても、子供の内から学んでも、
音大行ける奴はごく少数。更にプロになれるのは更にそのごく一部。
まず、比較対象を間違えてる。
事務系の仕事でサッカー上手かったり、ピアノ弾けたとしても、ちょっとモテル程度。
でも、事務系の仕事でVBAが少しだけでも分かれば、それは仕事面でのプラス。
断言しておくよ。職場にExcelがある仕事で、VBAを覚えておいて損な事は無い。
もしプログラムが苦手で、自分で組むのが得意じゃないとしても問題ない。
プログラマーに依頼するにも知識は必要だからね。
その言語が出来る事、向いてる事、出来ない事。
これを知るだけでも仕事上では役に立つ。
作るのは出来る奴にやらせりゃいいんだよ。
>>953 経験が無い方が、逆に変な癖とか無いし企業側としては教えやすいっていう場合もありますよ。
生半可な知識持ってるとタチが悪いのも結構あります。
就職活動は行動する前に自己完結せずに行動を起して判断は相手に任せればいいのです。
961 :
デフォルトの名無しさん :2009/05/09(土) 12:38:08
>>953 毎日10時間を10年続ければその道のプロになれます
よく阿呆な大人は脳波年を取ると動かなくなると言いますが
あれは嘘です
脳は年齢に関係なくしっかり動きます
ただ自分には無理だと思う人には無理です
とりあえずスレタイを読み直そうぜ。
10年続けるのかあ 10年後にVBAが使われてるかどうか… 使われてるだろうなあ。 昔あった2000年問題も「このボロコンピュータがそんな先まで使われてないだろう」って 思い込んでしまったのが原因だし。
>963 Excel97 がでてからもう10年以上たってるし、 この先も使われるだろうね…
>>953 です。
昨日、夜中にスレ違いな書き込みしてすみませんでした。
レスしてくれた方々、ありがとうございました。
久しぶりに庭で蛇を見たw
何度も質問してすみません。 標準モジュールでフォームのPrivate Subプロシージャの真偽を判定したい場合は、 標準モジュールでpublic変数を宣言し、Private Subプロシージャ内でpublic変数に真偽を設定し、 それを標準モジュールで判定するという方法しかないでしょうか? よろしくお願いします。
>>966 処理の結果を一つだけ別のプロシージャに返したい場合はSubじゃなくてFunctionの方を使うのが普通。
結果が複数ある場合は参照渡しをする。
変数でPublicを使うのはできるだけ避けた方がいい。
そういう話じゃなくて?
>>968 解りづらい説明で申し訳ありません。
問題としていることは、
・標準モジュールよりUserForm.Showでフォーム画面を開く
・コマンドボタンのクリックイベント「はい」または「いいえ」を押すと、Unload Meをしフォーム画面を閉じる。
・標準モジュールに戻ってきたが、「はい」か「いいえ」のどちらでフォーム画面を閉じたのか解らない
という感じです。
標準モジュール内で値渡しや参照渡し、Functionプロシージャによる戻り値は一通り理解したのですが、
標準モジュールからフォームへ上記を行うにはどうしたらよいのかと・・・
よろしくお願いします。
例えば str = msgbox(msg, vbYesNo) if str = vbYes then else end if ところで、コマンドボタンをクリックした時に、何かアクションさせないのかなあ?
じゃぁ どっかのセルに書き込めばOK
例えば if UserForm1.ActiveControl.Name = "ComamandButton1" then elseif UserForm1.ActiveControl.Name = "ComamandButton2" then end if
たびたび説明下手ですみません。 上の「はい」「いいえ」はあくまで例でして、実際にやりたいことは Sub マクロ() Call ファイル選択関数() Call シート選択関数() Call シート内検索関数() End Sub のように処理内容ごとに関数をわけてます。 2番目のシート選択関数で、シート名をフォームの コンボボックス及びコマンドボックスを使って抽出しているのですが、 抽出したシート名を3番目の関数でも使いたいのです。 Public変数を宣言しておいて、 2番目の関数のフォーム内でPublic変数にシート名を代入 3番目の関数でPublic変数名のシートを検索 という感じではとりあえず動きは問題なさそうですが、 Publicはあまり使わないほうがいいのかなと・・・
だから968が >変数でPublicを使うのはできるだけ避けた方がいい。 って書いてるやん まぁ出来るだけって事であって絶対使うなって事ではないし、あんたが作り易い方法で作れば 良いでしょ?
>>974 そうですね、すみません。
皆さんありがとうございました。
976 :
デフォルトの名無しさん :2009/05/09(土) 22:25:32
エクセル2003とXPを使用しています A1~Q1を右寄せに A3~Q3を右寄せに 、、、、、、 A49~Q49を右寄せに としたいと思っているのですが 現状Range(Cells(1 + i*2, 1), Cells(1 + i*2, 19)).HorizontalAlignment = xlRight をforでくくって複数回実行しているのですが マウスで操作するように A1~Q1、A3~Q3、、、、A49~Q49をまず選択して HorizontalAlignment = xlRightを1回実行すれば49まで一気に右寄せにできるいい方法はないでしょうか?
>>976 ループではRangeに渡す文字列を作るだけにして、ループを抜けてから
Rstr = "A1:Q1,A3:Q3,A5:Q5, … ,A49:Q49"
Range(Rstr).HorizontalAlignment = xlRight
978 :
デフォルトの名無しさん :2009/05/09(土) 22:55:51
>>977 サンクス
そうか文字列足せばいいんだ
無事1回の実行でやりたいことができました
今までは実行したら右寄せが終わるまで砂時計が出ててカクカクしてたのがなくなりました
>>977 それだと全部文字列書かないといけないジャン!
>>976 マクロ登録で複数選択して右寄せってやってみそ!
>>978 どうしても一発出来ないような処理の場合
ScreenUpdatingでカクカクは見えなくできるよ
981 :
デフォルトの名無しさん :2009/05/09(土) 23:29:00
range("A1:Q1")の範囲を拡張して
range("A1:Z1")に範囲を拡張したいと思ってるのですが
始点は変更せずに終点だけを変更するものって用意されているのでしょうか
>>979 マクロも便利ですね
こっちの方もちょっと勉強してみようと思います
ちょっと違うが Set extRange = Union(Range("A1:Q1"), Range("R1:Z1"))
>>981 A1を起点として変動する最終列のセルを求めるなら
LastC = Cells(1, 256).End(xlToLeft).Column
↑訂正 ×最終列のセルを求めるなら ○最終列番を求めるなら
>>981 「拡張」の意味がよくわからんが。
始点が変わらないなら Range("A1:Q1").Range("A1:Z1") みたいに書けば
最初のRangeの範囲の左上をA1とみなした相対的なサイズを指定したことになる。
>>976 単に奇数行を右寄せしたいだけなら
Sub Test2()
Dim bRow As Byte
Dim bCol As Byte
Dim bLastRow As Byte
Dim bLastCol As Byte
With ActiveCell.CurrentRegion
bLastRow = .Rows.Count
bLastCol = .Columns.Count
For bRow = 1 To bLastRow
If bRow Mod 2 <> 0 Then
For bCol = 1 To bLastCol
.Cells(bRow, bCol).HorizontalAlignment = xlRight
Next bCol
End If
Next bRow
End With
End Sub
じゃだめ?
インデントが無効になった・・・orz 見づら過ぎてすまん
>>977 のレスをちゃんとプログラムに起こすとこうなるかな。
Dim Rstr As String
Rstr = "A1:Q1"
For i = 3 To 49 Step 2
Rstr = Rstr + ",A" & i & ":Q" & i
Next
Range(Rstr).HorizontalAlignment = xlRight
そんな汎用性のないコードを書いちゃいかんよ。 Rangeで扱える文字数をオーバーしたらどうすんだよ。 試しに49を70にしてみなよ。
誰か汎用性のあるサブルーチンを要求する質問なんてしてたっけ?
代案のコードも示さずに文句だけ言うやつなんか無視しとけ 何の役にも立たんどころか質問スレにとっては単なる荒らしと変わらん
xlRight だが xlHAlignRight とは違うの?
なんで馬鹿は自分の馬鹿を認めないのかね。 普通にループすりゃいいだけだろうがよ。 いっぺんにやろうとするのに無理があるんだよ。
>>992 おまえこそ役にたたねーよ。
>>998 がダメなのが分らないならVBAなんてやめるんだな。
xlHAlignRightだよなあ でも内部コードは同じだからxlRightでも同じ結果になるんだよなあ なんでコンパイル通っちゃうんだろう
ふだん、「その関数は遅いから論外」「こっちの関数のが100ミリ秒速い」とか言ってる ベンチマーク狂の人に素晴らしい回答をお願いしたいところ
>>997 速いとか遅いとかじゃねーっだよヴォケ。
確実に動くことが大事なのが分らんの?
ヴァカにはわからんだろうね。
分るわけねーよ。2chなんだからw 質問者の言うことをなんでも聞けばいいと思ってるんだろう。 ループの方が確実と教えるだけの能力がないんだよ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。