1 :
デフォルトの名無しさん :
2006/06/27(火) 21:40:15
2 :
デフォルトの名無しさん :2006/06/27(火) 22:33:12
即死しそうだな
3 :
デフォルトの名無しさん :2006/06/27(火) 22:35:58
閑古踊りをおどろう
4 :
デフォルトの名無しさん :2006/06/27(火) 22:52:11
あるセルが名前付けされている場合、名前を調べるにはどうすばいいんでしょうか? Sheet.Cells(x,y).???
5 :
デフォルトの名無しさん :2006/06/27(火) 23:05:23
7 :
デフォルトの名無しさん :2006/06/27(火) 23:14:49
Windows XP、Excel2003です。 シートを並べ替えるようにしたいのですが 例えば、6月1日と6月12日というシートがあると6月12日のシートが先に来ます。 6月1日を先に持ってくるにはどのように直せばいいでしょうか? Sub シートを並び替える() Dim i As Long, j As Long, cut As Long Dim buf() As String, swap As String cut = Application.Worksheets.Count ReDim buf(cut) For i = 1 To cut buf(i) = Worksheets(i).Name Next i For i = 1 To cut For j = cut To i Step -1 If buf(i) > buf(j) Then swap = buf(i) buf(i) = buf(j) buf(j) = swap End If Next j Next i For i = 2 To cut Worksheets(buf(i)).Move after:=Worksheets(i - 1) Next i End Sub
8 :
デフォルトの名無しさん :2006/06/28(水) 08:39:39
cdateでも使えば? あと、シート並べ替えでbuf(1)を処理してない事も問題だと思う。
9 :
デフォルトの名無しさん :2006/06/28(水) 19:30:40
普通の文字と日付の場合と分けねばならんのかな?(・・;)
10 :
デフォルトの名無しさん :2006/06/28(水) 19:40:36
>>7 私はこんな感じのを作って使ってます。
Sub 並べ替え()
Dim i As Integer
Dim j As Integer
Dim mycnt As Integer
Dim hi As String
mycnt = Worksheets.Count
For j = 1 To mycnt
For i = 1 To mycnt
Cells(i, 26).Value = Worksheets(i).Name
Next
Range("z:z").Select
Selection.Sort Range("z1")
hi = Format$(Cells(j, 26).Value, "m月d日")
Range("z:z").ClearContents
Worksheets(hi).Move after:=Worksheets(mycnt)
Next
End Sub
一旦ワークシートのデータに差し障りの無い列(今回はZ列)に
シート名を書き出して昇順に並べ替えて、シートに反映させてます。
書き出したり削除したりがマヌケな感じなのですが、ソートが楽なので・・・。
11 :
7 :2006/06/28(水) 19:52:32
>>10 レスありがとうございます。
なるほど…これは(・∀・)イイ!!
いただきます。
(゚д゚)
13 :
デフォルトの名無しさん :2006/06/29(木) 11:29:38
繰り返し文の実行中にSelect Caseを使っているのですが Case1,Case2…Case Elseっていう風に条件を当ていき、 Case Elseに条件が当てはまった時にCase Elseの 処理を実行してからEnd Selectに行かないで その数字でまたSelect Caseをやり直す方法ってありますか? 初歩的な質問ですみません、どなたか教えてください
>>13 なんでわからないのに「初歩的な」なんて勝手に決めつけるんだ?
ちなみに、質問にはSelect文を「Do Until」「Do while」「For loop」なんかで囲んで
条件を満たすまで回せばいいと思う。
なんで繰り返し処理(繰り返し文の実行中にSelect Caseを使っているのですが)をやってるのに 繰り返し処理(またSelect Caseをやり直す)の方法がわからないなんて質問するんだ? 激しく疑問だ。
俺に言わせりゃ、「疑問に思うことが疑問」とか言い出す奴がいることの方が疑問だ。
それをやる必要が本当にあるのなら自分なら迷わずGoToを使うかな
18 :
デフォルトの名無しさん :2006/06/30(金) 10:04:00
関数の意味どうやって調べるですか?
すみません、自己解決したです。
20 :
デフォルトの名無しさん :2006/06/30(金) 17:09:49
( ゚д゚ )・・・。
( ´∀`)σ)´Д`)
>>1 >そもそも環境を書かないような奴は
>>1 なんて
>読まないから意味ないよね。
INTERCALのドキュメントみたいなこと書くなよw
コーディングの質問じゃなくてもいいのかな?ダメならスルーして^^; ぶっちゃけ、VBAプログラミングだけで職にありつけますかね?
>>23 そりゃあんた、英語喋れるけど通訳で喰えますか? って聞くようなもんだよ。
26 :
23 :2006/07/02(日) 22:09:34
レスありがとうございます。参考になりました。
VBAからメールを送るフリーの関数を提供するソフト DZAMTP.DLLというソフトを探しています。 以前はインターネットからダウンロードできたのですが 今はできなくなっております。 もしどなたか所持されていたら二次配布とかしていただけないでしょうか? VBAの質問とは少し違いますし、いきなりこのようなお願いをして申し訳ありません。
30 :
デフォルトの名無しさん :2006/07/03(月) 17:11:18
WinXP Excel2003 です For...NextやDo...Loopを使うとき、整数型の変数はよく「i」とか「j」を使いますよね? 同じプロシージャの中で何度もFor...NextやDo...Loopを使うとき「i」とか「j」を 使い回しているんですけど、何か後半に重くなっていくような気がするんですが こういう使い方はよくないのでしょうか? 一つ一つのFor...NextやDo...Loopには別の変数を割り当てるほうがよいのでしょうか? それとも、自分でわかりさえすれば問題ないのでしょうか?
>>30 ありがとうございます。
大変助かりました。
是非参考にさせていただきます。
あと今更気づいた自分の恥ずかしい間違い
DZAMTP.DLLじゃなくてDZSMTP.DLLでした
>>33 ありがとうございます
たまにプロシージャの最後の方で
変数 = Nothing
とかやってますよね?
アレってやった方がいいんですか?
35 :
デフォルトの名無しさん :2006/07/04(火) 01:11:47
好みの問題でいえばやった方がいい。オイラならする。 でも、必ずしも必要というわけではない。 もっと言えばなぜそうしてるか理由を理解するのがいい。
36 :
32 :2006/07/04(火) 13:21:47
>>35 変数 = Nothing
ってゆうのはどうゆう操作なんですか?
変数を初期化してメモリを開放するってことですか?
変数は型によって2バイトとか16バイトとかって本に書いてましたが
実際2バイトとか16バイトとかが何に影響するのか分かりません
最近のパソコンはメモリもGBクラスですがそれでも何かに影響ありますか?
質問ずくめですいません
37 :
デフォルトの名無しさん :2006/07/04(火) 17:19:31
Integerなんかの「変数」なら関係ない。 言ってる通り数バイトしかメモリを使用しないし、メモリの解放も自動でしてくれる だから「変数 = Nothing」はしなくても良い。#つーかやろうとしたらエラーになるでしょ Object型のサブクラスの「オブジェクト変数」ならしたほうがいい 「変数 = Nothing」することで参照回数が1回減る。 オブジェクト変数が指しているオブジェクトが持っている参照回数が0になると自動的に オブジェクトの終了処理とメモリ解放処理を実行してくれる。 またこの変数がnothingになっているので間違えて使おうとした場合、確実に エラーになるのでミスが速く見つかるメリットがある。 オイラの場合、こちら側のメリットが大きいと思うのでオブジェクト変数の場合 「変数 = Nothing」 をしている
38 :
32 :2006/07/04(火) 17:53:28
>>37 イメージで言うと
「変数 = Nothing」は
「変数 = ""」
ではなく、
「この変数はこのプロシージャではもう使わないから削除してください」
って意味で、「Nothing」以降は同一プロシージャでその変数は使えなくなるってことですか?
Object型って事は、「As Worksheet」とか「As Range」等と宣言した変数って事ですよね?
何度もすいません、よろしくお願いします
39 :
デフォルトの名無しさん :2006/07/04(火) 19:10:03
そーです 正確に言えば >「この変数はこのプロシージャではもう使わないから削除してください」 ではなく 「この変数はオブジェクト変数が指していたオブジェクトとはもう関係ありません」 「この変数はもうどのオブジェクトとも関係ありません」かな? >「Nothing」以降は同一プロシージャでその変数は使えなくなるってことですか? 再びSetすればその変数は使えます。ただし、新しくセットオブジェクトに対しての処理になりますが。 >Object型って事は、「As Worksheet」とか「As Range」等と宣言した変数って事ですよね? そうです。プロパティとかメソッドがある奴のことと考えておいて間違いはないと思う
参照切ればガベコレが回収してくれるから と説明できれば楽なんだが
41 :
32 :2006/07/04(火) 21:15:29
>>39 返事が遅れてすいません、非常によく分かりました
本当に参考になりました。ありがとうございました
>>40 ガベコレは分かりませんが、ググってみます
ありがとうございました
VBA 勉強中の者です.初歩的な質問だと思いますが,morg 等で 調べてもこれというのが見つからなかったので教えて下さい. やりたい内容としては,1 つの book にある複数のシートを (例えば sheet1,sheet2,sheet3 でそれぞれのシートの一部のセルには 式が入ってます)sheet1.xls,sheet2.xls,sheet3.xls として保存する, ということです. マクロの記録でいろいろ試した結果, Sheets("sheet1").Copy ActiveWorkbook.SaveAs "C:\sheet1.xls" ActiveWorkbook.Close を繰り返せばおおむね望む結果は得られるのですが, 画面がちらつくのと,本当にこの方法がベストなのか疑問に 思ってます. あと,上の方法でコピーをすると書式までコピーされてしまい sheet1.xls を開くとリンク先との連携を毎回聞かれてしまうため, 値だけを sheel1.xls に保存する方法を取りたいです.
>>42 >画面がちらつく
ぐぐれば答えが得られるんでないかな。要は、一時的に再描画を止めてしまえばいい。
#ついでに再計算も止めると処理も速くなってなおよし。
>値だけを sheel1.xls に
マクロ記録でコピー→値だけペーストをやってみれば判るんで内科医?
>>42 画面がチラつくに関しては、画面の表示更新を一時的に固定する。
Application.screenupdating=FALSE
リンクなどを聞いてくるメッセージを出さないよいにするのは
Application.Displayalarts=FALSE
47 :
質問 :2006/07/06(木) 23:53:23
初歩的な質問ですみません… 使う言語はVBA5.0です。 Commandをクリックしたら文を書いてあるウィンドウを表示させるプログラムってどう書いたらいいんですか?
メッセージってメッセージボックスかな?それなら、 Private Sub Command1_Click() Msgbox "〜" End Sub みたいな感じかな? オブジェクトとかなら Private Sub Command1_Click() Dim ObjectName As Object Set ObjectName = New Object ObjectName.Show 〜 〜 Set ObjectName = Nothing End Sub とかかな? 携帯でコード書くの疲れる。
>>48 メッセージというか文を書いてあるウィンドウか…
50 :
デフォルトの名無しさん :2006/07/07(金) 03:39:24
質問です。 VBAでは計算に時間がかかりすぎるためにVBで計算しようとおもうのですが、 VBにはそもそもエクセルファイルのSheet1のように数値データをのせるシートがないような気がします。 どうやって計算するのでしょうか?
51 :
デフォルトの名無しさん :2006/07/07(金) 11:50:11
計算する数値データを配列にでもつっこめば? 2次元配列ならシートに見立てるのも簡単でしょ?
52 :
デフォルトの名無しさん :2006/07/07(金) 15:43:37
つフレキシブルグリッド
VBAよりVBの方が計算早いんですか?
54 :
デフォルトの名無しさん :2006/07/07(金) 21:27:36
>>53 VBシリーズ(.NET以前)の計算速度比較
VB(exe) >>>>> VB(デバッグ実行) = VBA >>>>> VBS
56 :
42 :2006/07/08(土) 01:09:26
>>43 ,46
どうも回答ありがとうございました.
> Application.screenupdating=FALSE
についてはおかげさまで画面がチャカチャカ動くのは抑止
できたのですが,まだ,最小化するところのバー(なんて
言うのでしょうか?)が忙しそうに動きます.
完全にバックグラウンドで実行するのは無理なんでしょうか?
>>値だけを sheel1.xls に
>マクロ記録でコピー→値だけペーストをやってみれば判るんで内科医?
説明が足りなかったんですが,"見えている値" を書式なしで
コピーしたい,ということなんです.たとえば,セルに today()
が入っていたとして,コピーしたいのは,2006/7/8 ですが,値で
貼り付けると 38906 というシリアル(?)が入力されてしまいます.
> リンクなどを聞いてくるメッセージを出さないよいにするのは
> Application.Displayalarts=FALSE
ActiveWorkbook.SaveAs "C:\sheet1.xls" の時点で sheet1.xls
にこの属性を持たせることが可能でしょうか?
>>56 SaveAsでは出来ないが、どうしてもというなら、CreateObjectを使えば
完全にバックグラウンドで動作可能。
やり方は、CreateObject Excel.Applicationでググってくれ。
58 :
53 :2006/07/08(土) 01:37:17
>>42 リンクはされなくていいんだよね?
シートをコピーするのではなく、セル範囲でコピーするのはどう?
Workbooks.Add
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
で貼り付ければ見た目だけがコピーされます。
>>42 Sheets("sheet1").Copy
ActiveWorkbook.SaveAs "C:\sheet1.xls"
ActiveWorkbook.BreakLink Name:="リンク先の名前", Type:=xlExcelLinks
ActiveWorkbook.Close True
これだとリンクが切れるので、リンク更新のメッセージ出ないし
値のみ(見た目だけ)がコピーされますよ。リンク以外の数式はコピーされます。
シートの設定を変えているのでCloseの後にTrueを指定してください。
でないと「変更を保存しますか?」のメッセージが出ますので。
フレキシブルグリッド。。。 聞き慣れないなーと思ってググったらVB5から使える利口物なんだね。 学生時代に買ったVB4アカデミックしか持ってないから知らなかったよorz 一つ賢くなりますた。
office2007でもVBAは不変? 仕様変更はしなくていいから、 エディタのホイールスクロールだけ有効にしてください_| ̄|○
β落とせば? 漏れはOS、XPぢゃないから諦めたorz
お時間のある方どうかお付き合いお願いします
まずやりたい事ですが、
http://www.omegachart.org/faq.htmlの 「データの取得」の第7項目の「データをインポートしたい」です
製作途中のExcelファイルをアップしていますので参考にして頂ければ幸いです
http://gt2-.hp.infoseek.co.jp/cgi-bin/img/8734.zip データを作成する段階までは出来たのですが、バイナリファイルとして保存する方法が分かりません
今の段階で出来ているのは"2462現段階"ファイルです
アップしたファイル中のExcelファイルに"2462現段階"を出力したコードを添付しています
マクロを含んでいるので開くときに警告が出ると思いますが、決して怪しいものではありません
このExcelファイルのSheet1にデータのフォーマットを解説してあります
バイナリファイルに詳しい方なら"2462完成目標"と"2462現段階"ファイルをバイナリエディタで
開いて頂ければダメなところがお分かりになると思うのですが…
目的はアップしたファイル中の"2462完成目標"形式のファイルをExcelで出力することです
どうかよろしくお願いします
65 :
64 :2006/07/08(土) 16:33:10
すいません、データフォーマットの解説を添付する前のファイルをアップしてしまいましたので こちらで解説させて頂きます シート2462の1行目を例にして説明します。レコードはH列までです。 20051208672000772000572000772000708124 8桁(4バイト)の16進数に変換 0131F508000A4100000BC7A00008BA60000BC7A0000ACE1C0000000000000000 後ろから2桁(1バイト)ずつ逆順に連結 08F5310100410A00A0C70B0060BA0800A0C70B001CCE0A000000000000000000 A列からH列を連結した値が1日分32バイトのデータです。 08F5310100410A00A0C70B0060BA0800A0C70B001CCE0A000000000000000000
66 :
64 :2006/07/08(土) 16:36:55
書き込んでみると全く分からないのでデータの区切りに"■"を挿入します シート2462の1行目を例にして説明します。レコードはH列までです。 20051208■672000■772000■572000■772000■708124■(空白セル)■(空白セル) 8桁(4バイト)の16進数に変換 0131F508■000A4100■000BC7A0■0008BA60■000BC7A0■000ACE1C■00000000■00000000 後ろから2桁(1バイト)ずつ逆順に連結 08F53101■00410A00■A0C70B00■60BA0800■A0C70B00■1CCE0A00■00000000■00000000 A列からH列を連結した値が1日分32バイトのデータです。 08F5310100410A00A0C70B0060BA0800A0C70B001CCE0A000000000000000000
えーと、なんだか良くわかんないけど、次のコードを実行して結果を観察し、 ヘルプなどを読んでみて下さい。 Sub foo() Dim a(32) As Long a(0) = 1 For i = 0 To 31 a(i) = i Next Open "test.dat" For Binary Access Write As #1 Put #1, , a Close #1 End Sub
68 :
67 :2006/07/08(土) 16:53:43
ちなみに、Windowsでは、4バイトの1という数値をバイナリで保存すると 01 00 00 00 になります。
69 :
64 :2006/07/08(土) 17:11:10
>>68 早速のお返事ありがとうございます
試してみて自分のコードと比較してみます
後ほど結果、疑問点など報告させていただきます
70 :
64 :2006/07/08(土) 17:31:20
>>68 出来ましたー、出来ましたよっ!
配列変数をValiantからLongにして、Binar AsをBinary Access Write Asにして
訳の分からない16進数への変換を削除したら出来ました
本当にありがとうございます、かれこれ1週間ほど答えを探してました
何か言葉だけで感謝し足りないぐらい感謝してますよー!
本っ当にありがとうございました
71 :
67 :2006/07/08(土) 17:44:31
いえいえ、どういたしまして。
72 :
42 :2006/07/09(日) 02:03:19
Excel2000でマクロ組んでるんですが、最近、実行速度の遅さが気になって・・・ open officeってExcelより速いですか?
画面更新を止めれば速くなるかと もうやってるならアルゴリズムを見直すとか openofficeは試してみれば?
OpenOfficeのマクロはJavaベースでしょ。 互換性ないんでないの?
こんばんわ、よろしくお願いします エクセルでWebのテーブルをダウンロードする時、 ActiveSheet.QueryTables.Add〜(以下略 ってコード書きますよね? これだとActiveSheetの指定セルに指定したテーブルを取り込む事になると思いますが、 これをシートに落とさず配列変数に落とすような事は出来ないのでしょうか? イメージで言うと、 Dim DwnStr as Valiant DwnStr.QueryTables.Add〜(中略)〜, Destination:=DwnStr(0,0) みたいなカンジです それともやはり、Webからのダウンロードは一旦シートに落とさなければいけないでしょうか?
Excelの機能を使うなら、シートに落とさないとダメ。 それがイヤなら自分で実装すればいいだけ。 シートに落とすならVBAの話だけど、そうでないならVB6の話だね。
78 :
76 :2006/07/10(月) 09:47:47
>>77 やっぱりそうですか
QueryTables.Addで出来ないってわかっただけでも収穫ありました
APIにMSXML2.XMLHTTPってゆうのがありますね
使えるように勉強してみます、ありがとうございました
開発そのものやExcelは初心者って程ではないんだけど 今度依頼されたのが、ネットから情報を取得して出力された情報を Excelに表示するようなマクロ。 こういうのは初めてで、なおかつ覚えるなら完璧に覚えたいので、自腹で本買って作業に入る前に勉強したいです。 何かその辺の記述が詳しいオススメの本があれば誰か教えてください。 一応Excelマクロは何度か作っていて、今の会社でも稼働管理システムに関わってるので、ある程度難しい本でも理解できると思います。
補足 資料として欲しいのは ・該当Webの入力フォームにセルの値(ID等)をセットして検索 ・検索結果をExcelに取り込む 厳密に言えば1つ目だけでもいいんですが…(2つ目は外部データの取り込みをマクロ保存して少し変えればできるイメージなので…) ↑考え甘いですか?
>・検索結果をExcelに取り込む
メニュー ツール(T) マクロ(M) 新しいマクロの記録(R)
メニュー データ(D) 外部データの取り込み(D) 新しいWebクエリ(W)
本買うまでもない
>・該当Webの入力フォームにセルの値(ID等)をセットして検索
たいていのサイトは、
http://www.google.co.jp/search?hl=ja&q=TEST&lr= みたいに、?パラメータでいけるけど
できなければ直接Excelに取り込めないので、IEオブジェクト作ってPOSTしたりして
必要なデータのみをExcelのシートに書き込むしかないかもね(初心者には難しいかも)
>>81 さん
レスどうもです、それとごめんなさい。家ではネット繋いでないので、示していただいたリンクは見れませんでした。
ただ、IEオブジェクト〜からの流れが、自分の引き出しにまだなくて、色々探してみたんですが、詳細を記載したページを見つけられませんでした。
自分は応用力はあるつもりなんですが、基礎を覚えるのに人一倍時間がかかる子なので、
コレを機にみっちり覚えようと思ってます。
EXCELでネットワーク関連の制御を詳しく書いた本があれば是非教えて下さい。多少難しくても本気で覚えますので。
> EXCELでネットワーク関連の制御を詳しく書いた本があれば是非教えて下さい。
無い。だって解説する必要無いもん。
なぜなら、その辺は普通のVisual Basicと被るから。
Excelのブックやシート、またはシート上のグラフや図形などのオブジェクト操作はExcel VBAの分野だが
ネットワーク関連なんてのは
>>81 が教えてくれたような機能使うのでなければExcel VBAでもVisual Basicでもやること一緒。
だからぶっちゃけて言えば、VB言語について勉強しなさいってこった。
VB6の解説本、VB6の解説サイトなら、ネット関連について解説してる物が腐るほどあるし
その方法はほぼ例外なくVBAで使える。
>>83 ハナっからVBAの機能と絞って考えてたんで、VB関係の本はスルーしてました。
よく考えたらそうですよね。
今日辺り書店をさまよってみます。
>>81 さん、
>>83 さんありがとうございました。
>>82 >IEオブジェクト〜からの流れが、自分の引き出しにまだなくて
先ずは、
メニュー ツール(T) マクロ(M) Visual Basic Editor(V)
メニュー ツール(T) 参照設定(R)
で、Microsoft Internet Controls をチェックしてOKする
メニュー 挿入(I) 標準モジュール(M)
で、新規モジュールを作成して、下記のサンプルをコピペして応用してみてはいかが?
Option Explicit
Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)
Sub test()
Dim ie As SHDocVw.InternetExplorer
Dim SettingTxt
Set ie = New InternetExplorer
'ie.Visible = True
ie.Navigate "
http://pc8.2ch.net/tech/SETTING.TXT "
While ie.Busy
Sleep 100
DoEvents
Wend
While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend
SettingTxt = ie.Document.Body.outerText
n = InStr(1, SettingTxt, vbNewLine) - 1
Debug.Print "Board ID=" & VBA.Left(SettingTxt, n)
Debug.Print "Date=" & ie.Document.LastModified
ie.Quit
Set ie = Nothing
End Sub
86 :
85 :2006/07/11(火) 17:05:31
"はダブルクオーテションです
> Microsoft Internet Controls > Microsoft Internet Controls > Microsoft Internet Controls > Microsoft Internet Controls > Microsoft Internet Controls この用途でMicrosoft Internet Controlsですか、そうですかw
88 :
助けて :2006/07/11(火) 17:25:42
学校で提出しないといけない問題があって分からずに手つけてない問題があるので教えてください!! エクセルを立ち上げて、Sheet1のセルA1〜A50に数字を1から50までを入力し、セルD4に1から50の合計、D5にその平均を求める。VBAからエクセルの関数を呼び出すときには、Worksheetfunktionというオブジェクトを使用する。セルC4に「合計」、セルC5に「平均」と入れる。
>>85 ソース解説ありがとうございます。もしかしたら
>>87 さんの言うように、
今回の自分の用途とは異なるかもしれませんが、試してみたいと思います。
自分には珍しく、今かなり色々覚えてみたい気力に溢れてるのでw
福岡女学院さんマルチ質問駄目だゾ
>>87 >この用途でMicrosoft Internet Controlsですか、そうですかw
>IEオブジェクト〜からの流れが、自分の引き出しにまだなくて
>>82 ※注)
>>79-80 に対するレスではない
93 :
デフォルトの名無しさん :2006/07/12(水) 06:39:26
ワードを開いたらユーザフォームが勝手に現れるようにするにはどこにshowをかけばいいんでしょうか?
Wordは開く物ではなく起動させるもの。開くのは文書ファイル。
96 :
デフォルトの名無しさん :2006/07/12(水) 10:32:39
WINWORD.EXE起動時の話か、文書.docオープン時の話かハッキリしろってことだろ 確かにそのどちらなのかで方法が違うから、「ハッキリしろ」というのは同意だが、94もハッキリ言ってやれよ 回りくどく言っても93や95みたいな初心者には伝わらないぞ
97 :
デフォルトの名無しさん :2006/07/13(木) 00:48:16
エクセルのマクロによりパワーポイントを新規作成させたいのですが、エラーになってしまいます。 本を見ながら書いたものなのですがどうしてエラーになるのかわかりません。。 sub createppt() dim ppoint as object dim ppres as object dim pslide as object Set ppoint = CreateObject("powerpoint.application") Set ppres = ppoint.presentations.Add Set pslide = ppres.slides.Add 'ここでエラー end sub 使用ソフトはoffice xpです。解決方法が解る方宜しくお願いします。
初心者の特徴: 言語に拠らず、エラーが起きてもエラーメッセージを書かない。
99 :
97 :2006/07/13(木) 01:37:07
失礼しました。 実行時エラー450 引数の数が一致していません。または不正なプロパティを指定しています。 です。
>>79-80 に関しては、結構苦戦しましたが解決しました。
と言っても実際のツールを作る参考になる程度の初歩的なものですが…
その先は、作ったものを応用して頑張ってみます
色々ご回答いただきありがとうございました。
初心者の特徴: エラーに対して、その意味を調べたり考えたりしようとせず 「エラーが出た、どうにかしてくれ。」と丸投げで他人を頼る。 「引数の数が一致してない」可能性と、「不正なプロパティ(メソッド)を指定してる」可能性は、 完全に否定出来るのか?なら、それをきちんと書け。 否定しきれないなら、まだまだ自分で出来ることは有るはずだ。
102 :
デフォルトの名無しさん :2006/07/13(木) 12:40:38
「ComboBox」が1〜10まであって、それぞれ「ComboBox1」〜「ComboBox10」 って名前です。 ComboBox1.AddItem "A" これを「ComboBox1」〜「ComboBox10」までやるのにFor Next構文は使えないのですか? 使えるとしたらどう記述するのですか?
103 :
デフォルトの名無しさん :2006/07/13(木) 12:49:10
>>102 そこでコントロールを配列にするんですよ
>>103 VBならね。
でもVBAではコントロール配列は使えないので、
コントロールコレクションを利用するか、
クラスを使って疑似コントロール配列を実装するんですよ。
VBSでは、 Dim aryLine aryLine = Split(string, ":") とやれば、スプリット後の各文字列が配列に代入されますが、 VBAでは、 Dim aryLine As String aryLine = Split(string, ":") とやってもできないようです。 どのようにすればいいのでしょうか。
↑事故解決 Stringじゃなくて、Variantで宣言しないといけなかったようです。
ホントはVariant型じゃダメなんだけどね。Variant型は何でもアリだから、 「Variant型で宣言しなくてはならない」、「Variant型が正しい」ということは無い。 誤魔化しの手法として、Variant型に逃げる道があるだけ。 Dim aryLine() As String aryLine = Split(string, ":")
108 :
◆MutsukiYtk :2006/07/13(木) 20:26:49
>>102 For IntX = 1 To 10 Step 1
Me.Controls("ComboBox" & IntX).AddItem "A"
Next
携帯から書いてるからスペル違うかも。
標準モジュールでシート名を定数定義して、 セットをWorkBook_Open時に行ったところ、エラーになりました。 イミディエイトウィンドウで確認すると、定数には値が入っていません。 WorkBook_Open時は元々標準モジュールは見ていないんでしょうか? もしそうだとしたら、標準モジュールでの定義が反映されるタイミングを知りたいです。
>>109 は忘れて下さい
Const→Public Constに変えるだけで解決しました
アホや俺…orz
111 :
デフォルトの名無しさん :2006/07/15(土) 18:23:32
教えてくだいさい。 1、VBAプログラミングのバイブル的な本ってありますか? 2、文法書、コマンド解説書(できたらプログラム例つき)で定番は何でしょうか。?
>>111 お答えします。
1、あります。
2、Excel VBA ヘルプ(←電子書籍だが超定番)
以上。
条件後出し(具体的な名前出せとか、紙面書籍限定とか)は却下。
113 :
デフォルトの名無しさん :2006/07/15(土) 19:24:57
本って聞かれてヘルプも本だっていうのは112だけ
まあ電子書籍とは言わんね普通
>>111 ん〜、バイブル的なものはないと思う。
ただ『初めての○○』『×日で覚える○○』的な本は多分バイブルにはならないと思うよ。
パラパラ読んでみて、「あ〜、これちょっと難しいなぁ…」っていう本の方が、長く使える、ある意味の『バイブル』になるんじゃないかな。
つか俺の愛用本書こうと思ったけど、どのVBAか記述がないので。俺Excelのしかないけどいいのかな?
一応某VBA掲示板(多分モーグでググると出る)で質問に普通に答えれるくらいの知識は身に付いたよ。
>>112 まぁ、なんつ〜か意地悪じゃね?
117 :
デフォルトの名無しさん :2006/07/15(土) 20:24:09
>>112 マイクロソフトのヘルプは「わかったあとで、やっと何を説明してたか判る。」ことで有名なしろもの。
構文説明や使用例で、マイクロソフト特有の抽象的概念用語持ち出す(手抜きの例でしかない。)から,結局、具体的
には何のことだかわからないよ。これは、vbaに限らず、他のマイクロソフトのプロ倉ミング言語のヘルプ全般
で、殆どのプログラマーが言うこと。cとか言語などのプログラミングで十年以上も経験のあるプロでも異口同音
に共通していう。「マイクロシフトのヘルプ、マニュアルはわかり難い。」ってね。
例えば、ヘルプで"タイマー”でググルと、"On Timeメソッド"って出てくる。
で、以下の説明が出てくる
構文
expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
expression 必ず指定します。対象となる Application オブジェクトを表すオブジェクト式を指定します。
"expression"って何だ。”Application オブジェクト"っていう抽象的概念説明になってる。
こんなに一つの要素を説明するのにコロコロと概念用語で変えただけの説明なら、わかるものでも
無理矢理わからなくしてるのと同じだよ。
OnTime メソッドの使用例
次の使用例は、現在から 15 秒後に my_Procedure を実行します。
Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure"
「対象」を見ると、vbヘルプに飛ぶ。もうメチャクチャだよ。でも、見ると。
Application オブジェクト
"Excel アプリケーション全体を表します。Application オブジェクトには、次のものが含まれます。"
ってさ。↑は、もはや日本語として完全に矛盾してるだろ。ヘルプは、このようにメチャクチャな混乱句の集合体でしかない。
118 :
デフォルトの名無しさん :2006/07/15(土) 20:46:12
Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure" というように「使用例」まで具体的要素(機能)の名称(例えばセル名等なら「セル名等、プロジェクトで使われてる オブジェクトの識別名」と、ファイル名なら「ファイル名」と具体的に明示する。)ことなく曖昧にしたまま、 その要素の具体的固有名称も明らかにしないのでは、あくまで抽象的概念用語の説明のままでは、 「ヘルプ」じゃなく手抜による「混乱させるもの」でしかないよ。上の例だって、更には、"my_Procedure" って何だ。ファンクション名(sub ルーティン名)なのかそれとも、sheet名なのか、それともプロジェクト名 なのか判らない。
とりあえず
>>111 を置いてけぼりにして喧嘩をするのはやめません?
別に巻き込めって意味じゃないですよ、論点が変わってると。
>>111 ちなみに俺の愛用本は翔泳社の『Excel2003VBA辞典』です。
CD-ROMなしで2000円越えしますけど、あまりCDに頼ると覚えるのに時間かかると思ったんで…。この本とは結構長い付き合いです。
>>111 バイブルと言う訳ではないですが資格板のVBAスレで
何冊か本の名前が挙がってますよ。
資格取得に関しての書籍だしちょっと趣旨が違うかな?
基礎を学ぶ為の物が多かったような気がします。
あと、別に
>>117-118 と
>>119 の喧嘩に加わる気はないけど、
>>117 の言ってる事は正しいと思うよ。少なくとも
>>112 よりは。
初めて触る人間が『IF』『SELECT』辺りの複数選択肢が出るヘルプを検索した時とか苦労するだろうな、って思うもん。
つかヘルプ見てれば全てが解決するなら本だってこんなに発行されないし、このスレも不要でしょ。
…何か余計な火種増やしただけだったらごめん>ROMってる人他色々
>>117 expressionはようするにhogeの如くそれ自体に意味はない。
Application オブジェクトと書いてあるのは、Applicationというクラス(型)のオブジェクトと思え。
(VBは型が緩いから意識しないとだめ。オブジェクトと言う言葉が嫌なら変数とでも読み替えろ)
ただし、(Applicationクラスの)Applicationという名前のオブジェクト(言わばグローバル変数)が存在するのがややこしいけど。
VBAのヘルプはわかりにくいとは思うけど、そこまでひどくないと俺は思うよ。
いや、ひどいよ。 Excel固有部分は特にひどい。
125 :
デフォルトの名無しさん :2006/07/16(日) 07:08:42
だいたいへルプ自体がバグだらけ。マイクソソフト
126 :
デフォルトの名無しさん :2006/07/16(日) 07:49:45
ところで、・・・ タイムシェアリングのモードで動作する関数(メソッドか)はないの。 (つまりは、マルチタスクモードでインターバル動作するやつ) ユーザーのプロシジャー内で専属でループ、ウェイト動作するんじゃなく、 少なくともvb系なら、vbのタイマーみたいに、バックグラウンドでタイムカウント して、指定した時間間隔ごとに割込動作で、こっちが作ったプロシージャをコールして くるっていうのはないの?。 それがないとシーケンシャル動作で(結局はシングルタスクで)タイムカウント中は 一つのマクロにcpuが独占されっぱなしになって、カウント中にどこかのセルでキー入力 するとか、データを変更するとか、とにかくマルチタスク動作できない。 それができなきゃアプリ用言語として使いものにならないんじゃねーの。
127 :
デフォルトの名無しさん :2006/07/16(日) 08:06:06
だいたい、マイクロソフトはvbだって、スタック領域が軟弱、っつーか、 曖昧でブラックボックスだから、怖くて頭からプログラムする気が起きない。 相手が素人だと思って馬鹿にしてるのか「簡単」とか「便利」とかっていう 謳い文句にかこつけて「手抜き」なんだよ。いつオーバーフロー起こすか 判らないし、どの程度でスタックが動いてるのかも判らないから実際の業務ソフト としては使えない。スタック領域が曖昧なプログラミング言語なんか、まったく 「遊び」でしかつかえない。これだけメモリが大きくなってる時代に 配列が使えないなんて・・・
128 :
デフォルトの名無しさん :2006/07/16(日) 08:16:15
>>126 OnTimerもどき作れば?
SetTimer使えば簡単に出来ると思うが
> 少なくともvb系なら、vbのタイマーみたいに、バックグラウンドでタイムカウント > して、指定した時間間隔ごとに割込動作で、こっちが作ったプロシージャをコールして > くるっていうのはないの?。 マルチスレッドというならまだしも、その程度ならいくらでも出来るだろ。 使いものにならないのは言語ではなくオマエの頭だw ちなみにマルチスレッドはVBAの本家最終版であるVisual Basic 6.0 Professionalですら非対応だからね。
VBA2000、2002、2003で結構互換性無いよね。 IDEは進歩無くほぼ同じなんだがw
>>127 VBの配列ってヒープからとってくるんじゃないの?
132 :
デフォルトの名無しさん :2006/07/16(日) 09:13:16
配列領域はいろいろだよ。 パラメータになってるときはスタック プロシージャ内で定義されたときも、スタックじゃないの。
133 :
デフォルトの名無しさん :2006/07/16(日) 09:21:51
134 :
デフォルトの名無しさん :2006/07/16(日) 09:23:55
>>129 マイクソソフトのマニュアルと同じく、おまえは「能書だけ」だ。
135 :
デフォルトの名無しさん :2006/07/16(日) 09:39:40
134
136 :
デフォルトの名無しさん :2006/07/16(日) 10:12:29
マクロ内でどうこうするっていうより、マクロ自体の起動を時間の次元で設定できる環境変数があればで話は早いんだが。 要は、マクロ自体をインターバル動作できれば話は早いわけでね。(自動保存みたいにね。) マクロの環境がそうなっていないというのは、基本設計からして、そういうふうな設計思想ではなかったからだと思うんだが。
137 :
デフォルトの名無しさん :2006/07/16(日) 10:19:34
ま、そうなるとVBAの次元でなく、その上のEXCELとかの話で、スレ違いになるか。
138 :
デフォルトの名無しさん :2006/07/16(日) 11:11:02
VB5初心者です... 一応ネットで検索してみましたがよくわからなかったのでご教授お願いしますm(__)m VB5で"開く"をテキスト見ながら練習していました そして実行で"開く"をクリックしたら"実行時エラー426" 複数のMDIフォームは使用できませんと出て先に進めません...(^-^; 対処方を教えて頂きたいです.お願いしますm(__)m
ここ、開発環境Visual Basic(VB4,VB5,VB6)のスレではなく MS Officeファミリー マクロ言語Visual Basic for Application(VBA)のスレね。
Access のレポートでラベル作ってるんですが、 普通はラベルの横幅はルーラーで調整しますよね? これをコードから変更したいのですが、うまくいきません。 レポートを開くとき、イベントプロシージャで Me.Width = 5670 というように書いてみるんですが、印刷プレビューにまったく反映されてないのです。 ページ設定→レイアウトのサイズの項目にある幅というところはちゃんと10cmとなっているのに、です。 どうしたらよいでしょうか? ご教授お願いいたします。
141 :
デフォルトの名無しさん :2006/07/24(月) 18:10:37
エクセルVBAでセルの値をテキストファイルの決められた場所へ出力するようなライブラリってありますか。 テキストファイルはテンプレートになっていて、例えば、テキストファイルの$A1とあるところに セルのA1の値を出力するという感じです。 Javaでvelocityってのがあるみたいですけど、もっと手軽なものを探しています。 Excel2000です。
142 :
デフォルトの名無しさん :2006/07/24(月) 18:16:43
そんなもん自分で作れ
>>141 文字列の置き換えで済むんじゃねーの?
144 :
140 :2006/07/24(月) 18:19:23
自己解決しました
145 :
デフォルトの名無しさん :2006/07/24(月) 21:12:04
シートの上に立方体ぽくてボタン?みたいなやつを作ってクリックすると マクロが実行されるようにしたいんですけど、どうやったら作れますか?
>>145 [表示]→[フォーム]→[ボタン]
ボタンにマクロを登録
現在100シート近くあって動作が重くなってきた場合 どのような対策が考えられますか?
>>147 1ブックで100シート?
ブックを分割して必要なときに開くようにしたら?
>>147 構成に因って対策方法は異なる。
構成の詳細内容を文章で聞くのは面倒なので、
アドバイス欲しければブックをうpしろ。
エクセルでセルの右隅をダブルクリックすると 下方向に連続コピーできますが、 これを右方向にするにはどうしたらいいですか?
>>147 一度の作業には100シートも使わないなら
>>148 の言うように、複数Bookに分割したシートを作業によって必要数OPEN
一度に100シート使う(もしくは50シート以上使う為あまり分割しても意味なし)場合
そもそもそれだけのシートを使用する必要があるか考え直す。
例えば何シート使うかわからないから最大数として100シート持ってると言うのなら
必要時にWorkSheets.Addさせた方が絶対効率的。
つか正直1Book100シートも使用するツール?現実的に役に立つように思えないので、
一度見直してみてはどうだろう。
>>150 オートフィルの事を言うてる?ここはVBAすよ。
エクセル相談所スレで書き込んだんですが、土曜日以来レスが無いんでこちらに書き込ませていただきます 例えばセルとか他のアプリとかでも良いんですけど、右クリックで貼り付けとかって呼び出せるじゃないで すか。あれをフォーム上のテキストボックスでマウスの右クリックからも呼び出せはしないんですかね。 OS:XP Pro Excel 2002 です。
スレ違い 2〜3日書き込まれない程度で(ry
154 :
デフォルトの名無しさん :2006/07/25(火) 22:03:09
質問です。 エクセルVBAからコマンドボタンをクリックしたいのですができますか? UserForm1.CommandButton1.click() みたいなことがしたいのですが。 あるいは Sub CommandButton1_click() を外部から呼べればいいのですが、 できません。 どなたかよろしくお願いします。
Sub aaa() CommandButton1_click End Sub
156 :
154 :2006/07/25(火) 23:23:32
>>155 CommandButton1_clickはフォーム内で定義されています
これを標準モジュールから呼びたいのです
Sub aaa()はどこで定義すればよいですか?
フォーム内で定義すると結局Sub aaaが見えません。
>>152 TextBox_MouseDownイベントを使ってみたらどうだろう
>>154 コマンドボタンを押した時の命令を別Subにして
クリックしたい時にその別SubをCallすればいいんじゃないかな。
>>157 ヒント有難うございます
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button = 2 Then
MsgBox "右クリックされた"
End If
ここの部分にクリップボードから貼り付ける処理を書いて見ます。どうもm(__)m
160 :
デフォルトの名無しさん :2006/07/26(水) 14:37:36
ロロロロロロロロム落としたたら逮捕されますか?
98専用らしく、XPで動かないVBのソフトあるのですが、手作業で書き換える事は可能?
>>162 入力ミスじゃなければ、このスレのタイトルを見て、VBとVBAの違いをネットで調べてから
もう一度質問してくださいな
164 :
デフォルトの名無しさん :2006/07/28(金) 16:12:02
質問です ユーザーフォームにtextbox1,2とcommandbutton1の3つのコントロールを 配置して textbox1に下記のコードを記入しました Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If TextBox1 > 99 Then CommandButton1.SetFocus Else TextBox2.SetFocus End If End Sub ステップインで実行して 100以上の数値を入力した時に同じトコを2度通ってるのですが理由が解りません どなたか原因の解る方いますか?
>164 タブオーダーの順序通りにフォーカスを移そうとしている最中に、 タブオーダーの順序が違うコントロールにフォーカスを移しているから。
166 :
165 :2006/07/28(金) 16:50:49
タブオーダーは関係ないですね、すみません TextBox1のExitイベントが発生した時にフォーカスを持っている コントロール以外にフォーカスを移しているから
167 :
デフォルトの名無しさん :2006/07/28(金) 17:08:02
中の人がWM_ACTIVATEを2回呼ぶからじゃネーの? 1回目はExitしたときで2回目はSetForcusを呼ぶことで発生してるんじゃねーの、多分 たぶん、この現象が起きるときはTextBox1に99以上をいれて、1回目のExitを発生させるときに TextBox2にフォーカスを移してるでしょ?この場合、 TextBox1 -> TextBox2 で一回目のExit発生、ただし、発生した段階でActiveなのはTextBox1 TextBox2 -> CommandButton1 で2回目のExit発生、activeなのはTextBox1なのでTextBox1_Exitが再度呼ばれる このExit発生ってのがWM_ACTIVATEのメッセージ処理だからじゃない、かな? TextBox2の代わりにif文の判断と同じコントロールに移す場合、2回目は同じコントロールへの移動ってなるから Exitイベントが発生しないと思うがどうよ?
記念パピコ。
159の者です。ユーザーフォームにテキストボックスを1個作って以下のコードを入れたんですが、フォームを起動し
(当然テキストボックスは空の状態)マウスの右クリックでクリップボードからデータを入れた途端、 "テキストボックス
には既にデータが入っています"のメッセージが出てしまいます。
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim clipboardData As Variant
Dim aFmts, fmt As Variant
Dim MyData As DataObject
If Button = 2 Then
If TextBox1.Value <> vbNullString Then
MsgBox "テキストボックスには既にデータが入っています", vbOKOnly
Exit Sub
End If
clipboardData = Application.ClipboardFormats
If clipboardData(1) = -1 Then
MsgBox "クリップボードにデータが入っていません"
Exit Sub
End If
Set MyData = New DataObject
MyData.GetFromClipboard
TextBox1.Text = MyData.GetText(1)
Set MyData = Nothing
End If
End Sub
Private Sub UserForm_Initialize()
TextBox1.Value = vbNullString
End Sub
現象として
>>167 さんが言っておられる事のような気がするんですけど、対処方法はどうすれば良いんでしょうか?
Sub TextBox1_MouseDownの中のコードを一行 msgbox "a" として実行すればわかるけど 右クリは無条件に2回呼ばれるようだ どうしても右クリでやりたければ、1回目2回目を判断するしかないな テキストボックスの横に貼り付けボタンとかでは駄目なのかな
[ Xp-Pro + Excel 2003 ]です。 セルを横方向に結合しているとセルの高さの自動調整が行えないので、 改行(文字)回数を取得して調整を行うようにプロシージャを作成しました。 上手くできたと思ったのですが、 セルの書式設定で「折り返して全体を表示」に設定している箇所で 自動改行が行われている箇所の回数取得ができていませんでした。 セル内の自動改行回数を取得するイイ方法思いつかないですか??
文字列の幅 / セル幅
>>171 >テキストボックスの横に貼り付けボタンとかでは駄目なのかな
これで逃げるのが一番楽みたいですね(^^;。
不必要にコードをややこしくしても仕方が無いし、そうします。どうも有難う。
質問です。 以下のコードを実行しても、結果が0にならないんですけど どうしてなんでしょうか Dim a As Double, b As Double, c As Double a = -9.995 a = a * 100 b = 999.5 c = a + b MsgBox c
>>175 説明するの面倒なので「浮動小数点演算 誤差」でググれ。
>>176 うわ、確かに説明するのが面倒そうなのが出てきました、
結構興味深いことが書いてありそうなのでじっくり見てみます。
ありがとうございました。
178 :
デフォルトの名無しさん :2006/07/30(日) 02:21:31
配列をRangeに貼り付けようと以下のようなコードを書きました Dim ary As Variant ary = Array("a", "b", "c") Worksheets("Sheet2").Range(Cells(1, 1), Cells(1, 3)).Value = ary Sheet2がアクティブなときはエラーが出ないのですが アクティブでないときは以下のエラーが出ます 実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーです。 Sheet2をアクティブにせずに解決する方法はあるでしょうか?
>>178 Sheet2をアクティブにしちゃいけない理由でも?
もしアクティブシートを変更したくないのなら、現在のアクティブシート名を保存して戻してやればいいだろうし。
>>178 CellsはRangeのプロパティで、Rangeを省略するとActiveSheetが対象となり、
その結果全体として矛盾した指定になるためエラーになってる。
Range(Cells, Cells)の形式で書きたいんだったら、CellsがどのRangeの
ものかを明記する必要がある。つまり、以下のように書く必要がある。
With Worksheets("Sheet2")
.Range(.Cells(1, 1), .Cells(1, 3)).Value = ary
End With
181 :
178 :2006/07/30(日) 13:12:21
>>179 ほかのシートで作業中なので裏で動作させたかったんです
>>180 >.Range(.Cells(1, 1), .Cells(1, 3))
こんな書き方ができるんですねえ
うまくいきました
ありがとうございます!
182 :
デフォルトの名無しさん :2006/07/30(日) 17:44:29
エクセル相談所スレで書き込んだのですがスレ違いみたいなのでこっちで質問さ せてもらいます。 【1 OSの種類 .】 WindowsXP 【2 Excelのバージョン 】 Excel2000 【3 VBAが使えるか .】 はい(中級くらいです) 【4 VBAでの回答の可否】 可 【5 検索キーワード 】 起動フォーム タイトルバーを非表示 目的はExcel起動時にフォームを表示し、そのフォームのタイトルバーを非表示にす ることです。 起動フォームの設定はできます。 Sub Auto_Open() UserForm1.Show End Sub また、Excel起動後にシートからマクロを実行し、フォームを起動し、そのフォームの タイトルバーを非表示にすることもできます。(この方法は書籍に書いてありました) しかし、Excel起動時に起動するフォームのタイトルバーを非表示にする方法がわかり ません。どこにどういったVBAを書けばよいのかわからないんです。 どうぞよろしくお願いします。
> また、Excel起動後にシートからマクロを実行し、フォームを起動し、そのフォームの > タイトルバーを非表示にすることもできます。 と同じ方法で。
184 :
182 :2006/07/30(日) 20:34:40
サンプルコードはExcelからマクロを実行します。 今回の目的は起動フォームのタイトルバーを非表示にすることです。サンプルコードを引用しておきます。 --------------モジュールのコードのVBAです。-------------- Private Const GWL_STYLE = (-16) Private Const WS_CAPTION = &HC00000 Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long,ByVal nIndex As Long,ByVal dwNewLong As Long) As Long Private Declare Function GetActiveWindow Lib "user32" () As Long Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long Public Sub Hide() Dim Ret As Long Dim hWnd As Long Dim Wnd_STYLE As Long hWnd = GetActiveWindow() Wnd_STYLE = GetWindowLong(hWnd, GWL_STYLE) Wnd_STYLE = Wnd_STYLE And (Not WS_CAPTION) Ret = SetWindowLong(hWnd, GWL_STYLE, Wnd_STYLE) Ret = DrawMenuBar(hWnd) End Sub Sub Macro1() UserForm1.Show End Sub --------------フォームのコードのVBAです。-------------- Private Sub UserForm_Activate() Hide End Sub Private Sub CommandButton1_Click() Unload Me End Sub Excel起動後から表示するフォームはこのサンプルコードが使えます。起動フォームのタイトルバーを非表示にする方法がわからないんです。 どうぞよろしくお願いします。
無断で引用・転載していいものなの?
186 :
デフォルトの名無しさん :2006/08/01(火) 09:45:41
いきなり初心者質問で申し訳ありません。 excelワークシートの保護をマクロで実行し、その際にロックされた セルを選択出来なくしたいのですが、一度実行した直後はうまくいく のに、一度ブックを閉じてからまた開くと、保護はされていますが、 ロックされたセルが選択できてしまいます。 手動でシート保護を行った場合に同じ設定にすると、一旦ブックを閉じて もまた設定どおりになっています。 マクロで実行しても同じように出来ないでしょうか?
189 :
182 :2006/08/01(火) 22:32:32
185>氏 サンプルコードをもとにすこしかえてあります。 このコードは誰が書いても同じようなものになるので転載で問題はならないかと。 >186氏 マクロを記録して保存。セキュリティレベルを低で実行。できますか? 起動フォームのタイトルバーを非表示にする方法がまだわからなくて困ってます。 どうぞよろしくお願いします。
190 :
デフォルトの名無しさん :2006/08/01(火) 23:04:39
どなたか!!教えてください! 仕事で初めてVBA使ってみたのですが、良く分かりません・・orz まず、ブックを開かせます Dim OpenFileName As String OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") If OpenFileName <> "False" Then Workbooks.Open OpenFileName End If ↑ここまでは動きます。 次に今開いたブックの指定セル番地のデータを、既存のブックの指定セル番地へ持ってきます。 Workbooks("OpenFileName").Worksheets("PG1").cell("1,1").Copy Workbooks("book1").Worksheets("TP1").Range("1,1") ↑ここで「インデックスが有効範囲にありません」というエラーが表示されてとまってしまいます。 最初に開いたブックを指定するにはどのようにすればよいか、どなたかご教授おねがいします。
> Workbooks("OpenFileName") Workbooksコレクションで指定するのは ファイルパスではなくファイル名
192 :
190 :2006/08/01(火) 23:44:15
>>191 レス大変ありがたいのですが、サッパリわかりません・・・・・
>>192 >Workbooks("OpenFileName").Worksheets("PG1").cell("1,1").Copy Workbooks("book1").Worksheets("TP1").Range("1,1")
これを
Workbooks(OpenFileName).Worksheets("PG1").cell("1,1").Copy Workbooks("book1").Worksheets("TP1").Range("1,1")
にするとよい。
あ、ごめん、フルパスで入ってくるのか?
>>186 セルの選択は出来てしまいますが、ロックはされてるので内容の変更は
出来ないようになってますよ。
これではダメなのでしょうか?
選択すら出来ない様にしたいという事ですか?
196 :
190 :2006/08/02(水) 00:07:38
Set book = Workbooks.Open(OpenFileName) しといて book.Worksheets("PG1").cell("1,1").Copy Workbooks("book1").Worksheets("TP1").Range("1,1") 試してないけど。
If OpenFileName <> "False" Then Workbooks.Open OpenFileName fname = ActiveWorkbook.Name End If Workbooks(fname).Worksheets("PG1").cell("1,1").Copy Workbooks("book1").Worksheets("TP1").Range("1,1")
200 :
190 :2006/08/02(水) 00:43:13
>>200 エラーのメッセージぐらい書け
たぶん、想像はつくが
202 :
190 :2006/08/02(水) 00:58:01
どれも、「インデックスが有効範囲にありません」でした
cell("1,1") って何だよ
>>202 ブック名のことかと思ったら、あんた根本的に理解できてないよ
205 :
190 :2006/08/02(水) 01:02:51
すいません、 つっこまれると思ってたんですけど、それ(A,1)です
206 :
190 :2006/08/02(水) 01:03:41
> Workbooks("OpenFileName").Worksheets("PG1").cell("1,1").Copy Workbooks("book1").Worksheets("TP1").Range("1,1") めちゃくちゃ
209 :
190 :2006/08/02(水) 01:10:08
>>207 これでも勉強したつもりなのですが。
出来ればどの辺りがオカシイか教授いただけませんか?
無理なら無理で結構ですので
210 :
190 :2006/08/02(水) 01:10:42
いや、勉強したつもりはオカシイ。勉強してる最中ですね。
>>210 作業をさせたいところのみを早く調べたいのはわかるけど
ググれば初心者向けにVBA解説してるところとか、サンプルコードを載せて
くれてるところがあるはずだよ。
先に言われている通り、、かなり滅茶苦茶だから面倒臭がらずに調べて
みよう。
そんなあなたに やりたいことを マクロに記録 して勉強しましょう
セルの操作は基本中の基本だよ。
cell("1,1")もRange("1,1") もRange(A,1)も間違ってます。
>>212 マクロの自動記録は無駄が多いし、セル操作を学ぶには不向きだよ。
誰も正解を書かない件について。 # やりたいことがわからないというレスは却下
>>213 も言ってるけどさ、基本的な命令(予約語)ってExcelに入力すると頭文字が大文字になるのね。
それを踏まえて、さっきから貼ってる自分のソースを見てごらん。
それと自分が初心者だという自覚があるなら、コピーとペーストを命令分けて書いて
ステップ実行させなさい、そうすりゃどっちがおかしいかわかるから。
Range文の間違い、わからなければヘルプを。
明らかにヘルプを見る手間を省いた質問に、優しく答える人は少ないよ。
つ〜か指摘してるっぽい人達もなんでcell()に触れないのかわからん…
> マクロの自動記録は無駄が多いし、セル操作を学ぶには不向きだよ。 セル操作を学ぶレベルには到底達していないのだが それに無駄以前のレベル 間違いに気付ければ丸儲け
218 :
190 :2006/08/02(水) 02:22:21
グダグダ言わずに正解おしえろよ、クズども
>>216 コピーとペーストに分けて、って書いただろ
面倒だから書くわ
Workbooks("Book2.xls").WorkSheets("Sheet1").Cells(1,1).Copy _
(Workbooks("Book1.xls").WorkSheets("Sheet1").Range("A1"))
>>577 > Sub HideColumns(xcolumns As String)
> Dim strColumns As String
> strColumns = xcolumns
> columns(strColumns).Select
> Selection.EntireColumn.Hidden = True
> End Sub
>>578 > Sub HideColumns(strCcolumns As String)
> Columns(strColumns).EntireColumn.Hidden = True
> End Sub
上記は別スレの内容だけど
無駄であっても、
個々の内容が理解できていないと無理
そうでないと、ちょっと変えただけで???となるでしょ
最初のうちは、あえて無駄な行があってもいいと思うけどな
>>190 悪い事は言わん。手でコピペしとけ。
CellsとRangeも使えなくて出来るほど
VBAはガキのおもちゃじゃない。
これは君への皮肉じゃなく本心だ、
>>213 も同じように思って書いたんだと思うぞ
◆MutsukiYtk
224 :
213 :2006/08/02(水) 07:00:20
「セル操作が出来ないと、Excelで何も出来ないな」と思って書きました。 どこが間違ってるか分からないと探しにくいだろうと思って セル操作に関して間違っている箇所を上げておいただけなのですが…。
225 :
190 :2006/08/02(水) 13:12:51
>>221 Cellsでしたか。ありがとうございます
ガキではないですが、もう少し勉強してからここに来ることにします
226 :
デフォルトの名無しさん :2006/08/02(水) 19:16:33
クイックソートを再帰を使わずに書きたいのですがよく分かりませんorz A列の配列を並び替えたいのですが・・・
>>226 逆に聞くけど、再帰使わない利点って何なの?
228 :
182 :2006/08/02(水) 20:30:08
レスください・・・・・・。 184でマクロさらしてます。
>>226 よく解らないということは、全く解らないわけでは無いんだな。
んじゃ、丸投げしないで出来てる部分だけ晒せ。話はそれからだ。
というか、コードを書くことだけに走らないで、まずはクイックソートの
アルゴリズムをきちんと理解しろ。
>>227 高速化だろ。Subプロシージャの呼び出しって結構遅い。Functionはもっと遅いけど。
あと、配列要素の上下限算出を盛り込める。
一般的にクイックソートは「配列, 配列要素下限,配列要素上限」などと3つの引数を渡すが
再起使わず内部ループにすると、プロシージャの頭で上下限算出すればいいから配列変数だけポンと渡せる。
>>228 さようなら。
>>228 たぶんVBAでは無理なのでWin32APIを呼ぶ
231 :
226 :2006/08/02(水) 21:52:30
>>227 大量のデータを処理する時は再帰だとできんとか言ってました。
>>229 内部ループのとこを詳しく教えて頂きたいのですが
>>231 クイックソートでググればたくさんでてくるぞ
アルゴリズムが理解できないなら
VBのコードもあったからそれコピペすれば?
233 :
226 :2006/08/02(水) 21:56:03
学校の授業で VBAを使ってゲームを作る事になったんですが、VBAの事をほとんど何も教えてもらって無い状態で、作業が全く進みません 生徒もやる気が無いけど、それ以上に教師にやる気が無くて困っています 頑張って、本に書いてある通りにプログラムを打ち込み、シューティングゲームを作ったんですけど、ありえないぐらいクソゲーで、もう自分の力ではどうしようも無い、ということを悟りました ですので、どこか いいプログラム置いてある場所知りませんか? 邪道かもしれませんが、それをコピーして貼り付けよう思います どなたかお願いします
俺か。
学校に行ってるって事は、お金払って教えてもらってるんだよね。 「お金払ってるんだから、きっちり教えて下さい(義務を果たして下さい)」とか言ってみたらどう? まぁなかなか言いづらいけどさ。 親が払ってるのか自分で払ってるのか分からないけど 汗水流して得たお金払ってちゃんと教えてもらえないなんて、腹立たない?
【Excel 2003】 Workbooks.Add で新規作成したブックの ThisWorkbook モジュールに、 Workbook_SheetChange 等のイベントを記述する方法を どなたかご存じないでしょうか?
240 :
238 :2006/08/04(金) 10:47:43
>>239 意外と簡単に実装できるってコトですか・・・?
まさか、
コードウインドウ開いて入力するとか、じゃないですよね?
Workbooks.Add したブックへ自動的にWorkbook_SheetChange 等のイベントを
挿入したいんですが・・・。
当たり前のことを聞いてたら申し訳ありません。
>>239 わかった上で言ってるんなら是非とも教えて欲しい。
少なくとも簡単に実装できるものではないと思う
>>240 Addではなく、既にSheetchange等マクロが入ったファイルをコピーするのではダメか?
中のソースをいじらせる必要があるのか?
方法が思いつかないわけじゃないが、試した事がないからな。とりあえず
>>239 先生の回答を待ってみてくれ
242 :
238 :2006/08/04(金) 12:45:40
>>241 ファイルをコピーするのは思いついてはいるんですが、
一応、ブック単体での動作を予定しているので・・・。
VBとかみたいにリソースファイルを扱えるならよかったのですが・・・。
244 :
238 :2006/08/04(金) 12:59:38
>>243 ウイルスか、
まぁ、確かにそうですよね。
限りなく実現不可能そうですね。
参考URLも見てもう一度検討してみようと思います。
245 :
243 :2006/08/04(金) 13:13:33
246 :
238 :2006/08/04(金) 13:45:32
>>245 おお、その手がありましたか。
私のほうも追加したブックを独立させて動作する必要は無いので
参考になりそうです。
ありがとうございます!
>>229 A列を並べ替えるならsortメソッドが最速じゃないか?
今からVBA始めるって人にお勧めする参考書や教材って何かないかな?
> A7:自分で実際に読んで(閲覧して)、自分のレベルに合っていて解りやすいと思うものを利用しましょう。
>>248 VBAの本なんて星の数ほどあって
その中で自分の知ってる本はほんのわずか。
しかもどんどん新刊が出て入れ替わる。
とても特定の本をお薦めできる状態じゃないね。
一つの方法として、アマゾンのサイトで検索してみて
売れている純に表示させ、読者レビューを読んでみる
といいかも知れない。当てずっぽうで買うよりマシだろう。
どうせ、1冊ですむはずも梨
>>250 どんな言語でもそのような状況なのに、なぜお勧め本が存在するんだろう?
まず1冊買う。 難しすぎると感じたら、易しそうな本を買う。 易しそうなら、その本の内容を理解しつくして、難しそうな本を買う。 ちょっとだけ難しいなと思ったら、その本がたぶん正解。理解するまでがんばる。 以下繰り返し。
大村なんてらの本買っときゃ、まず間違いない。
257 :
デフォルトの名無しさん :2006/08/06(日) 10:05:50
VBAでOLEは使えるのでしょうか?
____ /⌒ ⌒\ ング ング / (●) (●)\ /::::::⌒(__人__)⌒:::: \ チュパチュパ | ( \ | \_ ヽυ ::\ / \ .:::\
>>258 OLEのツールボックスの出し方さえわからないのです・・・orz
初心者プログラマにOLEは敷居がたかいのかな・・・
君の跳躍力が一般人よりk
262 :
デフォルトの名無しさん :2006/08/06(日) 15:03:53
マクロの記録で自動作成されたコードを読むことを繰り返しております。
Range("A5").Select ActiveCell.FormulaR1C1 = "nurupo" もうあほかと。
>>257 VBAでWordやExcelの操作をすることからしてOLEのおかげ。
265 :
デフォルトの名無しさん :2006/08/06(日) 18:24:44
なんか勘違いしてたかも・・・ VBAとブラウザを連動させたかったのですが、 それはOLEで実現するのは間違いなのでしょうか?
エクセル2000でセルの書式で1を0001とか表示させてんのね。 そんでそれをCSVに出力すると1になっちゃうのを0001のまま出力するにゃどうすりゃいいの? 1の書式を文字列にして0001にしても同じじゃんよ? 読み込みはTextFileColumnDataTypesでできたんだけど出力さっぱりわからん
そのブラウザがOLEに対応してるかどうかで変わってくるな。 つーか、VBA(VB言語でMS Office Applicationを操作)の話ではなく 普通のVisual Basic(VB言語で汎用的な処理)の分野の話なので本スレでどうぞ。 このへんのやり方は、VBAでやるにしてもVBとやり方変わらないし。
>>266 それこそVBAの分野だろ。
ワークブックのメソッドを使ってCSV保存するのなんてVBA使ってるとは言わん。
マクロの記録そのままでもいけるからな。
VBA使ってセルのデータを取得し、テキストに書き出す部分を自前で実装してこそ
VBAを使ってると言える。これなら値の取得を.Valueではなく、.Textにすることで
セルの値ではなくセルの表示結果が取得できる。
>>266 ん?俺のExcel2000は
ゼロ付きのままcsv保存されるよ
どうやって保存してんの?
がんばります
脳が千切れそうです
273 :
デフォルトの名無しさん :2006/08/07(月) 21:29:23
エクセルでファイルを開くと同時に、VBAを起動する為には SUBとEND SUBの間にどう入力すればいいでしょうか。
274 :
デフォルトの名無しさん :2006/08/07(月) 21:37:07
Workbook_Open()?
Sub Auto_Open() ………… End Sub
276 :
デフォルトの名無しさん :2006/08/08(火) 00:34:25
Sub miko_test() Dim i As Integer, j As Integer, n As String, nn As String Application.ScreenUpdating = False i = Sheets.Count n = ActiveWorkbook.Name For j = 1 To i Sheets(j).Copy nn = ActiveSheet.Name With ActiveWorkbook .SaveAs "C:\My Documents\" & nn .Close End With Next Application.ScreenUpdating = True End Sub すみません。これが動かないのはなぜですか?
勘:Activeを使うとろくなことがない
278 :
デフォルトの名無しさん :2006/08/08(火) 00:39:22
どーいうことですか? はじめてVBAを使おうとしてます。。 明日会社で必要なの。だれか教えてください!
>>278 nn = ActiveSheet.Name
↓
nn = Sheets(j).Name
うまくいかなかったにしても自分でやってみたこと(組んだ数式やコード)は書きましょう。 例えエラーになる式やコードでも、何をやりたいのかを的確に把握する手がかりになります。 その上で、どううまくいかないのかを具体的に書きましょう。 エラーが出るなら、何処でどういうエラーが出るのか、 想定外の結果が出るなら、条件と想定上の結果、実際の結果などを詳しく書いてください。
>>276 パスがねえんだろ
おまいのマイドキュメントはホントにそこにあんのか?
ところで、n=ActiveWorkbook.Nameは必要なの?
Copyメソッドに何かが足らない たぶんソレ シート毎に分割して保存するならな
リストボックスで右寄せにすると一番右の字がスクロールバーに隠れちゃうのってデフォなん? 回避する方法ある?
>>286 うぉぉぉおぉ本当だ!!今まで気づかなかった。
スクロールバーが無いときを基準に右寄せしてるっぽいね。
消極的にいくと..全ての値の後に空白入れるとか、ラベルとSpinbuttonで擬似的に作るか..
288 :
287 :2006/08/08(火) 21:22:10
案2(思いつき):ColumnCountを2にしてうまいこと調整する
値だと後ろに空白入れることできないんじゃん?できるのかな? 文字列にして後ろに入れればいいんかな?
290 :
287 :2006/08/08(火) 23:11:30
>>289 色々試してみたけど、やはり Column.Count=2 で二列目に空白データぶち込んで
ColumnWidth = (リストボックスの幅-15) ; (10) に指定すると中々よい感じ。
なんだが、スクロールバーが出ない少ない量になると不自然な空白が現れる。
あと、環境によってスクロールバーのデカさが変わってくると....
291 :
デフォルトの名無しさん :2006/08/09(水) 01:48:09
Public Const WM_USER As Long = &H400 Public Const WM_CAP_START As Long = WM_USER Public Const WM_CAP_FILE_SAVEDIBA = WM_CAP_START + 25 Private Declare Function SendMessageAsString Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long Public Function capFileSaveDIB(ByVal hCapWnd As Long, ByVal FilePath As String) As Boolean capFileSaveDIB = SendMessageAsString(hCapWnd, WM_CAP_FILE_SAVEDIBA, 0&, FilePath) End Function ↑で、クリップボード中の画像をファイルにして保存したかったりするわけですが FilePathを---\hoge.bmp にすると約800KBのファイルが出来ます FilePathを---\hoge.jpg にしても約800KBのファイルが出来ます これ、どうにかなりませんか せめて1/5ぐらいのサイズになりませんか どこかで見つけたDoodle2というDLL使うと bmpとjpgではかなりサイズに差が出るんですけど、できればこのDoodle2使わずに。。。無理ですか?
>>291 ※文句は受け付けません。
Sub jpgsss()
Dim jaws As Chart
Set jaws = ThisWorkbook.Charts.Add
jaws.Paste
Debug.Print jaws.Export("c:\2ch.jpg", "jpg")
End Sub
ありがとうございます サイズは1/10ぐらいまで縮めることが出来ました Debug.Print jaws.Export("c:\2ch.jpg", "jpg") は Debug.Print jaws.Export("c:\2ch.jpg", "jpeg") ですよね いや、そんなことはどうでもいいんですけど このやり方は、まず貼りつけちゃうわけですよね これってグラフ? で、何というか、その。。。あ、いえ何でもないです おやすみなさい
294 :
292 :2006/08/09(水) 04:52:33
>>293 まだしばらく起きてるので答えられる範疇だったら何でも答えますよ。
295 :
デフォルトの名無しさん :2006/08/09(水) 13:24:14
質問です。 アクティブになっているシートからグラフを作りたいんですが どのようにすればいいですか? とりあえず、ここまで作ったんですが、よろしくお願いします! Charts.Add ActiveChart.ChartType = xlXYScatterSmooth ActiveChart.SetSourceData Source:=Sheets("sheet1").Range("A1:G4354"), _ PlotBy:=xlColumns ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).XValues = "=sheet1!R2C1:R4354C1" ActiveChart.SeriesCollection(1).Values = "=sheet1!R2C2:R4354C2" ActiveChart.SeriesCollection(1).name = "=""系列1""" With ActiveChart .HasTitle = True .ChartTitle.Characters.Text = "HD" .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "xxxxx" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "yyyyy" End With
297 :
295 :2006/08/09(水) 14:22:29
マクロの記録を使ってもシート名が出てできないんです 助けてください
>>297 マクロの記録ができないんだったら、それはマクロでは書けないという事じゃないかな。
299 :
デフォルトの名無しさん :2006/08/09(水) 14:44:57
マクロの記録だと始めからアクティブになっているからできないんだよ
300 :
292 :2006/08/09(水) 14:58:07
一番最初にset なんちゃら =activesheet にしてActiveChart.SetSourceData Source:=Sheets("sheet1").とかの sheets("sheet1")の部分を「なんちゃら」に変えてやればよし。 しかしまず、「ActiveChart」という表現を使うのはやめたほうが吉だと思う
301 :
295 :2006/08/09(水) 15:25:39
ありがとうございます! ActiveChart以外の作り方があったら教えてください!
>>301 それくらい類推してくれ。「active」で苦しむのを身をもって体感したばかりだろ?
chartも同じように set どーたらこーたら = charts.add
としてあげて、あとは全部withブロックで囲むとか。
みんなスキルすげえなw
しょうがないので左に列を1個増やして0を入れたです 値が入ってない列入れてもその列無視された
>>305 そうですか...根本的な解決は難しそうですね
VBAでコントロールの仔細な動作を制御しようとするのがそもそも
308 :
デフォルトの名無しさん :2006/08/12(土) 00:50:35
離れた列を VBA から Select して領域を指定したいのですが、 その領域の記述法をご教授いただけないでしょうか? マクロの記録から、Range("B3:B11,D3:D11") のように、二つの列(例えばB列とD列)をコンマで区切れば 良いことはわかったのですが、これを「3 行から 11 行」のように固定ではなく、 変数Nを用いて「3 行から N 列」のように可変にしたいのです。
309 :
308 :2006/08/12(土) 00:56:34
「3 行から N 行」でした。
"B3:B"&N&",D3:D"&N
>>308 union(range, range)
312 :
308 :2006/08/12(土) 01:27:32
Excelvbaで組んだコードと同じ動作のものをvbでも組んで見たいと思うのですが Microsoft Visual Basic 2005 Express Editionで参照にexcelを追加すれば簡単に行けそうですか? 自分はvbaは少し経験があります。vbaの参考書籍もあるので似たようなものなら挑戦してみたいのです。
> Microsoft Visual Basic 2005 Express Editionで参照にexcelを追加すれば簡単に行けそうですか? Excelオブジェクトのメソッドなどは使えるようになるが、 VBAと互換性のあるVB6以前と、VB.NET 2002〜2005は基本的な構文規則の部分が違うので VB2005でVBAのコードそのままでは動かないことが多い。VBAのコードそのまま使いたければVisual Basic 6.0を買え。 完全互換ではないので構文的にVB6→VBAで動かない部分はあるが、VBA→VB6で動かない部分はほとんど無いだろ。
>>314 難しいのですね。
vb6は手にはいらないと思うので2005でがんばります。
ありがとうございました。
>>313 同じ動作のプログラムを作り直す気があるのならその組み合わせでも行けると思う。
但し、同じ動作の(似たようなロジックを持つ)別のプログラムになることは間違いない。
317 :
デフォルトの名無しさん :2006/08/13(日) 16:47:07
リアルタイムスプレッドシートを使っています。 セルの値が刻々と自動で変化するようになっています。 一つのセルだけに注目して、そのセルの値が変わった時にだけ発生するイベントとかありませんか? あるいはそれを実現する為の裏道とか知ってらっしゃる方がいたらお教え願います。 特定のセルの値が変わったらソースを実行したいと思っています。 他のセルの値も変化しますが、それにはひっかからないようにならないかと考えています。 よろしくお願いします。
>>317 Worksheet_Change
If Target
他のセルの値が変わってもイベントが発生すると言うかも知れないが、
何故このイベントにByVal Target As Rangeという引数があるのか考えてみよう。
もし、Worksheet_A1_Change〜Worksheet_IV65536_Changeなんて感じで
Changeだけで16777216個ものイベントが有ったらたまったものじゃないだろ。
しかも2007では更に・・・
それに例え16777216個のイベントを用意したとしても、
Worksheet_Changeイベントを起こしてから、Targetで条件分岐するか
条件分岐してからWorksheet_***_Changeを起こすかの違いで
対象以外のセルの値変更で内部イベントが起きることには変わりない。
ただそれが見えるか見えないかの違いだけ。
こういう引数のあるイベントってのは、ユーザーの見えない弄れないところで条件分岐させるより
ユーザーが見て弄れるところで条件分岐させた方が効率よいから、条件を引数にしてるだけであって
見えないからってその処理をしていないわけじゃないから、
見えなくなったから効率が良くなる処理が早くなるってわけじゃない。
つまり君の望むような物があったとしても、引っかからないのではなく引っかかってるのが見えないだけだ。
ClassでEvent、WithEventsなんかを使うようになると解ると思う。
' INIに文字列情報を設定する関数(API)の定義 Public Declare Function WritePrivateProfileString Lib "kernel32" _ Alias "WritePrivateProfileStringA" _ (ByVal lpApplicationName As String, _ ByVal lpKeyName As Any, _ ByVal lpString As Any, _ ByVal lpFileName As String) As Long iniファイルをあれこれいじるために調べていたらこういうのが見つかった んですけど、ここでAsの後に出てくるAny というのは一体どういうものなん でしょうか?
VBA で複数のセルに内容を記入する際、For 文で回して Sheet1.Cells(i,j) = 値 のようにしているのですが、データ数が数千に及ぶようになるとセルの記入に時間がかかってしまいます。 これを高速化する方法はないでしょうか? 例えば、データの配列を用意しておいて、それをFor 文で一つ一つ書き込むのではなく、 まとめて Cell に突っ込むような方法があれば、高速描画できそうな印象があるのですが、 そのような手法はないでしょうか?
もひとつ。 screenupdatingをfalseにして、描画後trueに。
>>321 range(cells(1,5),cells(5,5)) = split("1,2,3,4,5",",")
としてもすべてのセルに1番目の要素が入ってしまうのですが、どうすればよいでしょう。
325 :
321 :2006/08/13(日) 21:09:13
>>324 ちょっとVBAから遠ざかっているので、回答ズバリのコードがか書けなくてすまん。
range = arrayの場合、双方とも二次元配列として捕らえられる。
arrayが一次元配列の場合は、横方向のrangeにはそのまま設定できるが、
縦方向のセルの場合は、arrayの最初の要素だけが設定される。
縦方向に繰り返し設定されるのは、range("A1:A5") = 10などとしたときに、
全てのセルに10が設定されるのと同じ理屈。
イミディエイトペインで
a = range("A1:C2").Value
range("B4:D5") = a
としてみると、お互い二次元であれば正しく動くことが確認できるはず。
ただし、俺はその「a」を、VBAでどう書くのかは忘れてしまった・・・。
なんか簡単に書けた気もするのだが・・・。
326 :
デフォルトの名無しさん :2006/08/14(月) 00:42:57
板ちがいだったのでVBA総合スレッドで質問します。 【1 OSの種類】 WindowsXP 【2 Excelのバージョン】Excel2000 COMアドインでDLL作ったのですが、使い方がわかりません。 新規アドインの標準モジュールに Sub hyouji() Msgbox "メッセージボックス" EndSub のコードを書いてDLLを作りました。どうすればエクセルの別のブックか ら「hyouji」を呼べるのでしょうか? DLL作っただけです。設定とかも教えてください。よろしくお願いします。
>>326 素のExcel2000でCOMアドインが作成できました?
Officeデベロッパーぢゃありませんでしたっけ。
まっ私は Officeデベロッパーを使った事が無いのでお手伝い出来ませんが。
328 :
デフォルトの名無しさん :2006/08/14(月) 02:00:44
>>320 二次元配列をセルに転記するなら
Option Base 1
Dim mdate(4, 2) As Integer
Range(Cells(1, 1), Cells(4, 2)).Value = mdate
で、まとめて入力できるよ。
329 :
デフォルトの名無しさん :2006/08/14(月) 11:57:41
>>318 とても興味深いレスありがとうございます。
一つづつ調べて頑張ってみます☆
VBAでlzhのファイルをダウンロードする方法ないでしょうか?
スレ違い
>>332 ありがとうございます。
検索したらVBAによるTCP/IPプログラミング入門の本がありましたので勉強してみます。
サンプルがどこかにあれば参考にしたいなと思ったけどないですよね?
>>333 WinInetはそんなTCP/IPの世界より高レベルだから、
直接的にその本が役に立つかは微妙。知っておいて損はないだろうけど。
WinInetくらいググればサンプルはきっと見つかると思う。
保守
336 :
デフォルトの名無しさん :2006/08/20(日) 19:13:47
空白のセルと、0を比べたらTrueが返ってくるんですけど どうしてでしょうか?
>>336 一致するからだよ。
試しにワークシートで空セルを参照する式(=A1とか)書いてみな。0が返るから。
Excelの空セルは、厳密には""でも0でもないが、""にも0にも一致する。
339 :
336 :2006/08/20(日) 21:09:48
>>337 なるほど今度使ってみようと思います。
>>338 空セルは特別な扱いなんですね
なにか決定的な理由が欲しい・・
>>339 A1 = 1
B1 = Empty
C1 = =A1+B1
341 :
デフォルトの名無しさん :2006/08/21(月) 09:41:01
VBとVBAの互換性ってどのくらいありますか? べつの言語と考えたほうがいいんでしょうか? VBの本を買ってきてそのコードをExcelとかに付属の VBE上で実行すると実行できちゃうもんですか? たとえばカレンダーアプリみたいなもの。
>336 厳密には違うけど、セルはVariant型の変数だと思って扱うといいよ。 得られる文字数に制限あるけど文字列として扱いたいなら.Textプロパティを使うとか‥‥
>>341 VBには多機能なFormがあるけどExcelVBAには強力無比なスプレッドシートがある。
GUI周りは互換性がないが、演算だけならVBAへの移植は難しくない。
#同じ言語だが使い方が違うと思えばいい。例えばセールストークと演説は全然違う。
UserFormでは不満ですか?
単一ソフトのマクロフォームとしてはUserFormでも充分過ぎるが VBに慣れてる人には、不満だらけだろうな。
ドッチかというとVB自体に不満たらたらなんで気にならんかったw
>例えばセールストークと演説は全然違う。 ジャパネットたかたと選挙演説の違いがよく分かりません。
>>347 VB6で作ろうが、VBAで作ろうが、例えば簡易ストップウォッチならそっくりになるってこった。
349 :
デフォルトの名無しさん :2006/08/22(火) 17:23:46
質問です よろしくお願いします cells(1, 2)には式が入っていて計算の結果に寄って#NUM!となってしまう場合があります このときに if cells(1, 2)>0 then などとif文を使ったりするとエラーがでて止まってしまいます。 これを回避するために「cells(1, 2)が#NUM!の場合」というif文を入れたいのですが なんて書けばいいのですか? 初歩的な事だと思うんですがわからないので教えてください。
ISERROR?
352 :
デフォルトの名無しさん :2006/08/22(火) 23:22:24
353 :
349 :2006/08/23(水) 10:13:58
>>350-352 どうもありがとうございます。
ISERRORって奴を知らなかったのでどうしていいか分かりませんでした。
助かりました。
354 :
デフォルトの名無しさん :2006/08/23(水) 15:18:23
質問です。 エクセル上でCtrl+F≠ナ検索ウインドウが開きますが、 VBAで起動させる際は、subとEnd subの間になんと書き込めばいいでしょうか。 よろしくお願いいたします。
355 :
デフォルトの名無しさん :2006/08/23(水) 16:17:07
SendKeys "^(f)"
356 :
デフォルトの名無しさん :2006/08/24(木) 14:06:26
354です。 ありがとう御座います。 このVBAをコマンドボタンにて起動させ様ようと、 下記の通り作成しましたが、反応がありません。 想定出来る原因はわかりますでしょうか。 また、コマンドボタンで検索を実行させる模範例をご教授して頂ければ助かります。 Private Sub CommandButton1_Click() SendKeys "^(f)" End Sub
>>356 原因:フォーカスがシート上に無いから。
358 :
デフォルトの名無しさん :2006/08/24(木) 16:41:03
>>357 初心者ですいません、フォーカスが解りません。
具体的にどうすればよろしいでしょうか。
エクセルでさ、セルに入力する時に そのセルの上クリックしたら枠が太くなるじゃん その状態を、シートのセルにフォーカスした、と言うんだと。
360 :
デフォルトの名無しさん :2006/08/24(木) 17:33:44
>>358 ツールバーに検索ボタンを登録してみては?
ツール→ユーザー設定→コマンドタブ→編集→検索ボタンをツールバーにドラッグ
361 :
デフォルトの名無しさん :2006/08/24(木) 18:03:48
>>357 >>359 ありがとうございます。理解しました。
VBAで検索機能をもたせたコマンドボタンを、エクセルシート上に保存して、
メール添付して相手に送りたいのです。
相手側で開いたときにうまく機能しないのですが対策が解りません。
そりゃ、相手のセキュリティ意識が高いからじゃねぇの?
363 :
デフォルトの名無しさん :2006/08/24(木) 19:01:16
>>362 相手に連絡をし、マクロのセキュリティレベルは「低」にしましたがダメでした。
>>363 「低」って・・・
おまい、ひどいやつだな・・・
365 :
355 :2006/08/24(木) 19:10:32
355です。すまんかった。 フォーカスがセルにある状態で"Ctrl+F"出来ればいいんだろ? いんちきくさいけどこれでできるかな? Private Sub CommandButton1_Click() ActiveCell.Activate Application.Wait (Now + TimeValue("00:00:01")) SendKeys "^(f)" End Sub VBA的に正しいかどうかは不明
366 :
357 :2006/08/24(木) 19:36:48
いっそユーザーフォームで検索ウインドウと似たような物を作って、 findメソッド使うって手はどうかな?
367 :
デフォルトの名無しさん :2006/08/25(金) 02:36:27
自前で関数をつくりたいのですが、 Function kannsuu(N) Worksheets("1").Cells(1, 2) = Worksheets("1").Cells(1, 1) End Function としても途中で処理が止まってしまいます。 止まる理由もわからず、したい事もできず困っています。 実現する方法を教えて下さい。
シート名
なんでSendkeysは普通のプロシージャだと動くのに ユーザーフォームに登録すると動かないんだろう?
Private Sub CommandButton1_Click() Application.ScreenUpdating = False Application.Wait (Now + TimeValue("00:00:01")) Application.CommandBars(1).Controls(2).Execute Application.CommandBars(1).Controls(2).Controls(14).SetFocus SendKeys "{ENTER}", True Application.ScreenUpdating = True End Sub
371 :
370 :2006/08/25(金) 08:39:42
削ったら1行になった orz Private Sub CommandButton1_Click() Application.CommandBars(1).Controls(2).Controls(14).Execute End Sub
Application.Dialogs(64).Show
374 :
デフォルトの名無しさん :2006/08/25(金) 09:36:05
>なんでSendkeysは普通のプロシージャだと動くのに >ユーザーフォームに登録すると動かないんだろう? 動くんじゃね?ターゲットとなる対象が間違ってるんじゃね? Private Sub CommandButton1_Click() SendKeys "{TAB}" End Sub これならユーザーフォームではなくてCommandButton1に対してTABキーを送ってるのよ
375 :
デフォルトの名無しさん :2006/08/25(金) 09:47:40
>Application.Dialogs(xlDialogFormulaFind).Show これ実行した後だと"Ctrl+F"が実行できなくならない?なんでだろ
376 :
デフォルトの名無しさん :2006/08/25(金) 09:59:35
質問です。 閲覧者が複数でひとつのアドレスを共有している場合、個別に閲覧確認する良い 方法はありませんでしょうか。 パソコン使えない方が多いので、個別にアドレスを設定する事が出来ません。 例えば添付ファイルにエクセル貼り付けて、VBA使用して個別の名前のコマンドボタンクリックすれば 閲覧情報が返って来る様なプログラムは出来るのでしょうか。
377 :
370 :2006/08/25(金) 10:00:27
>>374 369をみてユーザーフォームからSendKeysが効かないのであれこれしてただけなんで。
むりやりSendKeys "{ENTER}", Trueで効くじゃんと思ったが無駄だなぁと省いたら
Application.CommandBars(1).Controls(2).Controls(14).Executeだけに。
それなら
Application.Dialogs(xlDialogFormulaFind).Showでいいわけなので結果無意味だったかな
まぁ、SendKeysだけでフォームから動作できなかったわけだが。
これのSetFocusのあとだから効いたの?
Application.CommandBars(1).Controls(2).Controls(14).SetFocus
SendKeys "{ENTER}", True
378 :
デフォルトの名無しさん :2006/08/25(金) 10:01:02
376です。 outlookを使用しています。
379 :
370 :2006/08/25(金) 10:27:06
380 :
デフォルトの名無しさん :2006/08/25(金) 20:41:03
>>368 シート名と言うと、上の例だと1ですよね。
色々変えてみたのですが、やはり処理が途中で止まってしまいます。
関数だと他のセルの操作ができないのかな〜
誰か助けて下さい〜
SendKyesなどという過去の遺物は忘れ去るべし
まぁExcelの中だけなら・・・
384 :
デフォルトの名無しさん :2006/08/25(金) 22:29:04
>>383 全然話についていけないのですが、関数では無いとはどう言う事でしょうか?
関数では無いからエラーになるまではわかるのですが、関数の定義と言うか、どこがおかしいのかがわかりません。
何がいけないのか教えてもらえないでしょうか。
>>384 日本語が分からない人に日本史を教えるような難しいことはできん。
とりあえずまず、なぜ「自作関数」が必要なのか教えてくれ。
>>384 まず何がしたいのかがよく分からない。
Functionは値を渡し、Function内で処理をして値を返す物です。
387 :
デフォルトの名無しさん :2006/08/25(金) 23:38:47
>>385 刻々と値の変化するセルが300個ほどあります。
特定のセルが変化した時にだけ処理を行いたいと思っています。
それを実現するには自前の関数を作ればいいと教えてもらってのでやってみました。
ただ、その処理と言うのが他のセルに値を貼り付けるとまでは説明していませんでした。
関数では他のセルに値を貼り付ける事はできないようなので、素直にイベントでやってみます。
負荷を少しでも軽くする抜け道がないかと思ったのですが。
388 :
デフォルトの名無しさん :2006/08/25(金) 23:44:23
>>386 なるほど。
関数の意味がわかりました。
ありがとうございます。
なぜ「刻々と値が変化」してるのだ?
>>387 5回読み返してやっと意味が6割くらい理解できた。
ワークシート関数から呼び出すからといって処理が軽くなるわけじゃないので、
イベントでやるのが正解(=後で処理しやすい)だと思う。
>>389 Webクエリとかじゃね?
392 :
デフォルトの名無しさん :2006/08/26(土) 00:09:54
>>389 証券会社から株価のデータをリアルタイムで受け取っています。
リアルタイムスプレッドシートって事くらいしかわかりません。
なぜ変数に英数字使う人が圧倒的に多いのですか? 漢字やひらがなを使った方がコードが非常にわかりやすくなると思いますが。 途中で入力を切り替えなければいけない煩わしさを補って余りあると 思います。
>>390 説明が下手ですいません。
株の取引上、最速が必要でした。
イベントだと1秒に100回は処理する事になるので。。。
>>393 会社だと英語表示じゃないと困る事がある。
一つのシステムを複数の会社で作るとき自社だけ漢字を使うわけにはいかない。
説明になってない件
結局のところ、惰性でみんな英数字を使い続けるんだよ。 もっともらしいことを言えば、直接入力できない煩わしさの方が 利便性より上回ると多くの人が考えているのだろうとか、 英語はプログラマの共通語だと格好づけるなどといったところかな。
日本語変数に慣れてしまうととVB以外の言語で困る、とか VBやってる人は他の言語もできるので、その言語に合わせてるとか。
400 :
デフォルトの名無しさん :2006/08/26(土) 01:03:01
おいらの場合、慣れの問題。VBに関しては 普段Cでもプログラム書いてるので英数で書くのが普通。 一度実験で日本語込みで書いた事あるけどコメントと区別がつかなくて読みにくかった(例:[txt問題番号]みたいな書き方の場合) 色でも区別を付けてるんだけど、やっぱり日本語はコメント文に見える。 あと、日本語で書くと色々うるさい奴がいる可能性があるので英数で書いておくのが無難ってのもある VB,VBAはIDEが優秀だから日本語でもいいんだけどね、個人的には
単純な話、漢字を変数に使い始めると誤変換やらかす馬鹿が出てくるって問題もあるがな。 「"貸方"をセルに代入しようとしているんですがエラーになっちゃいますぅ」 「あれだ、"貸し方"って変換してりゃぁそりゃエラーにもなるだろ」
>>401 それはスペルミスと同じレベルの問題で漢字特有って程じゃない。
それに人為的ミスがあって不都合が発生するのは当然。
スペルミスも誤変換も、インテリセンスと変数宣言の強制という同じ方法で防げるし。
>>402 確かになぁそうだな。「0」「o」「O」、「1」「l」で同じことが言えるかもしれないし。
ただ、やはり他人の書いたコードに2バイト文字の変数があると身構えてしまう。
404 :
デフォルトの名無しさん :2006/08/26(土) 21:16:42
ふだんWebアプリをつくっているのですが、 このたびエクセルVBAをフロントに使った大きめのシステムをつくることになりました。 WebアプリではRubyのRailsやJavaのSpringなどフレームワークが流行ってますが VBAではそういった開発に役立つようなフレームワークってありますか? VBAunitは使ってみようと思っていますが。
VBAという言語自体がフレームワークなんだが。 だからこそVB含めて、ここまで初心者の間に広まった。
406 :
404 :2006/08/27(日) 17:49:12
>> 405 > VBAという言語自体がフレームワークなんだが。 > だからこそVB含めて、ここまで初心者の間に広まった。 なるほど。 だけど複数人で開発とかになるとちょっとつらいですね。
普通の開発はフレームワークに機能を追加していくかたちだろうが Excelの場合多彩な機能を片っ端から無効化していく作業が必要だな。
408 :
デフォルトの名無しさん :2006/08/27(日) 20:37:50
お願いだからVBAは止めてください
>402 日本語使うと誤変換よりも送り仮名等でコードの内容を、口頭で伝えるときに不便なのかも‥ 一人で開発するには問題ないけどね
410 :
デフォルトの名無しさん :2006/08/31(木) 10:29:39
VisualBasic for Application専用の質問スレッドです。
411 :
デフォルトの名無しさん :2006/09/01(金) 00:24:37
Excel2000ユーザーです。 FileDialogオブジェクトを使おうとしたら、「ユーザー定義型は定義されていません」 というコンパイルエラーになりました。 参照定義には、Microsoft Office 9.0 Object Libraryがちゃんとチェックされています。 FIleDialogを使うにはオブジェクトライブラリの10.0以上が必要なんでしょうか?
VBSでなく、VBAならWinAPIを呼べばいいと思うのだが。
414 :
デフォルトの名無しさん :2006/09/04(月) 22:21:18
excel2000sp3を使用しています。 VBAにて計算処理をして、Ctrl+Vで変数の値を貼り付けれるようにできませんか? よろしくお願いします。
>>414 マクロをキーボードに割り当てればいいよw
>>414 とりあえずドコカのセルにぶち込んでCUTするとかじゃだめ?
417 :
414 :2006/09/05(火) 18:47:09
レスありがとうございます。 変数の値を一度セルにいれてからコピーし、 Ctrl+Vで貼り付けするとコピー元の書式や属性も張り付いてしまいますよね。 値だけペーストしたいのです。 形式を選択して貼り付けで値だけ貼り付けが可能なのは存じております。 Ctrl+Vでそれをできないものかと思いまして。
>>417 VBAで計算するのになぜCtrl+Vが出てくるのかが分からん。
何をしたいのかもっと詳しく。
>>417 APIの話になってくるからVBスレで聞いたほうがいいかも?
>>417 頭が固いんだよ
Ctrl+Vを頭から消せ!
マクロを右クリにでも割り当てろよ
だからCtrl+Vに割り当てればいいじゃない
>>417 418と同じ感想を持った。計算結果の変数:answerをそのまま、マクロで
目的のセルに代入すれば、Ctrl+Vは必要ない。 例:Range("A1").Value = answer
>Ctrl+Vで貼り付けするとコピー元の書式や属性も張り付いてしまいますよね。
コピー元が無設定のセルなら、書式、属性はコピー先が優先される。
Ctrl+Vも結果として、【形式を選択して貼り付けで値だけ貼り付け】と同じになる。
だから、計算結果の変数を無設定のセルに代入後、コピペすればいい。
VBAで求めた計算結果をそのまま、クリップボードに転送する簡単な命令はエクセルの
VBAにはない。代替方法として、APIを呼び出す方法やDataObject オブジェクトの
PutInClipboard メソッドを使う方法がある。しかし、416のようにセルを使い、
その操作をマクロで再現するのが、簡明である。
Ctrl+V の所作に関して。Ctrl+V にマクロを割り付けることは可能であるが、推奨しない。
標準の挙動を変えるとミスの元になるし、その操作になれると他のシートで勘違いを起こすから。
【形式を選択して貼り付けで値だけ貼り付け】をワンタッチでしたいなら、下記のマクロに
(キーは参考例)Ctrl+ALT+V を割り付ければいいだろう。
Sub Macro1()
ActiveCell.PasteSpecial Paste:=xlValues
End Sub
フォームのエディットボックスからコピーすればテキスト形式でクリップボードに入るよ。
424 :
414 :2006/09/06(水) 19:22:07
レスありがとうございます。 仕事で私が使用している製品別計算処理のVBAの結果データ(数字)を使用したいと 職場のおじいさんにいわれたのですが パソコン(エクセル)の扱いになれておらず、貼り付けたら書式設定が変になったから元に戻してくれといわれ 形式指定の貼り付けを教えても、間違えてしまい難しいといわれました。 おしいさんの使うエクセルのファイル名も貼り付けるセルの位置も不確定だったので 値だけコピーできれば単純に貼り付けでうまくいけないかと考えておりました。 Ctrl+Vにこだわったのは、この動作は右クリック貼り付けより使いやすいといわれたので・・・すみません。 私の方の処理結果を出力しているセルは固定なので、そこに値だけコピーできるボタンを作ってあげられればと思いました。 これからみなさんが教えてくださったことを調べて試してみます。 本当にありがとうございます。
425 :
デフォルトの名無しさん :2006/09/06(水) 20:55:17
キーマクロってどうやってセットするの? マイ関数作って、イベントかなんかで割り当てするの? ExcelVBA中級くらいのスペックのつもり。 でもやったことないからわからん。
中級者ならエクセルのマニュアルぐらい見たら? マクロの割り当て方法がいろいろ書いてあるよ。
> でもやったことないからわからん。 > でもやったことないからわからん。 > でもやったことないからわからん。 > でもやったことないからわからん。 > でもやったことないからわからん。
>>425 実は初心者の方が一発で分かるって話だな。
とりあえず「マクロの記録」の画面出してみろ。
>>425 疑問を持つことは悪くない。上級者だって知らないことはある。
俺だって数年前にオマエと同じ疑問を抱いた。しかし速攻で調べて速攻で自己解決出来た。
他の知識が豊富なら、キーマクロの割り当て方を知らずに中級者を名乗るのはいいとしても
キーマクロの割り当て方すら自分で調べられずに中級者を名乗るのは烏滸がましいにも程がある。
ヘルプに書いてあることを自分で調べられるようになって初めて初心者。
ヘルプに書いてないことを、応用で導き出せるようになると、そろそろ初心者も卒業。
そしてあとは、その導き出した物の出来で中級者以上へと昇格する。
初心者とは一人前の下っ端のことを指す。自分のケツも自分で拭けないうちは半人前で初心者以下。
つまり君はまだ初心者にも満たない「入門者」だな。早く門を潜り終えて、初心者の位置に立とう。
他人に教えられるようになったら上級者で、 他人に説教するようになったらご隠居です。
431 :
414 :2006/09/07(木) 18:48:03
解決しました。みなさん本当にどうもありがとうございました。 下記のようにやりました。ユーザフォームは非表示でテキストボックスだけつけてあります。 form.TextBox.Value = Cells(x,y).Value form.TextBox.SelStart = 0 form.TextBox.SelLength = form.TextBox.TextLength form.TextBox.Copy
>>431 Sub Macro1()
' Keyboard Shortcut: Ctrl+v
'
Dim x As Variant
x = Cells(1, 1).Value
ActiveCell.Value = x
End Sub
ツール→マクロ→オプション→ショートカットキーで
Ctrl+vに登録すれば良いと思う
違うとこで利用したい、クリップボードに取り込みたいなら
Private Sub Workbook_Open()
Dim n As Variant, CB As New DataObject
x = Cells(1, 1).Value
CB.SetText x
CB.PutInClipboard
End Sub
で出来ました。
参照設定でMicrosoft Forms 2.0 Object Libraryが必要です
userformを挿入すると自動的に参照設定されます
グラフの元データの参照範囲を変えるマクロを書こうとしています。 そこで現在の参照範囲を取得するために自動記録してみたところ ActiveChart.SeriesCollection(1).XValues = "A1:A5" のようになっていましたので aaa = ActiveChart.SeriesCollection(1).XValues としたのですが、この後、 bbb = aaa.Address としても「型が一致しません」と出て代入できません。 (この時、VBAE上でaaaにカーソルを合わせても何も表示されません) XValuesの値を取得するにはどうすればよいのでしょうか。 よろしくお願いします。
強引過ぎるなw
436 :
414 :2006/09/08(金) 19:15:58
>>433 初めてみる命令なので調べながら試させていただきます。
親切にどうもありがとうございます。
>>434 aaaってRange型なの?
Range型なら、Setステートメント使わないとだよね?
Range型じゃないとしたら、Addressプロパティを使うのはおかしいよね??
438 :
デフォルトの名無しさん :2006/09/10(日) 15:01:03
アクセスのVBAについて教えてください! リンクしたテーブルを一時格納して別のテーブルに追加する方法を教えてください! CurrentDb.Execute "DELETE * FROM テーブル;" CurrentDb.Execute "SELECT aaa,bbb,ccc FROM リンクしたテーブル into Dim??"(ここが分からない) CurrentDb.Execute "INSERT INTO テーブル (aaa,bbb,ccc) values('格納した数値','〃','〃')" SELECTで抽出されるレコードは複数です。 複数一気に入れて、一気に別のテーブルに入れる方法を教えてください。 (形式・桁数を変えないといけないので、一時的に変数に格納します。)
439 :
デフォルトの名無しさん :2006/09/10(日) 15:54:05
レコードセットにレコードを入れるところまでいけた あとは、INSERT どうすれば良い? 大至急
440 :
デフォルトの名無しさん :2006/09/10(日) 17:40:48
INSERTのvalueに変数は使えないのですか?
441 :
デフォルトの名無しさん :2006/09/11(月) 22:57:58
冗長な処理が多すぎて話にならないな。
>>443 .selectが一杯ナところとか、
Caseとかをchr()とかでまとめたりできる、ってのをいいたいんじゃないのかな?
あと、Sub Init()とかすごいし。
まぁ、でもマクロ登録で作ったって自分で言ってるんだから、ねぇ?
445 :
デフォルトの名無しさん :2006/09/12(火) 15:52:56
すみません。初心者です。 使用OS:Windows XP、Excel2003です。 Sheet1の5行目以降1行おき1列目に値が入力されています。 Sheet2は伝票のフォーマットです。 Sheet1の値をSheet2のE10にコピーして、 それを各行の値ごとに新しいシート (たとえばsheet1の5行目はsheet3に) sheet1が空白行になるまで出力し続けたいと思っています。 以下のように書いたのですが、 実行時エラー1004:アプリケーション定義またはオブジェクト定義のエラーと出てきます。 どなたかお願いします。 Sub Format() Dim NewWorkSheet As Worksheet i = 0 k = i / 2 + 3 Do Until IsEmpty(Worksheets("Sheet1").Range("A9").Offset(i, 0).Value) Set NewWorkSheet = Worksheets.Add() NewWorkSheet.Name = "Sheet" & k Worksheets("sheet2").Copy Destination:=Worksheets("Sheet" & k) Worksheets("sheet1").Cells(i, 1).Copy Destination:=Worksheets("Sheet" & k).Range("E10") i = i + 2 k = k + 1 Loop End Sub
446 :
デフォルトの名無しさん :2006/09/12(火) 16:04:09
↑ Sheet1の5行目以降じゃなくて9行目でした。
>>445 すげーイライラするコードだなw
見る気がしない。ただ、ザッと見たとこ
Worksheets("sheet1").Cells(i, 1).Copy Destination:=Worksheets("Sheet" & k).Range("E10")
これ一発目の時(0,1)参照しちゃってるんじゃないの?
448 :
デフォルトの名無しさん :2006/09/12(火) 17:12:32
行の前に「’」を打つと、その行は無視するようになりますよね。 複数行無視する場合はどうすればいいでしょうか? Cでいう{ }に該当する機能はないでしょうか?
449 :
デフォルトの名無しさん :2006/09/12(火) 17:24:19
d
>>448 VB関連の言語(VB4,5,6、VBA、VBS)は、
行コメントのみで囲みコメント記述は存在しない。
451 :
445 :2006/09/12(火) 17:28:21
>>447 ありがとうございます。
ご指摘の箇所、Worksheets("sheet1").Cells(i + 9, 1) と書き直してみました。
ただ、最初にエラーが発生するところが
Worksheets("sheet2").Copy Destination:=Worksheets("Sheet" & k)
なので、新しいシートの名前の定義が良くないのでしょうか?
452 :
448 :2006/09/12(火) 17:36:07
>>450 丁寧にどうもありがとうございますm(_ _)m
よくわかりました。
しかし、不便だなあ。
453 :
みっにい :2006/09/12(火) 18:51:40
VBで組合せのパターンを全種類抽出したいんですけど出来ません。 誰か助けてもらえないでしょうか?('。`)/~ 例:1と2と3なら1,2,3,12,13,23,123
>>452 根本的な解決では無いですが、
「編集」ツールバーを表示させて、「コメントブロック」「非コメントブロック」
を使用すると、複数行のコメントの設定/解除が一発で可能です。
455 :
447 :2006/09/12(火) 20:40:20
>>451 おぉ、スマソ。
見落としてた。シートのCopyメソッドにはDestinationの引数は使えないっすよ。
複数のセルをコピーさせるのが一番早いかな?
方法は色々あるが、コードがきちゃなすぎてどこから手をつけていいか分からん。
>>453 助けを求めるなら自分でどこまでやったか書いてくれんと
答える側もどこから説明を始めたらいいのか困りますよ。
まぁ、顔文字付のふざけた質問に答える奴もいないだろうけど。
456 :
447 :2006/09/12(火) 21:09:57
多分
>>445 がしたい事
勝手に改造しちゃいました。
Sub Format()
i = 5
k = 3 'iと連動させたい?
Do Until IsEmpty(Worksheets("Sheet1").Cells(i, 1).Value)
Worksheets("Sheet2").Copy , Worksheets(Worksheets.Count)
With Worksheets(Worksheets.Count)
.Name = "Sheet" & k
.Range("E10") = Worksheets("sheet1").Cells(i, 1)
End With
i = i + 2
k = k + 1
Loop
End Sub
ちょっと強引過ぎますね。私も修行が足りません。
あと、プロシージャ名に予約語を使うとロクな事が無いので注意。
>>453 組み合わせパターン全種って、条件が単純そうに見えて、
結構細かい条件がいろいろあるんだよ。例えば
・全ての文字を1回ずつ使わなくてはならない(結果的に桁固定) → 123、132,213,231,312,321
・一つの文字を何度使っても良い(最大桁指定) → 11,222,333,1111,22222,…(最大5桁)
・一つの文字は1回しか使ってはいけない。(1桁〜文字の種類数の桁) → 1,2,3,11,12,13,21,22,23,31,32,33,123,…
他にもいろいろ。例を見る限り3番目の条件っぽいが、2番目の条件である可能性も捨てきれないし
もしかしたら、2桁以上では、必ず右より左が小さい数値でなくてはならないという条件があるのかもしれない。
そういうのを書いてくれなきゃアドバイスすら出来ないし、例え条件をきちんと書いても、丸投げなんて受け付けない。
自分で書いたコードを途中まででも間違っていてもいいから書け。
459 :
445 :2006/09/13(水) 11:35:04
451 さん、有り難うございました。 シート2をそのままコピーして新しいシートに貼り付けると、うまくいかない (値と別のシートに出力されてしまう)ので、レンジを指定して同じシートに貼り付けるようにしました。 対処療法的ですが、何とか出来ました。 Sub Format() Dim NewWorkSheet As Worksheet i = 0 k = i / 2 + 3 Do Until IsEmpty(Worksheets("Sheet1").Range("A9").Offset(i, 0).Value) Set NewWorkSheet = Worksheets.Add() NewWorkSheet.Name = "Sheet" & k Sheets("sheet2").Range("A:AC").Copy Sheets("Sheet" & k).Range("A:AC") Sheets("sheet1").Cells(i + 9, 1).Copy Sheets("Sheet" & k).Range("E10") i = i + 2 k = k + 1 Loop End Sub
>459 今は携帯からだから、コードは書いてやれんが、せめて字下げくらいしてくれ 読みにくいったらありゃしない
全角使えばいーじゃん
>>458 > そういうのを書いてくれなきゃアドバイスすら出来ないし、例え条件をきちんと書いても、丸投げなんて受け付けない。
別に丸投げしてもいいじゃん。
気に食わないなら読み飛ばせよ。
>>458 おまえレスしなくていいよ
でもウザイと思ってるのは俺だけだから気にするな
正しいことを 書いていても 3行以上の 書き込みには 何故か過剰に 反応しだす子が 現れる。
いちいちウゼー やってから聞けよ
すんません、誤爆しますた
468 なんでそんなに必死なの?
下2行に反応したんだろうけど、 上の長文は適切なアドバイスだろ。 きっと目に入ってないんだろうけどw
>>473 >>461 ちなみに、これコードごりごり書くしかないね。
入出力の仕様がわからないと書けないけど。
477 :
デフォルトの名無しさん :2006/09/15(金) 00:15:23
VBAでWebBrowserを使っています。 WebBrowser上で表示されている↓ <a name="order" href="javascript:submitWeb3Form(document.fuConfirmForm)"> <img src="/webbroker3/46/pc/images/bt_sinkai_b.gif" alt="新規買発注" width="80" height="18" hspace="12" vspace="8" border="0"/></a> をVBAでクリックするやりかたがわかりません。 誰かお教え願います。
477です。 すいませんできました。 失礼しました。
>>477 えーとVBAでの制御でリンクを辿る様にしたいという事かな?
言っている事が微妙に分からんぞ?
>>479 厳密に言うとリンク辿るというよりボタンを押したいんだろ
同じようでちょっと違う
481 :
デフォルトの名無しさん :2006/09/16(土) 11:50:20
こんにちは。ひとつ質問させてください。 「ファイルを開く」ダイアログを「A*.txt」のように ファイル名の先頭と拡張子でフィルタリングして表示したいと思っています。 しかしGetOpenFileNameのFilterを「A*.txt」とすると「すべてのファイル(*.*)」 になってしまいます。 Application.Dialogs(xlDialogOpen).Show ("A*.txt") であればフィルタはかけられるのですが、ファイル自体を開いてしまいます。 ファイル自体を開く行為は処理で記述したいのです。 何か方法はありませんでしょうか?
>>481 "A*.txt"ではなく"Text File(A*.txt),A*.txt"ね。
これでちゃんと、名前の頭がAで拡張子がtxtのものをフィルタリング出来たよ。
ちなみにExcel.Application.GetOpenFilenameではなく
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA"の方を使うこと。
VBA(Excel.Application)の話ではなくなるので、具体的な使い方はスレ違い。
>>482 どうもありがとうございます。
APIを使うわけですね。
使い方などを調べてみます。
484 :
デフォルトの名無しさん :2006/09/17(日) 04:40:02
"書式" → "セル" → "表示形式" が "日付" になっているセルに、 "2006/9/1" と入力します。 このセルを Excel VBA で検索しアクティブにしようと思っています。 Sub x001() Cells.Find(what:="2006/9/1").Activate End Sub を実行すると下記のエラーが出てしまいます。 実行時エラー '91': オブジェクト変数またはwithブロック変数が設定されていません。 セルの書式を"文字列"にするとうまくいきます。 VBAで日付を検索するにはどうすれば宜しいでしょうか? 環境は、WinXP Pro SP2、Excel2003 SP無しです。
> セルの書式を"文字列"にするとうまくいきます。 当然だな。日付ではなく文字列を検索しているんだから。 > VBAで日付を検索するにはどうすれば宜しいでしょうか? 文字列ではなく日付を検索すればいいだけでしょ。 ""で囲ったら基本的に文字列だってのはわかるよね? 日付はどう書いてもいいし。 Cells.Find(DateSerial(2006, 9, 1)).Activate Cells.Find(DateValue("2006/9/1")).Activate Cells.Find(CDate("2006/9/1")).Activate Cells.Find(#9/1/2006#).Activate ちなみに文字列で直接書いても、日付形式で書けば日付を検索出来る。 Cells.Find("9/1/2006").Activate Excelはアメリカ製のソフトなんで、日付の基本書式が日本人の感覚とは違うけどね。 ついでにエラーの原因は、"2006/9/1"なんてセルが存在しないため FindメソッドがNothingを返しているのに、そのNothingに大してRangeオブジェクトのメンバである Activateメソッドを使っているから、そのActivateメソッドが使えるオブジェクトが無いよという意味。 Findメソッドを使うときは、一度戻り値を変数に入れて、Is Nothingで検索結果の有無を判断した後で 処理に入るのが基本。
487 :
484 :2006/09/17(日) 07:04:00
>>485 ,486
早速のご回答ありがとうございます。
確認します。
3行で済むものを
490 :
デフォルトの名無しさん :2006/09/18(月) 19:04:32
FAQかもしれませんが・・ Private Sub test() Dim i As Long i = 256 * 256 End Sub を実行すると 実行時エラー'6': オーバーフローしました。 となるのですが、これは何がいけないのでしょうか。 excel2000(SR-1) xp(sp1)
>>490 VBAヘルプより
>整数型 (Integer) の変数は、16 ビット (2 バイト) の変数で、-32,768 〜 32,767 の範囲の値をとります。
492 :
491 :2006/09/18(月) 19:24:49
何を言ってるんだ俺は....スマソ Clngで回避できるっぽいね..
ζ / ̄ ̄ ̄ ̄\ / \ /\ \ /| ||||||| (・) (・) | (6-------◯⌒つ| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | _||||||||| | < 真面目に議論しているフリをしおって!けしからん! \ / \_/ / \________________ \____/
>>492 i = CLng(256 * 256)
としてみましたが、やはり同様のエラーが出ました。(vbaの仕様なんですかね?)
clngで引き続き調べてみます。
ありがとうございました。
495 :
491 :2006/09/18(月) 19:38:20
clng(256)*256でおkのはず
>>495 おかげさまで出来ました!
なんでこうなのかが今ひとつ分りませんが・・
ありがとうでした。
Outlook2002のVBAで下記を実行するとメモリー・リソース不足で 実行時エラーとなります。 Sub test() Dim myOlSel As Outlook.Selection Dim o Set myOlSel = Application.ActiveExplorer.Selection For Each o In myOlSel '何もしなくてもエラーになる Next End Sub Selectionはメールアイテムですが、1000個だと大丈夫ですが、4000個 選ぶとすぐにエラーになります。回避する方法はないでしょうか。 ループの中でSet o=Nothing としても意味ありませんでした。
>>498 そりゃそうですが、ページファイルはぜんぜん増えないし、そういう
問題ではなさそうです。
ちなみにループしなくても同じでした。
Application.ActiveExplorer.Selection.cout
だけでも固まります。
ζ / ̄ ̄ ̄ ̄\ / \ /\ \ /| ||||||| (・) (・) | (6-------◯⌒つ| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | _||||||||| | < 真面目に議論しているフリをしおって!けしからん! \ / \_/ / \________________ \____/
ζ / ̄ ̄ ̄ ̄\ / \ /\ \ /| ||||||| (・) (・) | (6-------◯⌒つ| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | _||||||||| | < 真面目に議論しているフリをしおって!けしからん! \ / \_/ / \________________ \____/
502 :
デフォルトの名無しさん :2006/09/19(火) 21:37:41
消えろ馬鹿
VB厨だからしかたがない
504 :
デフォルトの名無しさん :2006/09/20(水) 17:47:53
命令表が辞書みたいに載っているサイトはありませんでしょうか?
すまない、動画キャプチャソフトを作る時、参考になるようなソースって有るかな。 探してはみたつもりなんだが・・ そもそもVBが向いてないとかだったらスマン、無知なんだ('`) 其の場合は言語問わないので参考になるソース見つける際のキーワードとか教えて頂きたいです。
507 :
デフォルトの名無しさん :2006/09/21(木) 01:47:21
Excel 2003 のVBAを使っています。 やりたい事は、変数"myDate月","myDate日" を二桁表示にする事です。 14-19行目をForとかArrayとか使わずに個別に書けば二桁の値が代入されるのですが、 下記の通りやると、18行目は2桁、21,22行目は1桁で表示されます。 Forステートメントの中で変数に値を代入するには、どうしたらよいでしょうか? 1 Sub test() 2 3 Dim myDate As Date 4 Dim myDate年 As String 5 Dim myDate月 As String 6 Dim myDate日 As String 7 8 myDate = "2006/9/1" 9 10 myDate年 = DatePart("yyyy", myDate) 11 myDate月 = DatePart("m", myDate) 12 myDate日 = DatePart("d", myDate) 13 14 For Each i In Array(myDate月, myDate日) 15 If i <= 9 Then 16 i = 0 & i 17 End If 18 MsgBox i 19 Next i 20 21 MsgBox myDate月 22 MsgBox myDate日 23 24 End Sub
508 :
デフォルトの名無しさん :2006/09/21(木) 02:14:38
Dim myfutaketatuki as string 13行目以降に myfutaketa = Format(myDate月, "00") Msgbox myfutaketatuki 「日」の分も同じようにやってみて下さい。
509 :
508 :2006/09/21(木) 02:16:36
あー変数名間違えた。 myfutaketatuki=Format(myDate月,"00") です。
510 :
507 :2006/09/21(木) 03:07:38
>> 508 出来ました! どもです。
511 :
デフォルトの名無しさん :2006/09/21(木) 15:01:21
Excel2002を使っています。 VBで、Sheet2の値をSheet1にコピーしたのですが、値に計算式が入力 されていたため、計算式を拾ってしまって、値そのものを拾ってくれません。 Worksheets("sheet2").Range("A1").Copy Worksheets("sheet1").Cells(2, 2) どうすれば値のみを拾ってくれるのでしょうか?
513 :
デフォルトの名無しさん :2006/09/21(木) 17:55:24
失礼します。質問があります。 例えばB1 N37 K7 L39・・・のようにばらばらに散らばったセルがあるとして、 それらの中のいくつかには背景色がついているとします。 背景色がついているセルの数がN(←いくつでもいいんですが)を超える場合、 ある数Aを1/2にする。っというブログラムはどうやって書けばいいんですか? 誰か教えてくれませんか?
>>513 自分でどこまでやったんかを書きましょう。
基本です。
また、「ばらばらに散らばる」という抽象的な表現を使う場合、
ある範囲内に収まるのか(例えばA1〜Z250)か、それとも無制限に散らばっているのか。
その辺りも書くようにしましょう。
515 :
デフォルトの名無しさん :2006/09/21(木) 18:22:48
>>514 説明不足ですみません。
ばらばらに散らばったというのは、ある範囲内に収まるものです。
今のところ次のような状態です。
1 Sub 背景色数()
2 Dim 背景色の数 As integer
3 Dim 行番号 As integer
4 背景色の数=0
5 行番号=0
6 For 行番号=1 to 50
7 If cells(行番号,3).Interior.ColorIndex = 色番号 Then
8 背景色の数 = 背景色の数+1
9 End If
10 Next 行番号
11 If 背景色の数>5 Then
12 range("B1")=a*0.5
13 End If
14 End Sub
なお、「背景色の数」というのは「背景色のついたセルの数」を
意味しています。さっきいった、ばらばらなセルの場合どのようにすれば
良いのかがわかりません。
全部調べるんだよ。
決まった位置のセルなら、 dim r, cell as range set r = range("B1,N37,K7,L39") for each cell in r 'ここで背景色のチェックとカウントアップ next 決まった位置じゃないなら、"B1,N37,K7,L39"の部分をなんとかして文字列で作るか、 rangeオブジェクトを何とかして作れ。
背景色赤のセルを選択 Application.FindFormat.Interior.ColorIndex = 3 Cells.Find(What:="", SearchFormat:=True).Activate コレをヒントにエラー処理して応用汁
519 :
デフォルトの名無しさん :2006/09/21(木) 20:24:15
>>512 レスありがとうございます。
valueのくっつけ方がわからなかったので下のようにやって取得しました。
Worksheets("sheet2").Range("A1").Copy
Worksheets("sheet1").Cells(2, 2).PasteSpecial Paste:=xlPasteValues
今度はセルを別シートに入れると、罫線がくっついて来たり、セルのサイズが
大きくなってしまったりします。どうすればセルはデフォルトのままで値だけを
取得できるのでしょうか?お願いします。
worksheets("sheet1").cells(2,2).value = worksheets("sheet2").range("a1").value
vba初心者です。簡単な質問ですみません セルの中で改行されているデータを改行で分けたい場合 どうすればいいですか?
>>521 改行で分けた後、それぞれの文字列をどうしたいのだ。
変数に入ってればいいです
ary = split(range("a1").value, vblf) for i = 0 to ubound(ary) debug.print ary(i) next
ありがとうございます!
526 :
デフォルトの名無しさん :2006/09/24(日) 22:12:48
EXCELの関数 =SUM(hogehoge)とかで計算した後に文字をつけたいんですが可能でしょうか? =SUM(J13:J19) 上記式を入力したセルがあり、表示としては 合計金額####円みたいな感じで実現可能でしょうか?
>>526 セルの書式設定の表示形式で、「合計金額 #,##0円」とかする。
>>526 =TEXT(SUM(略),"########")&"円"
>>528 それだと、合計の合計が取れなくなるけどね。
530 :
デフォルトの名無しさん :2006/09/24(日) 22:44:54
VBA初心者です。 色々自分で検証やプログラムをやろうと思っているのですが、中々参考書も なくて、困っています。 株で、銘柄を一定の条件を入れてスクリーニングし(例えば過去のPERが ポートフォリオの中で低かった5%を常にリバランスしていく)、検証する のって簡単にできそうでしょうか? よろしくお願いいたします。 また、金融に活かせるプログラムの本や通信講座などありましたら 教えていただけるとありがたいです。 よろしくお願いいたします!
>>529 うむ分かる。が、
>>526 の要求の1行目に基づいてみた。複数の解を比較できることになったかな。
特定のセルを選択出来なくするには、VBAでどんな書き方をすればよいですか?
>>532 SelectionChangeが起きたときに、はじけばいいんじゃね?
>>532 シートの特定部分だけを選択できるようにするのが一般的だと思うけど、その逆だね。
with worksheet("sheet1")
.cells.locked = false
.range("B3:C5").locked = true
.protect
end with
535 :
523 :2006/09/25(月) 00:25:25
すみません、まだ触りはじめて間もないので「はじく」やりかたがわかりません。 面倒でなければA1のセルを選択不可にするロジックを書いていただけないでしょうか?
"B3:C5" -> "A1"
537 :
532 :2006/09/25(月) 08:11:02
ありがとうございました。 lockですね?ソースを参考にもっと詳しく調べてみます。
VBA からあるファイルを関連付けアプリで起動したく、 Shell("cmd.exe /c start filename", vbNormalFocus) のような形で書いており、うまく動作しております。l これを Win98 系でも動作するように、 Shell("%ComSpec% /c start filename", vbNormalFocus) と書き換えたのですが、(%ComSpec% の部分で)「ファイルが見つかりません」という エラーが出て動作しませんでした。 %ComSpec% という、環境変数は Shell 関数の中では使えないのでしょうか? また、上記の動作を WinNT 系と Win98 系両方で実現するにはどのような方法が ありますでしょうか?
>>538 普通にAPI使えば、同じコードでどっちでもいけるだろ。
すみません、煮詰まってしまったので質問させて下さい 2つの時間の時間差を格納したセルがあり、書式に"[hh]:mm:ss"を使用しています この表示されている時間を文字列にしてMsgbox上で使いたいのですが、変換が思うように行きません DatePartあたりで時・分・秒あたりを分割してから文字列として連結すれば良さそうなのですが 時の部分が24時間を越える事があるため上手く変換できません 上手い方法が何かあるでしょうか? そのままmsgboxに流し込むと 28:31:29 が 1899/12/31 4:31:29 のようになるので DatePart("d", time) - 30) * 24 + DatePart("h", interval(1) と、やってみましたが、これは何か間違ってる気がしてなりません 時間の起点が1900/1/1/00:00:00なのかな……
541 :
デフォルトの名無しさん :2006/09/28(木) 18:17:12
ああ、間違えた DatePart("d", time) - 30) * 24 + DatePart("h", time) こんな感じです
>>540 表示幅が十分にあるなら(####にならないなら)、msgbox range("a1").text
543 :
デフォルトの名無しさん :2006/09/28(木) 18:32:07
くだらんw
545 :
デフォルトの名無しさん :2006/09/28(木) 22:45:00
pdfファイルを直接に取り込むことは出来ませんか? いろいろな方法を試してみたのですがわかりませんでした。 とりあえず現在は一度テキストファイルに変換して、それを ワードで保存し直してエクセルで開くとなんとか取り込める 事が出来ます。 VBAのスキルが無いためワードでの保存までは手動でやってます。 何かほかに良い方法は無いでしょうか?
俺の環境では、参照設定に、 Adobe Acrobat 7.0 Type Libaryというそれらしきものがあるんだ。 これ使えないかな?
548 :
デフォルトの名無しさん :2006/09/30(土) 11:27:05
Windows XP Pro でExcel2003を使用しています。 下記のことを行うのはVBAで可能でしょうか。 **シート1*** A1 A2 A3 aaa XXX ccc abc YY efg ******** **シート2*** A1 A2 XXX YY 001 00 002 25 003 50 ***** とあって、シート1のXXX,YYをシート2から反映させ テキストファイルにそれぞれ test001 test002 ・・・ と出力させる。 test001のテキストファイルの内容はaaa001ccc abc01efg となっている状態。 宜しくお願いします。
>>548 不明瞭な点は多いが、とりあえず可能だよ。
まさかそんな曖昧な情報しか出さずに丸投げなんてする気じゃないと思うが
とりあえず、自分で出来るところまでコードを書いて、それをここに貼り
その上で何処が解らないのかをはっきりさせよう。
551 :
548 :2006/09/30(土) 11:39:00
>>549 ,550
ありがとうございます。
とりあえず可能かしりたかったので。
またコードを記述してみて質問させてもらうかもしれませんが
宜しくお願いします。
イメージ的にはテキストファイルのある一定の文字列のみ置換した形で複数の
ファイル(ファイル名も異なる)を自動生成する感じです。
552 :
549 :2006/09/30(土) 11:42:09
別に丸投げしてもかまわないよ。 仕様がはっきりしてりゃ誰か解くかもしれないし、無視するかもしれない。 ただそれだけのこと。
>>552 取りあえず解かないなら邪魔だから消えてくれ。
554 :
549 :2006/09/30(土) 21:10:52
誰かには当然俺も入っているのだが何か?
丸投げでいいじゃん。下手なコード晒されても読めないし、全部自分で書いたほうが楽。
その通り。 ここは学校じゃないんだからやりとりは短くして欲しい。 わけわかってない人が書いた拙劣なコードなんて貼るだけ無駄。 わかってる人が良いコードを示し、それを理解することが大事。
それ言っちゃ元も子も無いな じゃあおまえが全部やってやれや
>>556 コードかいてもらったほうが
何をしたいのかが分かるし、答える方が簡単
ここが間違ってるよって感じで
>>559 お前がそうしたければ、そのように誘導しろ
まあ大体はコードが出ても「で、何をしたいんですか」となるわけだが。
562 :
548 :2006/10/01(日) 00:03:02
WindowsXP pro Excel2003を使用しています548です。 シート1のB1の値をシート2のA2の値(A2から下の値)に入れ替えて 複数のファイルとしてファイル名を付けて保存したいのですが、 Stringへの値のいれかたがまずいのかエラー400が返ってきます。 ご教授宜しくお願いします。
563 :
548 :2006/10/01(日) 00:03:47
Sub ファイル自動生成() Dim XXXGYO_1 As Long Dim XXXCOL_1 As Long Dim XXXGYO_2 As Long Dim XXXCOL_2 As Long Dim FILENAME As String ' 保存するファイル名 Dim FILENAME2 As String ' 保存するファイル名付与 Dim YYYGYO As Long ' FILENAME2に入るValueのセル位置 Dim YYYCOL As Long ' FILENAME2に入るValueのセル位置 Dim OWARI As Long ' ループ回数制御
564 :
548 :2006/10/01(日) 00:04:23
XXXGYO_1 = 1: XXXCOL_1 = 2 ' Sheet1XXXセル位置 XXXGYO_2 = 2: XXXCOL_2 = 1 ' Shttt2XXXセル位置 YYYGYO = 2 YYYCOL = 2 OWARI = 1
565 :
548 :2006/10/01(日) 00:04:56
Do While OWARI < 9 Sheets("Sheet2").Select With Worksheets("Sheet2") FILENAME2 = .Cells(YYYGYO, YYYCOL).Value End With
566 :
548 :2006/10/01(日) 00:07:01
Sheets("Sheet2").Select With Worksheets("Sheet2") .Cells(XXXGYO_2, XXXCOL_2).Select Selection.Copy End With Sheets("Sheet1").Select With Worksheets("Sheet1") .Cells(XXXGYO_1, XXXCOL_1).Select ActiveSheet.Paste Application.CutCopyMode = False ' コピーモード解除 End With FILENAME = "C:\Documents and Settings\testUser\デスクトップ\自動生成\test_" + FILENAME2 + ".xls" ActiveWorkbook.SaveAs FILENAME:= _ strFILENAME, FileFormat:= _ xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _ , CreateBackup:=False XXXGYO_2 = XXXGYO_2 + 1 YYYGYO = YYYGYO + 1 OWARI = OWARI + 1 Loop End Sub
567 :
548 :2006/10/01(日) 01:24:03
わかりにくいですね、すいません。 やりたいことは「新しいファイル名で保存する際、ファイル名(フルパス)を 変数にはいっている値を入れたい」ということです。 不安な点は下記になります。お願いします。 Dim FILENAME As String 'フルパスを格納 Dim FILENAME2 As String 'ファイル名に付与する変数 Dim XXXGYO_2 As Long 'FILENAME2に入れる値の位置格納 Dim XXXCOL_2 As Long 'FILENAME2に入れる値の位置格納 ・・・ Sheets("Sheet2").Select With Worksheets("Sheet2") FILENAME2=Cells(XXXGYO_2,XXXCOL_2).Value ・・・ FILENAME="C:\DocumentAndSetting\・・・"+FILENAME2+".xls" ActiveWorkbook.SaveAs FILENAME:= _ strFILENAME, FileFormat:= _ xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _ , CreateBackup:=False
さてと・・・ 何だかよくわからないけど、こんなサンプルコードを書いてみた。 Dim r1, r2 As Range Dim i As Long Set r1 = Range("Sheet1!A1") Set r2 = Range("Sheet2!A1") For i = 1 To r2.CurrentRegion.Rows.Count - 1 Debug.Print r1.Value + r2.Offset(i, 0).Value + r1.Offset(0, 2).Value Debug.Print r1.Offset(1, 0).Value + r2.Offset(i, 1).Value + r1.Offset(1, 2).Value Next
570 :
デフォルトの名無しさん :2006/10/01(日) 13:30:58
>>568 Dim r1, r2 As Rangeってのは
Dim r1 As Range,r2 As Rangeと同じ?
r1はVariant扱いだね
572 :
デフォルトの名無しさん :2006/10/01(日) 13:36:03
Dim r1 ってのはr1をvariant型の変数として定義ってこと? As Variant は略せるってこと?
573 :
デフォルトの名無しさん :2006/10/01(日) 13:49:01
オレ、零細企業の単なる事務員ながらVBAを一生懸命覚えてるけど、 ここで回答してる人たちってけっこう詳しくて関心してしまいます。 ここで回答してる人たちって、IT系の職種で仕事してるの?
>>572 です
>>573 どうなんだろう?
時々凄い人も降臨するけど俺もあなたと似たようなもん
ワークシート関数で物足りなくなってVBAはじめたクチだよ
そんな感じの人も結構多いんじゃないかな
575 :
デフォルトの名無しさん :2006/10/01(日) 14:02:40
>>574 ありがとうございます。
そういう豆知識でも覚えるとすごくうれしいです。
事務員やってると、いつ会社の都合で他の職種に回されるか
わからない不安があるので、できればIT系の職種にでも
つきたいな〜って思うのですが、難しいですかね?
>>570 あー、そうだね忘れてた。
dim r1 as range
dim r2 as range
ってことで。
>>575 > 事務員やってると、いつ会社の都合で他の職種に回されるか
> わからない不安があるので、できればIT系の職種にでも
> つきたいな〜って思うのですが、難しいですかね?
若くて(25歳以下)それなりの学歴(大卒以上)があれば、会社を選ばなければ転職できるでしょう。
どちらも無い場合は、卓越した業務知識か何らかの資格があれば、それを必要としている
ところにひっかかるかも。
いわゆる「イイトコ」にいきなり入るのはまず無理。
やっぱり丸投げしてもらったほうがいいね。
「凄い人」なんていたか?
へんなやつばっかw
581 :
構造体をプロシージャへ渡す :2006/10/03(火) 14:41:50
構造体を別プロシージャに渡したたいのですが、 下記のエラーメッセージがでます。 「パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、 変数に割り当てることができ、実行時バインディングの関数を渡すことができます」 これは何が原因なんでしょう? 普通にグローバル変数を定義する感じでは 使えないんでしょうか????? '構造体の宣言-------------------------- Public Type Record seibetu As String name As String End Type '呼び出し元------------------------------ Sub aa() Dim k_Record() As Record ReDim k_Record(1) k_Record(0).seibetu = "男" k_Record(0).name = "tamori" bb (k_Record) End Sub '呼び出し先------------------------------- Sub bb(k_Record) MsgBox k_Record.name End Sub
>581 変数をSubプロシージャの外で宣言して、モジュールレベルの変数として扱えばいいんじゃね?
584 :
デフォルトの名無しさん :2006/10/03(火) 15:28:11
あんまりVBAわからないのに、急にやれと言われて困ってます。 マジで教えてください<(_ _)> やりたいこと。 エクセルのワークシートの、1〜k(変数)行までを削除して、 k+1の行を 一番上にもってきたい。これをVBAで書きたい。 kはユーザーフォームのtextbox1に代入すると反映されるようにしたい。 で、初心者が作ってみた、VBAのコードなですけど、 どうか正しい書き方を教えてください。 Sub 日数変更() UserForm1.Show End Sub Private Sub CommandButton1_Click() Dim 行番号 As Integer 行番号 = TextBox1.Value Rows("6:行番号").Select ←「型が一致しません」とでます。 Selection.Delete Shift:=xlUp End Sub 以上です。マジお願いします!
Range(Rows(6), Rows(行番号)).Delete Rows("6:" & 行番号).Delete Rows(6).Resize(行番号 - 6 + 1).Delete
586 :
デフォルトの名無しさん :2006/10/03(火) 15:50:56
すいません、584です。 実は、6行目からk行目までを削除して、k+1行目を6行目に もってきたいんですけど、その場合はどうすればよいですか? ちなみに、本当は、テキストボックスに1を入れると、6行目の1行が テキストボックスに10を入れれば、6行目から15行目までが 消えるようにできれば、本望です。 たびたび、すいませんが、教えて下さい<(_ _)>
587 :
デフォルトの名無しさん :2006/10/03(火) 15:53:10
584です。 >実は、6行目からk行目までを削除して、k+1行目を6行目に もってきたいんですけど、その場合はどうすればよいですか? ここは、無視して下さいw 先ほど指摘してもらった場合でやってみると、 テキストボックスに1など入れるとエラーになってしまいます。
588 :
デフォルトの名無しさん :2006/10/03(火) 15:57:40
でキター! ありがとうございました。できました!!!お世話になりました<(_ _)> Private Sub CommandButton1_Click() Dim 行番号 As Integer 行番号 = TextBox1.Value Range(Rows(6), Rows(行番号)).Select Selection.Delete Shift:=xlUp End Sub
>>588 Private Sub CommandButton1_Click()
Range("6:" & TextBox1.Value + 5).Delete
End Sub
ちゃんと書けば
Private Sub CommandButton1_Click()
If Val(TextBox1.Value) > 0 Then Range("6:" & Int(TextBox1.Value) + 5).Delete
End Sub
>>588 selectしなくても出来ることは、selectせずにやった方がいいよ。
アクティブセルの位置が変わらないから。
591 :
デフォルトの名無しさん :2006/10/03(火) 21:45:12
すいません、584です。みなさんいろいろありがとうございます! 申し訳ないですが、もう1つ見てもらいたいです<(_ _)> Private Sub CommandButton1_Click() Dim 日数 As Integer 日数 = TextBox1.Value Dim f As CellFormat Range(Cells(f, 日数)).Select ←ここで『型が一致しません』がでます。 ActiveCell.FormulaR1C1 = "=(SUM(R[-日数+1]C[-1]:RC[-1])+RC[-1])/(日数+1)" Range(Cells(f, 日数)).Select Selection.AutoFill Destination:=Range(Cells(f, 日数), Cells(f, 750)), Type:=xlFillDefault Range(Cells(f, 日数), Cells(f, 750)).Select ActiveWindow.ScrollRow = 739 省略 ActiveWindow.ScrollRow = 1 Range("G26").Select End Sub FはワークシートのFとして使ったつもりが、変数を定義してくださいと 言われたので、dim F as cellformat にしました。だけど、 次の式で、型が一致しませんと出てしまい、よくわからない状態です。お願いします。
>>591 >Dim f As CellFormat
Dim f As String
でやってみたら?ExcelのVBA知らんけど。
593 :
デフォルトの名無しさん :2006/10/03(火) 23:06:18
>592 回答ありがとうございます。 それなんですが、自分もやってみたんですけど、同じように エラーが出ちゃったんです・・・ orz
>FはワークシートのF の意味もわからんが、その上Cellsの行と列が反対なんじゃね?
>>591 やりたいこと(仕様)をきっちり書いてくれ。
597 :
デフォルトの名無しさん :2006/10/04(水) 00:06:53
Dim 数値 As Integer 数値 = TextBox1.Value Dim f As cellformat で、(f行、数値)のセルを選択したいんです。 Range("f数値").Select じゃ、エラーになるので、 正しい方法わかる方、是非教えてください(>_<)
「f行」とは何だ?
fを数字の6に置き換えて、行と列が正しいかチェックする。
600 :
デフォルトの名無しさん :2006/10/04(水) 00:32:11
なんか書いてることわかりにくくてごめんなさい。 >598 セル(F数値)を選択したいのです。例えば、セル(F5)とかです。
AとかBとかFというのは「列」だ。 そしてセルを指定する時の()内は、(行, 列)で指定する。 F5なら(5, 6)だ。
日本語でやりたいことを書いて、丸投げしてくれよ・・・
604 :
デフォルトの名無しさん :2006/10/04(水) 00:58:18
わかりました。丸投げさせていただきます(>_<) エクセルの列Aに750行まで数値が入ってます。 (為替とかだと思ってください。) そして、セル【B12】に、以下の式を打ちます。 =(sum(A1:A12)+A12)/13 この計算式を750行まで引っ張って完了です。 基本はこれなんですけど、ホントにやりたいことは 最初のセル(さっきは、B12)を、B20くらいにして そこに打ちこむ式を =(sum(A○:A20)+A20)/(20-○+1 +1 ) ※ ○は変数 こうしたいんです。 もし、○=10ならば =(sum(A10:A20)+A20)/(20-10+1+1) =(sum(A10:A20)+A20)/12 そして、これを750行まで引っ張れば完成です。 やりたいのはこれなんですけど、○を、 ユーザーフォームのテキストボックスを使って 代入できる形にしたいんです。 もしこんなん簡単だよって神様がいらっしゃったら お手数ですが、なにとぞよろしくお願いします(>_<)
丸投げしてないじゃん。ブックのうpはまだ? 丸投げってのは、ブックのうpを含めてだよ。 やりたいことも、それを実現したいブックも、全部投げてよこしてこそ丸投げ。
>>604 ○が10のときの「A20の20」は一体どこから出てくるのだ?
>=(sum(A1:A12)+A12)/13
と整合性がとれてないぞ。
ヒントは下のコード。
Cells(日数, 2).FormulaR1C1 = "=(SUM(R[" & -日数 + 1 & "]C[-1]:RC[-1])+RC[-1])/(" & 日数 + 1 & ")"
変数を計算した結果で文字列を組み立てて、それをformulaとして設定すればいい。
あとは仕様にあわせて修正すべし。
あ、そうそう、複数セルにformulaを設定するのは、autofillを使わなくても range(cells(1,2), cells(5,2)) = "=sum(..." とかすればいいから。
そもそも式の書き込みは本当に関数の式がいいのか? どうせVBAで処理するならいっそのこと計算までして値を代入した方がいいんじゃないか? まあ、既存のセルの値が変化しない事が前提だが
間違えた。 range(cells(1,2), cells(5,2)).formular1c1 = "=sum(..."
>>608 式じゃないといけない場合でも、動的に式を設定するのではなくて、
例えば全然関係ないH1とかにtextboxで入力した値を設定するという前提で、
"$H$1"を使った式をあらかじめ設定しておくという手もあるね。
つまり、要求仕様(本当にやりたいこと)を説明しなさいってこったな。
ユーザーフォームでテキストボックスとコマンドボタンを使ってdirの指定をしたいのですが、 よくアプリケーションをインストーすする際にdirの指定が参照ボタンを押すと出てきたりしますよね。 それを利用して、[参照]のコマンドボタンを押して、 場所を指定するとそれがテキストボックスに反映されるようにしたいのですが、 どなたか教えていただけませんか?
Common DialogではなくBrowseForFolderの方か? どっちにしても、上の語句でググればいくらでも情報ころがってるぞ。 Common Dialogの方ならExcel.Applicationからも呼べるし。
614 :
デフォルトの名無しさん :2006/10/04(水) 10:06:08
Excel2002で次の文字列処理をするコーディングを教えて下さい。 あるセルに >>ddd日 という文字列があるかどうか判定し、 あればdddだけを取り出す。dddは小数点を含む任意桁数の数字です。
>>614 正規表現で m/(\d+\.?\d*)日/
>>614 VBAでなくて関数だとこんなの。
IF(RIGHT(A1) = "日",LEFT(A3,LEN(A1)-1),A1)
617 :
616 :2006/10/04(水) 11:20:37
まちがったorz IF(RIGHT(A1) = "日",LEFT(A1,LEN(A1)-1),A1)
ここ、ExcelスレではなくてVBAスレ。ついでに言うと A1=水曜日 で、「水曜」が返っちゃうので、条件を満たしてない。 > dddは小数点を含む任意桁数の数字 あ、別に直して書き込まなくていいからね。
619 :
デフォルトの名無しさん :2006/10/04(水) 12:16:45
584です。 >606 マジありがとうございます。 Cells(日数, 2).FormulaR1C1 = "=(SUM(R[" & -日数 + 1 & "]C[-1]:RC[-1])+RC[-1])/(" & 日数 + 1 & ")" のヒントで、かなり進みました!!ちょっといじって、変えてみます!
620 :
612 :2006/10/04(水) 12:26:09
>>613 ありがとうございました。
もっと勉強して、出直してきます。
>614 Right$(Range("A1").Text, 1) = "日" And IsNumeric(Left$(Range("A1").Text, Len(Range("A1").Text) - 1)) で判断。 処理内容によるが、変数に代入するなりすればスッキリするはず
622 :
デフォルトの名無しさん :2006/10/04(水) 14:49:04
すんません、excelスレに行くべきか悩んだんですが…… ・コマンドボタンをセル上に配置する ・配置したコマンドボタンは隣接したセルと一緒にソートされて配置が入れ替わる ←ここまでは出来た ここから、ソートされて位置が常時変更になる特定セルの値をVBAから参照したいんですが 何か方法はありますでしょうか? コマンドボタンにLinkedCellがあれば楽なんですが……
623 :
622 :2006/10/04(水) 14:58:46
すみません、一応自己解決しました ワークシート上で固定の別セルから参照すれば、並べ替えても参照が切れないので そっちをVBAから参照すればとりあえず解決できるようです ただ、もし他の方法があればご指摘頂ければ幸いです
>622 ActiveSheet.Shapes("Button 1").TopLeftCell.Column ActiveSheet.Shapes("Button 1").TopLeftCell.Row じゃダメ?
625 :
622 :2006/10/04(水) 15:24:03
>>624 ありがとうございます
ブレークポイント置いてローカル変数参照した所
確かにそこにボタン位置のセルの場所が格納されてました
今後別セルに参照を置けない場合もそれで大丈夫そうです
626 :
デフォルトの名無しさん :2006/10/05(木) 13:35:17
ユーザー定義型で Private Type typREC CODE As String * 5 ' コード MAKER As String * 10 ' メーカー End Type っていう記述を見つけたんですが、 ここで「 * 5」や「 * 10」は なんの数値を宣言してるんでしょう??
固定長テキストの文字数
どなたか、教えてください。 ActiveSheet.Buttons.Add(XXX, YYY, HHH, VVV).Select で、ボタンを追加するのですが、そのときに「Button 1」と名称がついているようですが、 その名称を取得もしくは、任意に名づけたいのですが、どう書けばいいのでしょうか? Selection.Characters.Text = "HOGEHOGE" と、テキストを変えるのではなく、ボタンそのもののオブジェクト名?を変えたいのですがわかりません。。。 お願いします。
630 :
614 :2006/10/05(木) 19:42:07
>>みなさん
ありがとうございます。
>>615 ”日”の部分をセル参照にするには、どう書けば良いのでしょうか。
あと、正規表現をベタでセルに書いてOKなのでしょうか。
631 :
デフォルトの名無しさん :2006/10/05(木) 19:54:34
XPsp1、Excel2002です。 ScreenUpdatingをFalseにして、 VBAの長時間処理をしている時にExcelにイベントを 発生させるような事象(※)を発生させると、ストールします。 有効な対策があれば教えて下さい。 処理の中ではWebクエリを使った外部データの取り込みも しています。 ※ ・スクリーンセイバーの起動 ・他のAPのウィンドウを開く ・Excelのウィンドウ閉じるボタンの上にマウスを持って行く 等
>>630 > ”日”の部分をセル参照にするには、どう書けば良いのでしょうか。
普通に。
> あと、正規表現をベタでセルに書いてOKなのでしょうか。
OKなわけない。
VBAで正規表現を使う方法を調べて、それに従え。
633 :
628 :2006/10/06(金) 06:57:31
>>629 早速ありがとうございます。
captionですか...
captionを使うとすると、そのボタンをSelectしたいときは、どのようにしたらいいのでしょうか?
ActiveSheet.Shapes("Button 1").Select
ボタンの選択方法を↑しか知らないので、しつこいようですが教えてください。
634 :
628 :2006/10/06(金) 07:03:21
追記です。 ボタンはそのたびに追加されていくので、 ActiveSheet.Shapes("Button 1").Select の"Button 1"は、常に変化します。 なので、Addされた時点で、名前を取得するか、定義したいのですが。。。
635 :
デフォルトの名無しさん :2006/10/06(金) 08:21:07
VBAの 構文、データ型、演算子、命令、 オブジェクト・メソッド・プロパティ・関数等の一覧等を 体系的に説明した書籍があれば、教えて下さい。
>>628 ,633-634
ActiveSheet.Buttons.Add(XXX, YYY, HHH, VVV).Select
が出来て、なんでオブジェクトの名前を取得・変更する方法が解らないのかが不思議だ。
このコードは
ActiveSheet.Buttons.Add(XXX, YYY, HHH, VVV)
が返したボタンオブジェクトに対して「Select」という命令を実行してるんだろ。だったら同じく
ActiveSheet.Buttons.Add(XXX, YYY, HHH, VVV)
が返したボタンオブジェクトに対して「= Nme」で名前を取得したり
「Name = "任意名"」で名前を変更すればいいだけの話じゃん。
Selectしたけりゃ、その後いくらでもShapes("任意名or取得名")をSelectすりゃいいしWithで処理しても構わない。
逆にSelectしてあるなら、「= Selection.Name」や「Selection.Name = "任意名"」で名前の取得・変更可能だし。
>>635 「VBAの」ということであれば、VB6の書籍や解説サイトを探せば事足りる。
「Excelオブジェクト(App,Book,Sheet,Shapes等)の」ということであれば、VBAヘルプを見れば事足りる。
637 :
628 :2006/10/06(金) 09:39:43
>>636 根本的なことを勉強せずに、上辺だけでVBAを使っているので、
しっかり勉強された方には、それがなぜわからないのかが理解できない。。。
ごもっともです。反省します。。。
「Selection.Name = "任意名"」
で、解決いたしました。
大変感謝いたします。ありがとうございました。
638 :
デフォルトの名無しさん :2006/10/06(金) 16:17:22
A1:J1のデータを使って、B3:I18の領域に、折れ線グラフを書きたいの ですが、実行時エラー91(オブジェクト変数またはWithブロック変数が 設定されていません。)になります。どこが不味いのでしょうか。 なお、判例と項目軸は非表示です。 Dim dataRg As Range Set dataRg = Range("A1:J1") Dim graphRg As Range Set graphRg = Range("B3:I18") Sheets("GWORK").Select ActiveSheet.ChartObjects.Add graphRg.Left, graphRg.Top, graphRg.Width, graphRg.Height With ActiveChart .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False End With ActiveChart.SetSourceData dataRg, xlRows ActiveChart.ChartType = xlLine ActiveChart.Legend.Select Selection.Delete ActiveChart.Axes(xlCategory).Select Selection.Delete
639 :
デフォルトの名無しさん :2006/10/06(金) 23:33:37
すいません、初心者の質問に答えてください。 Range("A3:E3").Select Selection.Copy Range("G3").Select ActiveSheet.Paste これで、もしも、G3に値があったら、G3ではなくG4に、 さらに、もしG4にも値が入っていたら、G5に・・・G6、G7・・・ と言う感じで、貼り付けたいんですが これってどのように書けばよいか教えてください(>_<)
Range("G3").Select ↓ Range("G65536").End(xlUp).Offset(1).Select
641 :
デフォルトの名無しさん :2006/10/07(土) 01:37:02
>640 ありがとうございました!!<(_ _)>
642 :
デフォルトの名無しさん :2006/10/07(土) 03:54:51
>638 Activeうんちゃらはエラーの元というのは置いておき、動く書き方はこう。 Dim dataRg As Range, graphRg As Range Set dataRg = ActiveSheet.Range("A1:J1") Set graphRg = ActiveSheet.Range("B3:I18") Sheets("GWORK").Select With ActiveSheet.ChartObjects.Add(graphRg.Left, graphRg.Top, graphRg.Width, graphRg.Height).Chart .SetSourceData Source:=dataRg, PlotBy:=xlRows .ChartType = xlLine .HasTitle = False .Axes(xlCategory, xlPrimary).HasTitle = False .Axes(xlValue, xlPrimary).HasTitle = False .HasLegend = False .HasAxis(xlCategory, xlPrimary) = False End With 凡例とX軸は無いものとしてあるから念のため。 ちなみにデータのあるシートをアクティブにしてから実行しないと中身が出てこない。 で、元のソースでなぜうまくいかないかというと、 ChartObjects.Addメソッドでチャートがアクティブにならないから。 With ActiveChart のところにブレークポイントを置いてみればわかるでしょ。
テーブルやセルの 名前でアクセスするには、どうしたらよいでしょう? Excel2007です
>>643 ヘルプに書いてある。
つーか、質問スレでVistaだのOfice2007だのと恥ずかしげも無く
堂々と書いてる子を見ると思うわけよ、無知な上に恥知らずってのは怖いなぁ、とw
β版使っていながら他人に質問するなんて、普通は恥ずかしくて出来ない。
しかもその内容が、前バージョンと違いがある部分ですら無いなんて、、、
645 :
638 :2006/10/07(土) 07:36:46
646 :
デフォルトの名無しさん :2006/10/07(土) 10:46:25
シートにボタンを貼り付けて、クリック時の処理を記述したのですが ボタンがクリックできる状態になりません。 ボタンの上にカーソルを持っていくと十字マーク(ボタン移動可能な マーク)になります。 何か操作が足りないのだと思いますが、どうすれば良いのでしょうか。
>>646 ボタンに割り当てたマクロを
ツール > マクロ > マクロ
から直接指定しましょう。
648 :
646 :2006/10/07(土) 11:16:12
>>647 ありがとうございます。
Bookのクローズ、オープンでクリックできるようになりました。
元の原因は分かりませんが。
>>644 ヘルプに見てもわかんないんですよ。
hoge.moge
でアクセスできないんですよ。
あと、βだから質問できないなんて、どういう理論ですかい。
世の中で公開されているソフトの多く(9割り)は、β版、α版のソフトという統計はご存知?
恥ずかしいのはどっちでしょうかね?
>>649 例えばrange("range_name").selectとかいう話?
>>649 後半部分は、おまえさんの言うとおりだからもう煽るな。
αβは自己責任 安定版があるのにそれを使おうとしないなんて理解しかねる どんな先進の機能がついててもそれを使えないようじゃ、不安定要因が増すだけ でも、質問しちゃいけないとは思わないけどね 回答が帰って来る可能性が減るだけ、そこもやっぱり自己責任
VBAなんだし本職でこれやってる人だけって事はないしょ つかありえないし
>>653 うざいぞ。質問する気も答える気もないなら、去れ。
>>644 > つーか、質問スレでVistaだのOfice2007だのと恥ずかしげも無く
> 堂々と書いてる子を見ると思うわけよ、無知な上に恥知らずってのは怖いなぁ、とw
> β版使っていながら他人に質問するなんて、普通は恥ずかしくて出来ない。
恥ずかしげも無く、よくこんなこと書けるなぁwwwwww
>>644 はアレだけどな
>>653 は業務で回してる人間ならこういう発想になると思うが
まぁ、何が言いたいかと言うと下らん論議はスレ違いだ、他所でやれ
どのバージョンを使おうが人の勝手だ。
>>660 この展開で敢えて墓穴を掘る君が大好きだ。
どの展開だよ?
いい加減粘着やめろ
うぜー
>643 騒いでいるときに悪いが、マジレス。 例えば教科の成績表のようなものを作ってみて、以下のコードを実行してみるとか。 Public Sub RangeNameSample() Const orgRow As Long = 1, orgCol As Long = 1 Dim j As Long ActiveSheet.Cells(orgRow, orgCol).CurrentRegion.Name = "成績表" With ActiveSheet.Range("成績表") For j = 1 To .Columns.Count .Offset(0, j - 1).Resize(.Rows.Count, 1).Name = .Cells(1, j).Value Next ActiveSheet.Range("英語").Interior.ColorIndex = 34 .Sort Key1:=ActiveSheet.Range("英語"), Order1:=xlDescending, Header:=xlGuess End With End Sub データベース的な扱いをするなら、ListObjectを作って操作すると、コードが読みやすくなる。
>667 レス無いから、コード書いてみたテスト。
670 :
デフォルトの名無しさん :2006/10/08(日) 11:44:52
質問です。 strconv関数で全角文字を半角文字に変換するとき ひらがな、カタカナだけ除外する方法はありますでしょうか。 (半角カナは濁点が一字になってしまうので…) RegExpのreplaceとかで何とかならんかとも考えたのですが どうやればいいか、よくわからんです。
671 :
デフォルトの名無しさん :2006/10/08(日) 15:49:07
XpのExcel2003です。 変数・配列ののメモリを開放するには 動的配列は Erase arr オブジェクトは set obj = Nothing とかだと思いますが、 ユーザー定義配列の場合はどうすればよいでしょう??
つーか、どっちも厳密には(ry
>670 コード書いたんだけど、改行が多いって怒られてupできない。 かなとカナの範囲をExecuteメソッドでMatchCollectionに入れて、それをチェックしながら、それ以外の部分を半角に変換すればいいと思う。
Public Sub HankakuHenkan() Dim re As New RegExp, reMatch As MatchCollection Dim strPattern As String, orgString As String Dim r As Range, i As Long, k As Long, tarStrLen As Long strPattern = "([ぁ-んァ-ンー、,。「」]+)" With re .IgnoreCase = False .Global = True For Each r In ActiveCell.CurrentRegion .Pattern = strPattern Set reMatch = .Execute(r.Value) If reMatch Is Nothing Then r.Value = StrConv(r.Value, vbNarrow) Else i = 1: orgStr = "" tarStrLen = Len(r.Value) For k = 1 To reMatch.Count j = reMatch(k - 1).FirstIndex + 1 If i < j Then orgStr = orgStr & StrConv(Mid(r.Value, i, j - i), vbNarrow) orgStr = orgStr & reMatch(k - 1).Value i = j + reMatch(k - 1).Length Next r.Value = orgStr & StrConv(Right(r.Value, tarStrLen - i + 1), vbNarrow) Set reMatch = Nothing End If Next End With Set re = Nothing End Sub
>674 upできた。見にくくてスマソ。
分かってると思うけど、VBScript Regular Expressions 5.5をアーリーバインドしてね。 こういうのって、完璧にやろうとすると疲れるから、どっかで妥協しないといけないと思う。
Dim objMatch As Object, strResult As String, objCell As Range With CreateObject("VBScript.RegExp") .Global = True .Pattern = "([ぁ-んァ-ンー、,。「」]*)([^ぁ-んァ-ンー、,。「」]*)" For Each objCell In ActiveCell.CurrentRegion For Each objMatch In .Execute(objCell.Value) strResult = strResult & objMatch.SubMatches(0) & StrConv(objMatch.SubMatches(1), vbNarrow) Next objMatch objCell.Value = strResult Next End With
>677 そうだよね。SubMatchesという手があるんだよね。勉強になりますた、ハイ。
680 :
670 :2006/10/08(日) 18:21:02
681 :
671 :2006/10/08(日) 18:58:11
元々ひらがなに半角なんて無いから(ry
PC-6001には半角ひらがながあったぞ
>682 のぞきたいっていってるんだからそれでいいぢゃないか。(;´Д`)ハアハア
あれ、ひらがなも半角カナに変換されなかったっけ? と思ったら、されないね。気のせいだったか。
>>678 [ぁ-んァ-ヴー,、。「」]
くらいが実用的範囲か。ヴじゃなぁ、せっかくの雰囲気が…
>>671 動的なら、Eraseすればとりあえず解放されているようには見える。中で何やってるかは知らない。
環境:Winows XP Accessバージョン:2003 OracleDBにリンクされたテーブル(odbc)の接続について質問です。 下記コードにてConnectの接続文字列の取得をしており、 OpenDatabaseのパラメータの箇所でエラー (システムで予約しているエラー)が出てしまいます。 (OracleDBのリンク先がローカルであれば問題無いのですが、 サーバのOracleDBにリンクした場合にエラーが出てしまいます。) ちなみに、Connectionは以下の内容です。 "ODBC;DRIVER={Oracle in OraDb10g_home1};SERVER=AAA;UID=test;PWD=test;DBQ=test;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=Me;CSR=F;FWC=F;FBS=60000;TLO=O;" どうぞ、よろしくお願い致します。
689 :
688 :2006/10/10(火) 22:40:58
Private Sub Form_Open(Cancel As Integer) Dim lstrConnect as string Dim dbs As DAO.Database Dim tdf As DAO.TableDef Dim qu As DAO.QueryDef Set dbs = Application.CurrentDb For Each tdf In dbs.TableDefs If CBool(tdf.Attributes And dbAttachedODBC) Then Debug.Print tdf.Name; vbTab; tdf.sour; vbTab; tdf.Connect lstrConnect = tdf.Connect Rem If ... Then Rem 接続しデータ検索を行う処理 Rem End If End If Next Set dbs = OpenDatabase("", False, False, lstrConn) Set qu = db.CreateQueryDef("", lstrSQL) Set rs = qu.OpenRecordset(dbOpenDynamic) Do While Not rs.EOF 〜〜〜〜略〜〜〜〜 End Sub
そのODBCを他のソフトを使ってリモートのOracleにつなげることはできるのか?
691 :
688 :2006/10/10(火) 23:26:23
>>690 他のソフトでつなげたことはありません。
VBAじゃなく、Accessの機能を使って、そのリモートのOracleにつなげることはできるのか?
693 :
688 :2006/10/11(水) 06:58:06
>>692 はい、テーブルのリンクで接続は可能です。
694 :
デフォルトの名無しさん :2006/10/11(水) 11:40:35
Excel2007のVBAを弄っています。 プログラム経験はあるのですが、VBA自体に慣れていないので、苦戦中です。 Excelで、セルの値が変更されたら、処理を行う関数を作っているのですが、 Sub Worksheet_Change(ByVal Target As Range) ’処理いろいろ End Sub などと書いた後、中身を関数化しようと、 Sub Worksheet_Change(ByVal Target As Range) CalculateTable(Target) End Sub Public Sub CalculateTable(Target As Range) ' 処理いろいろ End Sub と書いたのですが、Excelでセルの内容を変更すると、 CalculateTable(Target) の行で、「オブジェクトが必要です。」というエラーがでます。 これは、どういうことなんでしょうか。
695 :
694 :2006/10/11(水) 11:48:21
わかりました! Call CalculateTable(Target) か、もしくは、括弧をつけないで、 CalculateTable Target でいいのですね。 Functionも一緒に書いていたのですが、そちらは、 普通の関数のように(カッコをつけて、callもつけないで)呼べるので、 迷ってしまいました^^; ステートメントと関数呼び出しの違いなのっだと思うのですが、 他言語使っているとハマりやすいと思うのですが、 この辺の文法的な説明ってどっかに記述ありますか?
696 :
694 :2006/10/11(水) 11:51:52
697 :
デフォルトの名無しさん :2006/10/11(水) 12:22:26
このスレはテディーベアみたいなもんだな
698 :
デフォルトの名無しさん :2006/10/12(木) 14:38:41
教えてください!変数3つ。 Dim 日数 As Integer Dim 日にち As Integer Dim シグナル As Integer For 日数 = 3 To 20 For 日にち = 5 To 30 For シグナル = 5 To 20 なんですけど、やりたいことは、 日数=3の時、日にち=5、6,7,8・・・30 日数=4の時、日にち=5,6,7,8・・・30 ・・・・・ 日数=20の時、日にち=5,6,7,8・・・30 さらに、 日にち=5の時、シグナル=5,6,7,8・・・20 日にち=6の時、シグナル=5,6,7,8・・・20 日にち=30の時、シグナル=5,6,7,8・・・20 と全通りやりたい場合は、どのように書けばいいのですか? 教えてくださいお願いします。
699 :
デフォルトの名無しさん :2006/10/12(木) 14:57:13
すいません、普通にできましたw
700 :
デフォルトの名無しさん :2006/10/12(木) 15:51:38
すいません、さっきの者ですが、 例えば、 dim 日数 as integer for 日数 = 3 to 20 で、実際は、日数=3,5,8,101、3,15,18、20 だけをやりたい場合って、どうゆうふうに書けばいいのですか? 教えてください。
for d = 3 to 20 step 3 つーかなんでヘルプ見ないの?
よくみたら3の倍数じゃないのか for each i in array(3, 5, 8, 10, 13, 15, 18, 20) とか for i = 1 to 8 j = roundup(i * 2.5, 0) とか適当に考えろ
703 :
デフォルトの名無しさん :2006/10/12(木) 20:47:21
こんばんは、高速化について質問させて下さい。 現在、エクセルVBAで、CSVデータをエクセルに読み込むプログラムを作りました。 Open "TESTFILE" For Input As #1 Do While Not EOF(1) Input #1, s ・・・ Loop Close #1 このような感じで書いて正常稼動していますが、 いまいち遅いです。 Line Input #1, i のように1行ごとに読むと高速なるのはわかりましたが、 なにぶん、改行が不定でうまく読み込めません。 より高速化し、かつ旨く読み込めるアドバイスがあれば勉強になります。 ぜひご助言をお願い致します。
706 :
デフォルトの名無しさん :2006/10/12(木) 21:21:31
>>704 レスありがとうございます。
すんませんエクセルのどの機能を使うのでしょうか?
あまり詳しくないもんで、エクセルのオブジェクトを作成して読み込むってことでしょうか?
もう少しヒントを下さるとありがたいです。
>>706 マクロの記録を開始してから、Excelのファイルメニューからcsvファイルを開け。
>>703 データが膨大でないのなら全部読み込んでから処理したら。
Const fPath As String = "c:\hoge"
Dim fName As String
fName = "hoge.csv"
Workbooks.OpenText Filename:=fPath & "\" & fName, DataType:=xlDelimited, Comma:=True
(後はお好きなように)
709 :
703,706 :2006/10/13(金) 08:27:06
遅レスすみません。
>>707 理解できました。Workbooks.Open Filename:=・・・・ですね勉強になります。
>>708 Workbooks.OpenText Filename:=・・・
見本のコードありがとうございます。勉強になります。
皆さんが指摘されてるように、いったんWorkbooks.OpenやWorkbooks.OpenTextで開いて
その後、加工処理をする方法を試してやってみたいと思います。
レスくれた方々、ありがとうございました。
710 :
デフォルトの名無しさん :2006/10/13(金) 17:56:58
使用OS:WindowsXP 使用ソフト:EXCEL2002 A列、B列、、、F列のそれぞれ2-51行について、共通部分があったら H列に出力したいんですが、以下を書いたら Withブロック変数が定義されていないと出てきました。 どうしたらよいでしょうか。 Sub AAA() Worksheets("sheet1"),activate Dim isect As Range Set isect = Application.Intersect(Range("A2:A51"), Range("B2:B51"), .Range("C2:C51"), Range("D2:D51"), Range("E2:E51"), Range("F2:F51")) With isect .Copy Destination:=Worksheets("sheet1").range("H:H") End With End Sub
> Withブロック変数が定義されていないと出てきました。 そりゃそうだろう。
712 :
デフォルトの名無しさん :2006/10/13(金) 19:20:20
XPsp1、Excel2002です。 (1)VBAで他のブックのマクロを実行することはできるの でしょうか。 (2)できる場合、 a)その方法を教えて下さい。 b)実行(処理)終了の待ち合わせ方法を教えて下さい。 c)他のブックは別のPC(同一LANの)上のものでも良い のでしょうか。
(1) できます (2) a) オープンすれば呼べます (2) b) 終わるまで戻らないので、待ち合わせる必要がありません (2) c) よいです
あ、それと、xlsでも参照設定をすれば呼べるかもしれません。 アドインとして保存すれば、参照設定をするだけで呼べます。
と思ったんですが、オープンするだけじゃ呼べませんでした。 参照設定が必要。
非同期で他Bookのマクロを実行したいって話じゃないのか?
application.run "book_name!sub_name"
>>710 Application.Intersectメソッドは、共通の(重なっている)セル範囲を抽出するメソッド。
値が同じセルを抽出するものではない。
どういう風に同じになるのか示してくれないと、話が先に進まない。
ちなみに、範囲内で値が全く同じ列を抽出するということであれば、それなりのコードを書く必要がある。
Excel VBAの練習にはいいと思う。
719 :
712 :2006/10/14(土) 09:23:11
>>みなさん どうもありがとうございます。 追加質問です。宜しくお願いします。 (1)「参照設定」って何でしょうか。 application.run "book_name!sub_name"と記述することでしょうか? (2)「アドインとして保存する」ってどういうことでしょうか。
イルカに聞けよ
>>710 Sub AAA()
Range("sheet1!H2:H51").FormulaR1C1 = "=IF(AND(RC[-7]=RC[-6],RC[-7]=RC[-5],RC[-7]=RC[-4],RC[-7]=RC[-3],RC[-7]=RC[-2],RC[-7]=RC[-1]),RC[-7],"""")"
End Sub
Excel 2003 VBAです。 まず、以下のようなテキストファイルを読み込み、 2006の前にある数字を取得しExcelのセルに貼り付けたいと考えています。 どう読み込んで良いか、というところからわかりませんので お教えください。よろしくお願いします。 ××××× 2 2006 △△△△△△ □□□ 4 2006 ○○○○○○○ ●●●● 1 2006 ◎◎◎◎
>>723 マクロの記録を開始してから、Excelのファイルメニューからtxt/csv/tsvファイルを開け。
725 :
723 :2006/10/14(土) 20:06:39
>>724 ファイルを開きたいわけではありません。
それとも、開かないとその後の作業ができないのでしょうか。
>>725 注文が多いな。
openしてline inputしてsplitしろ。
コードも書いとくか。(動かしてない) sub foo() dim s as string dim ary() as string dim r as range dim i as long set r = worksheets("sheet1").range("a1") open "file_name" for input as #1 i = 0 do while not eof(1) line input #1, s ary = split(s, " ") r.offset(i, 0).value = ary(1) i = i + 1 loop close #1 end sub
728 :
デフォルトの名無しさん :2006/10/14(土) 20:27:12
お勧めの参考書教えてください 基本はある程度できます。エキスパート試験にむけて勉強しようと思っています。 誰かお願いします
729 :
デフォルトの名無しさん :2006/10/14(土) 20:45:50
line inputしてinstrしてmidしてもいいか
731 :
723 :2006/10/14(土) 21:07:01
>>729 ありがとうございます。
instrしてmidの方が私のやりたいことに合っていると思います。
どういった関数があるのかが、わからないものですから
勉強になりました。
一旦読んで処理するのも悪くないと思うが。 Const srcCol As Long = 2, tarCol As Long = 1 Dim fPath As String, fName As String Dim wbTarget As Workbook, tarWsIdx As Integer Set wbTarget = Application.ActiveWorkbook tarWsIdx = Application.ActiveSheet.Index fPath = "C:\hoge" fName = "hoge.txt" Application.ScreenUpdating = False Workbooks.OpenText Filename:=fPath & "\" & fName, DataType:=xlDelimited, ConsecutiveDelimiter:=True, Space:=True Columns(srcCol).Copy Destination:=wbTarget.Worksheets(tarWsIdx).Cells(tarCol) ActiveWorkbook.Close Savechanges:=False wbTarget.Worksheets(tarWsIdx).Activate Application.ScreenUpdating = True
dim w as workseet set w = activesheet ... w.activate の方が好き。
735 :
デフォルトの名無しさん :2006/10/15(日) 17:22:00
Excel2002です。 ヘルプの見方を教えて下さい。 Rows(x)、Range(y)のx、y部分の記述可能な形式を調べようとして ヘルプを見たのですが、 オブジェクトのところでRowsもRangeも見つかりませんでした。 プロパティのところではValueが、メソッドのところではSelectが 見つかりません。どこを見れば載っているのでしょうか。
Excel 2003だが、Rows, Range, Value全てプロパティにあったぞ。 Selectもメソッドの中にあった。
737 :
735 :2006/10/15(日) 19:30:39
>>736 レスありがとうございます。
VisualBasicのヘルプ→目次→ランゲージリファレンス→プロパテイで
出て来ないのですが、見方が違うのでしょうか。
738 :
デフォルトの名無しさん :2006/10/15(日) 19:59:47
VisualBasicEditorのコード上でRowなりColumnなりの記述があるところに カーソル合わせてF1でヘルプ開けば一発で出ないか?
>>737 Excelのヘルプの目次からMicrosoft Excel Visual Basicリファレンスとかいう項目があると思う。その下。
2000でもそんな感じだったはずだから、2002でもそうだと思う。
プロシージャへ渡す引数が省略されて実行された場合、 自動的に該当引数に値をセットしたいですが、 どうすればいいでしょう?? 確か、引数の値or参照や型定義のときに 一緒にやったような気がするんですが・・・。
Sub Test(Optional Arg As String = "省略したよ") MsgBox Arg End Sub
743 :
737 :2006/10/16(月) 18:53:14
>>738 、739、740
レスありがとうございました。
F1押したら「ヘルプがインストールされてない」と出てきました。
EXCELをインストールしなおします。
>>743 2chだけじゃなくてまずは、VBA・初心者とかのキーワードでググりなさい
ヘルプのインストールの事等は基本だよ
745 :
デフォルトの名無しさん :2006/10/17(火) 00:22:50
すみません VBAでC++のMap型やvector型のような変数はありますか? ちょっと検索してみたのですがないっぽい感じですよね? 代用できる変数見たいのでも構いませんので ご存知の方よろしくお願いします
dictionary
748 :
デフォルトの名無しさん :2006/10/17(火) 09:02:51
シート上のグラフをVBAで全て削除するには どうすれば良いのでしょうか
>>748 ChartObjectsに対してFor Eachループ回してDelete
750 :
デフォルトの名無しさん :2006/10/17(火) 10:25:38
EXCEL2000利用です COLORINDEX=39の色のセルがどこかを メッセージボックスに書き出すということに 取り組んでいます ググッてみて、いろいろ出てきたのですが、 公開されているプログラムだと、条件付き書式でつけた色を認識せず COLORINDEX=2と判断してしまいます 何か対処法はありませんか?
まずはコードを晒せ
752 :
750 :2006/10/17(火) 11:13:11
>>751 そうですね。すみません。
色の識別をするのに、
Function CellColor(セル)
CellColor = セル.Interior.ColorIndex
End Function
というマクロを標準モジュールに書いて、
=CellColor(A1)
という式をセルに書いて色番号を書き出すというものです。
この一連の作業を行うと、指定したセルの色として、
COLORINDEX=2という風に出てきてしまいます。
753 :
741 :2006/10/17(火) 11:57:21
>>752 全く条件付き書式を考慮してないじゃん。
少しは条件付き書式で設定した色を取得するために
努力をした形跡が見られるコードを期待していたんだが、
形跡どころか欠片も見つからねぇw
君、やる気あるの?つーかこっちの教える気が無くなった。
努力せず丸投げで教えて貰おうって根性の奴には
丸投げ大好きピエロがいるからそいつに教わってくれ。
755 :
デフォルトの名無しさん :2006/10/17(火) 12:31:33
>>749 If Not ActiveSheet.ChartObjects Is Nothing Then ActiveSheet.ChartObjects.Delete
756 :
デフォルトの名無しさん :2006/10/17(火) 12:47:48
>>750 まずはヘルプをFormatConditionsで検索だ。
>>745 VBGenericというものを聞いたことがある。
使ったことはないから使い心地はわからないが。
質問です VBAからtelnetでUNIXサーバに接続して、コマンドを実行する方法はありますか? 現状、Shellでバッチファイルを叩いてみましたが、うまくいきませんでした。 ご存じの方がいらっしゃったら、教えていただけないでしょうか?
telnet.bat
全然VBAの話じゃないじゃん。 VisualBasic for Applicationは、Application(Word、Excel、Accessなど)を操作して 始めてVBAだよ。それ以外はApplication(Word、Excel、Accessなど)付属の VBE(Visual Basic Editor)を利用したとしても、通常のVB分野の話。 ということでVB6スレへどうぞ。
=2chはVBAです。
>telnetでUNIXサーバに接続して、コマンドを実行する方法 telnetの場合は、必ずユーザ名とパスワードの入力を要求される。 rshかsshを使うべし。 あと、VBAのShell関数は必ず「非同期」で実行されるから、 サーバからの出力を受け取る必要がある場合は、 コマンドの同期実行が可能なWSHのWScriptオブジェクトのShellメソッドを使うのが吉。
プログラマーとも呼べない、底辺のヒスババア技術者が偉そうにできるスレはここですか?
763は、何か嫌なことでもあったのかな?
765 :
748 :2006/10/18(水) 07:56:11
766 :
デフォルトの名無しさん :2006/10/18(水) 18:58:37
VBAもプログラミング言語の一種だよね?
VBが日本語ならVBAは大阪弁ってところだ。 VBA自体は正確には言語そのものでは無い。
エクセルVBAで、すでに起動されているプロセスのIDを取得するには どうしたらよいのでしょうか。 ウインドウもでておらず、タスクトレイに表示されているだけのプロセスです。
771 :
769 :2006/10/19(木) 02:10:19
>>770 とても参考になりました。ありがとうございます。
772 :
デフォルトの名無しさん :2006/10/19(木) 07:55:49
EXCEL2002です。 セルをクリックした時に起動されるVBAマクロの記述の仕方と クリックされたセルの位置(行、列)の入手方法を教えて下さい。
>>772 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address(0, 0)
End Sub
但しこれはイベント名を見ても解るとおり、選択セルの変更で発生するイベントなので
マウスでセルをクリックして選択セルを変更した時だけではなく、キーボード操作の場合も発生する。
さらには現在の選択(アクティブ)セルを再度クリックしても発生しない。
Worksheet_Clickイベントは無いからそういうのが都合悪いなら、シート上にボタンを配置しな。
ダブルクリックか右クリックならイベントあるから、それで代用できない?
775 :
772 :2006/10/19(木) 14:05:35
776 :
デフォルトの名無しさん :2006/10/21(土) 12:31:04
EXCEL VBAでテキストファイルから特定のキーワードを抜き出して (つまりGrepのようなものです) EXCELシートに抽出する処理を行いたいです。 単純にテキストファイルの全行をシートに抽出する処理の記述法は知っているのですが、 変数に格納した各行内で抽出キーワードに合致した部分だけを取り出す方法というのがわかりません。 どなたかご教授頂けないでしょうか?
>>776 正規表現使え。
VBAでの正規表現の使い方はググれ。
その程度で正規表現使うまでもないだろ
ハズレ 使うまでもないから使わないってのは、余計なコストが掛かる場合の理論 コストが掛からないなら、使うまでもないところで使ったって何の問題もない そして正規表現は、労力面、金銭面、導入面全てに置いてほとんどor全くコストが掛からない
780 :
776 :2006/10/21(土) 13:00:28
>>777 レスありがとうございます。
EXCEL VBAでの正規表現の使用法は自分で調べます。
もう1点質問なのですが、EXCEL VBAでファイル名(例えば「sakura.exe」という文字列)から
拡張子を除いた部分だけを切り出す方法はありますでしょうか?
LEFT、RIGHT、MID関数を組み合わせても上手く行きません。
よろしくお願いします。
781 :
776 :2006/10/21(土) 13:02:32
>>780 の補足ですが「sakura.exe」を「sakura」のようにしたいということです。
「sakura.exe.bak」であれば「sakura.exe」として抽出したいです。
よろしくお願いします。
783 :
776 :2006/10/21(土) 13:12:06
>>782 すいません。まだよくわかりません。
例も良くなかったです。すいません。
拡張子の長さは3文字固定とは限らない前提です。
「sakura.exe.manifest」→「sakura.exe」
784 :
776 :2006/10/21(土) 13:49:55
InStrRev関数を使えばできることがわかりました。 どうもありがとうございました。 Dim 拡張子あり As String Dim 拡張子なし As String 拡張子あり = "sakura.exe.manifest" FileName = Dir(FullPath) 'フォルダ名を除いたファイル名を取得(=User32.dll) If InStr(1, FileName, ".") > 0 Then '拡張子がある場合は、拡張子を省く 拡張子なし = Left(File拡張子なしName, InStrRev(拡張子なし, ".") - 1) End If
785 :
776 :2006/10/21(土) 13:51:27
間違えました。これです。 Dim 拡張子あり As String Dim 拡張子なし As String 拡張子あり = "sakura.exe.manifest" If InStr(1, 拡張子あり, ".") > 0 Then '拡張子がある場合は、拡張子を省く 拡張子なし = Left(拡張子あり, InStrRev(拡張子あり, ".") - 1) End If
Dim fso Set fso = CreateObject("Scripting.FileSystemObject") GetTheBase = fso.GetBaseName(filespec) 導入コストはかからないからお勧め!!
正規表現使うならそれでやってみるのもイイぞ。
776みたいなサクラエディタの信者ってキモイなw
790 :
デフォルトの名無しさん :2006/10/22(日) 15:28:37
Excel2003でVBA組んでるんですが。 ListBoxコントロールの背景色(ListBox.BackColor)を変更すると、 ListBoxの選択中の表示(背景色が強調されたり、選択枠で囲まれ たり)が消えてしまうんですが、これをさせないようにするには、 どうしたらいいんでしょう。ListBox.ListIndexは、選択された値 がそのまま維持されているんですが。再設定してみても、選択さ れないですし。(ListBox.ListBoxIndex を一度別の値に設定して、 再設定すると表示されるみたいですが、これもちょっと…) 初歩的な質問ですみません。
選択中の行を 上へ移動(つまり上の行と入れ替える) もしくは、下へ移動したいんですけど、いい方法を教えてくだされ。
>>791 Excelで手操作するのと同じ動作でしょ?
マクロ記録モードにして
マウスで行切り取りして
コピーした行を挿入ってやって
記録モード止めてからマクロを見ればいいじゃない
天才現る
と、思ったら 3行目のセルを切りとる → 2行目のセルに挿入 というコードになってしまいますた。(´・ω・`)ショボーン 上のセルに挿入というコードにしたいのですが、ご教授を('A`)
初歩的な質問で申し訳ありません。 VBAはOffice製品で使えるプログラミング言語とありますが、 使い方や、データ型など、は変わらないのですか? MySQLとSQL Server ではデータ型が違っていたりしますが・・。
>>794 つ 相対
>>795 構文規則はたぶん100%互換
型もたぶん100%互換
組み込みの関数やステートメントは95%互換くらいかな
組み込みのグローバルオブジェクトは全然違う
ユーザーフォームも結構違う
>>796 どうもありがとうございます。
参考になりました。
>>790 色々やってみたが確かにうまくいかない。
唯一うまくいったのが下記。(動作確認はExcel 2000だが。)
myIndex = .ListIndex
.Selected(myIndex) = False' 一旦外す
.Selected(myIndex) = True
しかし何のために背景色を途中で変えるのだろう…
処理上、後が優先されるだけのことでしょ 自己満足の処理はいらねぇよなぁ
配列a(9)をセルA1:J1にガバっとセットするヒントを教えてください。
Range("A1:J1").Value = a
804 :
デフォルトの名無しさん :2006/10/25(水) 21:06:28
>>798 ありがとうございます。true→falseでもできますか。
そっちの方がいいかも。
背景色を変えたい理由は、今、テキストボックスのに
リストボックスから選択した内容を挿入しながら編集
するフォームを作っているですが、実際に使ってみる
と、タブとかで頻繁にリストボックス←→テキスト
ボックスを移動するんで、今どこにいるかわからなく
なるんです。で、みれば一発でわかるように現在Focus
がいるコントロールの背景色を変えたんですが…
805 :
デフォルトの名無しさん :2006/10/26(木) 20:29:45
すんまそん。教えてください。 動的配列で格納した数字を全部足した場合はどうしたらいいんですか?
806 :
805 :2006/10/26(木) 20:36:34
書き忘れました。 XPのエクセル2003です。
808 :
805 :2006/10/26(木) 21:15:17
>>807 ありがとうございます。
配列数ではなく、配列に格納した数字を全部足したいんです。
例えば
a(1)=126
a(2)=769
a(3)=321
であれば、単純にa(1)+a(2)+a(3)と出来るのですが・・・
配列数が未定なものはどうしたらいいんでしょうか?
>>808 for 変数= Lbound(配列) to Ubound(配列)
じゃダメなの?状況をもう少しkwsk
810 :
805 :2006/10/26(木) 21:52:54
>>808 すんまそん
仕事現場にプログラムを置いてあるんで、コードはうつせませんが、
例えば、静的配列で配列に格納した数字を全部足したい場合は
a(0)=126
a(1)=769
a(2)=321
NUM=a(0)+a(1)+a(2)
でできますが、
動的配列だと
a(0)
.
.
a(i)
NUM=a(0)+・・・・a(i)
となるとおもいます。
a(i)の最大配列数はUboundで出せて、おっしゃる通りfor〜toを使えますが、
いざ格納された数字を全部足そうと思うとどうやったらいいかわかんなくて。。
NUMの変数定義でstaticを使ってもダメそうで。。
ダメだこりゃ。
> NUM=a(0)+a(1)+a(2) この時点で唖然とする。
813 :
809 :2006/10/26(木) 22:06:06
すみません、何が問題なのかすら分かりません。 他の人バトンタッチ....
814 :
805 :2006/10/26(木) 22:06:20
>>812 2日前にプログラム始めたばかりでして^^:
他に何かやり方があるんですか?
815 :
デフォルトの名無しさん :2006/10/26(木) 22:14:58
ニュートン・ラフソン法と2次方程式の解法を組み合わせて、 3次方程式の解を求めるプログラミングはどのようにして作れば いいんですか?
>>815 どうって・・ループと条件式でアルゴリズムを具体化してみそ
818 :
805 :2006/10/26(木) 22:24:07
>>816 すみません。
ちょっとわかんないんで、コード教えていただけますか?
>>818 for a=1 to 5
c=c+b(a)
next a
例えばこれを理解してみて
820 :
809 :2006/10/26(木) 22:28:05
for i=lbound(a) to ubound(a) Sum = Sum + a(i) next i 基本すぎてなんか自信ないよ。
821 :
805 :2006/10/26(木) 22:30:54
822 :
819 :2006/10/26(木) 22:42:15
ちなみにエクセルだと b=WorksheetFunction.Sum(a) とか一行でも書けるけどな
動的配列ならFor each in使いたいな、なんとなく
824 :
809 :2006/10/28(土) 23:07:43
825 :
デフォルトの名無しさん :2006/10/29(日) 00:26:24
うーん、長い間PG組んでいるが、 For i=0 to UBound(buffer)-1 sum=sum+buf(i) next 以外のパターンって使ってないな。 For each inとかlboundとか一度も使ったことないし。 While文ですらろくに使わない。Do Whileなんて、何それだしなぁ。 われながら、PG能力が低いな。
うん。
827 :
デフォルトの名無しさん :2006/10/29(日) 03:43:36
こんばんは。WindowsXP で Word2000 を使っています。 私は英訳等をする機会が多いのですが、 分からない単語が出てくるたびにマウスで単語を 辞書サイトにコピーペーストし、検索ボタンを押しています。 (もしくは単語コピー→Alt+Tabでブラウザ⇔Word切り替え→ペースト検索) この作業をマクロを使う感じでショートカットキー一つで出来る、もしくは コンテキストメニュー(右クリックメニュー?)に追加して労力を減らせれば 非常に便利だと思うのですが、マクロ化するようなことは出来ないのでしょうか? 以下に行いたい処理の流れをかきます。 1:実行中のWordで調べたい単語を選択している状態からスタート 2:マクロを実行すると、選択している単語をアルクの辞書サイトで検索 3:画面の表示をインターネットブラウザへ移して検索結果を表示 これに加えて、できれば一回一回開きなおすのでなく、一度以上検索を行っている場合には その窓で検索を行うような形に・・・ 参考になるアドレスや似たようなマクロ持っている方などおられましたら助けていただけないでしょうか? 尚、ここへ来る前にWord総合質問スレにて質問させていただきましたが、 畑違いかと思いましてこちらで質問させていただいています。 詳しい方いらっしゃいましたらよろしくお願いします。
>>827 昔使ってた辞書ソフトとか翻訳ソフトに
画面上の英単語にマウスカーソルを当てるだけで
訳をウィンドウ表示する機能があったけど、
そーゆうのではダメですか?
>>827 クリップボード監視してBookshelf(昔のオフィス付属の辞書ソフト)を引くプログラムを
VBで書いたことがあるので、ショートカットキーならもっと簡単だと思う。
Web上の辞書なら、あらかじめある単語を引いた結果画面の
アドレスのどこに選択した単語が含まれているかを調べて(&word=hogeみたいに)
その部分を置き換えたURIを作ってブラウザを開けば良いだけ。
>>828 代表的な物としては「ロボワード」とかね
最近だと「本格翻訳5」(開発NEC,販売ソースネクスト)の1980円の奴でもできるけど
ttp://www.sourcenext.com/titles/use/72400/
830 :
827 :2006/10/29(日) 11:41:30
>>828 ありがとうございます。辞書ソフトや、翻訳ソフトを所持していないので
ちょっと想像がつかないです・・・。もう少し調べてみます。
>>829 ありがとうございます。
>Web上の辞書なら、あらかじめある単語を引いた結果画面の
>アドレスのどこに選択した単語が含まれているかを調べて(&word=hogeみたいに)
>その部分を置き換えたURIを作ってブラウザを開けば良いだけ。
私もそういう動作をさせられればいいなと思っていました。Wordを実行中に
Wordのショートカットキーから作成したプログラム(プラグイン?)を動かす
ような動作が可能なのでしょうか?
マクロでこのような動作を行うのは難しく、プログラムを作成する必要がある、
と考えた方がよいのでしょうか?
本格翻訳5見てきました。ワードのプラグインとして使えて便利そうです。
831 :
827 :2006/10/29(日) 15:23:16
何度も申し訳ありません。アドバイスをヒントに色々と試しまして(彷徨いまして)、
以下のようなマクロにまとめてみました。コードを張ってよいものか分かりませんが
失礼します。
Sub 検索野郎男塾()
Dim word As String
Dim address1 As String
Dim address2 As String
Dim address3 As String
'選択中の文字列を取得
selectedword = Selection.Text
' address1:アドレス前半部 address2:アドレス後半部 address3:選択中の文字列と結合
webaddress1 = "
http://www2.alc.co.jp/ejr/index.php?word_in= "
webaddress2 = "&word_in2=なんてらかんてら&word_in3=なんてらかんてら"
webaddress3 = webaddress1 + selectedword + webaddress2
With CreateObject("InternetExplorer.Application")
.Navigate webaddress3
.Width = 1024
.Height = 768
.Top = 0
.Left = 0
.ToolBar = True
.MenuBar = True
While .Busy: Wend
While .Document.ReadyState <> "complete": Wend
.Visible = True
End With
End Sub
832 :
827 :2006/10/29(日) 15:31:59
それで、現在の動作が、 1.Word中で文字列を選択 2.Word中で上記マクロ実行 3.IEが起動し、希望のページの表示が行われる。 と、大体希望通りの動きをしています。 ただ、検索を2度3度と繰り返しますと当然かもしれませんがIE窓が2個3個・・・と 増えていってしまっています。 IEが開いているかどうかチェックして、開いていれば同じ窓で該当アドレスを開く、 といった動作にするためのヒントをご存知の方いらっしゃいましたらいただけないでしょうか? 漠然と、 「多分IEが開いてるかどうかを示すパラメータのような物があるだろうから、それを取得して分岐してやればいい」 と素人なりに考えてはみたのですが、ヒントや改善点などなどありましたら指摘していただけると助かります。
>>825 動的配列だと、配列がa(4)からa(10)とか、極端な話飛び飛びに
なっていることもあるし。まあ、レアケースではあるけど。
834 :
827 :2006/10/29(日) 18:10:15
835 :
デフォルトの名無しさん :2006/10/29(日) 21:27:52
ちょっとお聞きしたいですが… エクセルでコンボボックスを使ってデータ管理したいのですが コンボボックスを同じ行で一つずつ作りたいんですが 設定する時に一つ一つしなければならないのでしょうか?
日本語で 具体的に 無駄な行間開けずに お願いします
>>832 ShellExecuteでURL指定すれば、適当にIEのウィンドウを使いまわさなかったっけ?
838 :
デフォルトの名無しさん :2006/10/31(火) 18:12:28
1.点数チェックボタンを押すと、自動的に「Sheet2」が作成される。 2.作成された「Sheet2」に表1がコピーされる。 3.コピーされた「Sheet2」で、点数が70点未満の者は、背景が赤色に変更される。 という問題で、シート2への転記はできた。 けど、70点未満の人間の背景を赤色に変更することができないんです>< 一人ずつ点数を判別していくとなると、莫大な労力を要するので、どうにかなりませんかね?
>>837 そうなるのは、インターネットオプションの詳細設定で、
「ショートカットの起動にウィンドウを再利用する」が設定されているときだけだと思う。
>>838 自分で自分のレスを読み返してみろ。
その文で他人に状況が伝わるとでも?
わかるだろ
>>838 Sheet2って何?新規ワークシートの名前?
表1って何?どこにあるの?
70点未満の人間の背景を赤色ってどうやるんだ?できるならこっちが教えてほしいわ
70点未満の点数が表示されているセルの背景のことか?表1には名前と点数がセットになってるのか?
判別はループ内ですれ
今酷い優しさを見た。 End sub
>838 労力ってVBA書く労力か?一行でかけるぞ
846 :
デフォルトの名無しさん :2006/10/31(火) 23:30:51
初心者の質問ですがよろしくお願いします。 一つの列について、特定の(複数の)文字があれば、その文字があるセルを色づけし、 特定の(複数の)文字がなければその行を削除する、というVBAを作りたいのですが 上手くいきません。 Sub tes() Range("B3").Select Do Until Selection.Value = "おわり" ’おわりセルまでループさせる’ If Selection.Value = "#001" Or "#003" Or "#005" Then Selection.Interior.ColorIndex = 37 ’アクティブセルが#001か#003か#005であればセルの背景色を37に’ Else Selection.EntireRow.Delete ’それ以外は行ごと削除’ End If Selection.Offset(1, 0).Select Loop End sub マクロが全く動かずに "#001" Or "#003" Or "#005"のところがエラーだと出てしまいます。 実際のところ、特定の文字列は1500個ほどあります。何とか上手くいく方法は無いでしょうか? (もちろん実験のため3個の文字列でも実行しましたがエラーでした。1個だと上手くいきます)
orは条件式(変な言葉だけど)をつなげるものだと思うよ 〜value="#001" or 〜value = "#002" or 〜value ="#003" とかで試してみてください。
>>846 or の使いかたがまずいと思う
めんどうだが全て式にしてor でくぎる
だが、実際1500あるならそれじゃ大変すぎ
>847 少ないサンプルで実験したら、それで何とかできそうです!! ありがとうございましたm(^^)m >848 式はメンドイですけど、これもエクセルの&で乗り切ります・・ 出来るかなぁ。。
追記: 条件が1500個というのを見落としていました。 とりあえず簡単(分かりやすい)なのは 条件を入れる列を用意してあげて一個ずつ比較する事かな? 例えばD列に条件をずらーっと並べて(D1="#001",D2="#003"・・・D1300="#923") int_row=3 Do while cells(int_row,2).value="尾張" bln_check=false for int_comp = 1 to 1500 if cells(int_row,2) = cells(int_comp,4) then cells(int_row,2).interior.colorindex =37 bln_check=true exit for end if next int_comp if not(bln_check) then cells(int_row,2).EntireRow.delete int_row=int_row+1 Loop こんなイメージ。 適当に書いただけ。 当然これだと条件に当てはまらなかったときに 条件の入った行まで消してしまうのでD列を別シートに移動する等しなくちゃいけない。 つづく?
あ、ごめん。 バグだらけだ、コレ。 行消しちゃうと不具合が... >if not(bln_check) then cells(int_row,2).EntireRow.delete >int_row=int_row+1 一行飛ばしちゃうね。 しかし汚いコードだ..
852 :
846 :2006/11/01(水) 00:12:02
>851さん 解決したかと思ったのですが出来ませんでした・・・。Selection.Value = "#001”を横に並列 させようとしたんですが、30式ほどで横幅の限界まで直ぐに到達して無理に。 縦に縦列させたところ、 If Selection.Value = "#001" Or Selection.Value = "T2531" Or Selection.Value = "T2536" Or Selection.Value = "T2536" Or Selection.Value = "T2572" Or Selection.Value = "T2576" Then ↑のように、上の文字列が赤くなりエラーがでてしまいました。 >850はD列に条件を入れて、そこを参照にさせるということですか??? 自分にはちょっと無理そうなので、もう少し詳しく教えていただけませんか?
文字のパターンのよるけど、1500個をひとつの文字列にして WorksheetFunction.Findとかで検索して、 ヒットしたら色、エラーなら消しってのでもいけると思う コードはめんどうだからカンベンw 何にしてもどこかのシートの列とかに特定文字を羅列したほうがいいよ。 コードにひとつひとつ書くのはやめれw
>>852 俺にさらに恥を晒させる気ですか、そうですか。
D列に〜と書いたのはVBEで条件を1500個書くよりもシートに直接記述したほうが楽かな、
と思っただけです。
ちなみに縦に縦列させるのは
If Selection.Value = "#001" _
Or Selection.Value = "T2531" _
Or Selection.Value = "T2536" then
というように行の最期に「 _」をつければOKです。
855 :
846 :2006/11/01(水) 00:35:18
>854 なにとぞ願いできないでしょうか? 「 _ 」ですが、数十個でも『「 _ 」を使いすぎています』というエラーメッセージが 出てきて無理でした・・。
856 :
デフォルトの名無しさん :2006/11/01(水) 00:43:21
>>855 おまいの1500個書こうという根性には感心したw
下準備: シート2のD列に条件を列挙 そして再びシート1を選択して以下のコードを実行 Sub test5() Dim int_row, int_comp,bln_check '変数を定義する int_row=3 '三行目から開始 Do while cells(int_row,2).value="おわり" '(int_row)行目の左から二個目のセル(B列)が"おわり"になるまで bln_check=false 'チェック(フラグ,印)をリセット for int_comp = 1 to 1500 'int_compを1から1500まで一個ずつ変動させる if cells(int_row,2) = Worksheets(2).cells(int_comp,4) then 'int_row行目のB列とシート2のint_comp行D列を比較 cells(int_row,2).interior.colorindex =37 bln_check=true '該当したものがあったらチェックする exit for end if next int_comp 'ここまできたらint_compを1増やしてfor〜の次へループ if bln_check=true then 'チェックしてあったら int_row=int_row+1 'int_rowの値を1増やす(次の行を見る準備) else 'ちぇっくが無かったら cells(int_row,2).EntireRow.delete 'その行を消す(下の行が繰り上がるのでint_rowはそのまま) end if Loop '先頭にループ end sub できるだけ初心者っぽいコードに仕立ててみました(逃げ) と、ここまで書いて不安になったんだが「変数って何ですか」ってレベルじゃないよね?
>>857 を一応テスト...
動いたのは動いたが当然遅い..フリーズしたかと思った。
解決1:残った行は全て色が残るわけだから逆に色づけは最期にまとめて行う(△)
解決2:条件を一度配列にぶち込む(○)
解決3:データ行、条件行両方をソートしてからうまい事...(○)
解決4:条件に法則性があるならそれを利用して場合わけ。(◎)
これくらいかなぁ...
まぁ、どちらにせよ条件を1500個も打ち込む時間に比べたら屁みたいなもんだろうけど。
、という事でそろそろ恥さらしは終わりにします。スレ汚しスマソ
何にせよ乙。
>>846 具体的にどういう文字列なのか晒せるなら晒してみて。
いくつかのレスにあるように、文字列に規則性があれば、簡単かつ高速になる可能性がある。
規則性があまりないなら、メインテナンス性を考えて、別のシートに1セル1文字列で入れておいたら。
文字の連接は、ある文字列(外れ)が他の文字列(当たり)の一部である場合に工夫が必要になる。
いくつか方法はあるが、お勧めはMatchだな。
860 :
846 :2006/11/01(水) 04:03:23
>847さん ありがとうございます!!変数はまだ良く解りませんが、何とかできてる感じです。 深夜までお付き合いありがとうございますm(-_-)m >859 T4031 T4041 T4042 T4043 T4044 T4046 T4047 T4061 T4062 T4063 T4064 T4078 T4088 T4091 T4092 T4095 T4097 T4099 T4100 上みたいな感じで規則性は皆無です。
861 :
デフォルトの名無しさん :2006/11/01(水) 10:07:07
>>860 いや・・それ規則性あるほうだよ。
Sub test() 'match使用の一例
Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Worksheets(1)
Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Worksheets(2)
Dim y1 As Long: y1 = ws1.Cells(65536, 1).End(xlUp).Row
Dim y2 As Long: y2 = ws2.Cells(65536, 1).End(xlUp).Row
Dim rr1 As Range: Set rr1 = ws1.Range("A1:A" & y1)
Dim rr2 As Range: Set rr2 = ws2.Range("A1:A" & y2)
Dim r As Range, a As Long
On Error Resume Next
For Each r In rr1
a = 0
a = WorksheetFunction.Match(r.Value, rr2)
If a = 0 Then
ws1.Rows(r.Row).Clear
Else
ws1.Rows(r.Row).Interior.ColorIndex = 6
End If
Next r
ws1.Cells.Sort key1:=Range("A1")
End Sub
'Sheet1-A列-10,000件のデータ Sheet2-A列-1500個の特定文字をセット
'mypcで25秒、Application.ScreenUpdating = Falseで13秒くらいか一例にしてみて
解決したようなので余計なことかも知れんが、そもそもの目的が「テーブルの中で特定の番号の ものだけ残す」ということであれば、削るのではなくて抽出することを考えた方が先々泣きを見な くて済むかも。マクロの間違いで消してしまって青ざめることも良くあるからな。 スキルの向上にもつながる。
863 :
デフォルトの名無しさん :2006/11/01(水) 17:43:16
コマンドボタンとテキストボックスをつくり、 テキストボックスに文字を入力し、コマンドボタンを押すと、 A1にその入力した文字が出力されるようにしたいのです。 ただ、それだけなら、 Private Sub CommandButton1_Click() If txtbox <> "" Then If textbox <> IsNumeric(txtbox) Then Cells(1, 1) = txtbox Else MsgBox "文字で入力して下さい", vbCritical End If Else MsgBox "何か入力して下さい", vbCritical End If End Sub と解答はできたのですが、テキストボックスに文字を新たに入力し、 A2,A3,A4…とA1以下のセルに順次新しく入力内容が表示されるようにしたいのですが、 どうしたらいいでしょうか?
864 :
デフォルトの名無しさん :2006/11/01(水) 17:48:01
なんか、タブキーを使ってしまったため、かなり見づらくなってしまいました。 Private Sub CommandButton1_Click() If txtbox <> "" Then If textbox <> IsNumeric(txtbox) Then Cells(1, 1) = txtbox Else MsgBox "文字で入力して下さい", vbCritical End If Else MsgBox "何か入力して下さい", vbCritical End If End Sub
>>863 ここは宿題をやってもらうスレじゃないぞ。
>If textbox <> IsNumeric(txtbox) Then
そもそもココ大丈夫?
あとは
>>846 を応用すればおk
>>865 スマセン、重要なヒントがすぐ上にありましたね。
なにぶんてんぱり過ぎてて、余裕がなかった。
ただ、VBA初心者向けのスレもないんで、
ここで宿題っぽい質問をしてしまうのは仕方ないとは思うんですが。
867 :
デフォルトの名無しさん :2006/11/01(水) 18:49:18
パラメータ(アーギュメント)を持っているマクロを、Call文でなく、 キーボード操作(マクロ→実行のような)で、パラメータを指定して 実行する方法があれば、教えて下さい。
sub aaa() bbb inputbox() end sub
869 :
デフォルトの名無しさん :2006/11/01(水) 19:51:53
>>867 Call を使用したくないのは何故?
アーギュメントは一定なのか?
または、いつどこで決定される?
割り込み質問スマソ VBEのウォッチウインドウと実行中のフォームって一画面中に並べて表示させることって可能ですか? フォーム実行中の変数の値を画面を切り替える事無く追いたいのです。
アプリとVBEのウィンドウを小さくしとけばいーんじゃね?
872 :
870 :2006/11/02(木) 01:32:32
>>871 ありがとうございます! 考えも尽きませんでした。
>>872 >考えも尽きませんでした。
思考の無限ループという感じがしてワロタ。
874 :
870 :2006/11/02(木) 14:08:44
再起動してください
876 :
867 :2006/11/03(金) 10:50:39
>>869 レスありがとうございます。
実行時にパラメータを与えたいためです。
マクロのソースを修正して実行すれば良いことですが、
できれば、実行指示の操作をキーボートから行う時に
パラメータで指定できればと思って、
質問しました。
1/3しか質問に答えてないね。 ってことは放置でいいか。
878 :
デフォルトの名無しさん :2006/11/03(金) 11:42:27
>>876 まあ、なんとなくわかった。
キーボードで、パラメータ入力→マクロショートカットキー実行
てな感じで実行したいわけかな?
単にマクロにinputboxでも仕込むとか、実行後にユーザーに問えば良い気がするけど
どんなマクロを想定してるのか
マクロを修正したくないならもう一つマクロ作って そこから呼び出せばよいのでは? ちょっと強引だけど 空ユーザーフォーム作ってKeypressとかでキー受け取って。
880 :
デフォルトの名無しさん :2006/11/04(土) 01:20:46
EXCEL2003で図を選択した状態で動かすマクロを作ったのですが セルを選択した状態でこのマクロを動かすとエラーが出てしまいます。 マクロの頭に「もし図を選択しているなら」と条件をつけたいのですが、 どのように書けばいいのでしょうか?
>>880 図は特定のものでしょうか?また、エラーが出るのは.selected等を使ってるから?
もう少し詳しく書いてくれたほうがうれしいです
882 :
876 :2006/11/04(土) 18:39:57
>>みなさん レスありがとうございます。 キーボードからパラメータ与えるのはできないようですね。
出来るけど、882は何か勘違いしてると思う。
884 :
880 :2006/11/04(土) 20:46:26
>>881 マクロスタート時に"図を選択していること"を前提にしているので、
マクロの頭は「ttt=Selection.Top」や「nnn=Selection.Name」など
選択している図の位置やサイズ・名前を取得するようなものから始まっています。
エラーは図ではなくセルを選択した状態でこのマクロを動かしたときに起こるもので、
「nnn=Selection.Name」と名前を取得しようとするところでエラーが出てしまいます。
なので、マクロの頭に「もし図を選択しているなら以下の動作を・・・」という条件をつけて
セルを選択した状態では動かないようにしたいと考えています。
ACCESS総合でレスもらえなかったのでこちらに来ました テーブルにフィールドを追加したんですが フィールドリストにはでてるんですが、VBAではエラーになります 分かる方お願いします
886 :
デフォルトの名無しさん :2006/11/04(土) 22:52:56
ビジュアルベーシック2003.NETと2005は互換性ありますか?
スレ違い ここはプログラム開発言語Visual Basic、Visual Basic.NETシリーズのスレではなく Officeアプリケーションのマクロ言語VisualBasic for Applicationのスレ
888 :
886 :2006/11/05(日) 01:35:46
親切にありがとうございました。
>>885 本当にその質問でわかる人がいると思ってるのか?w
あんたの言うフィールドリストとはなんぞや?
テーブルのデザイン画面?
それなら当然追加したから見えるわけだ。
つまり問題はVBAのコードに問題があるわけだが
そのコードはあんたにしか読めない。
清田君はもういないから無理です。
>>885 です
原因は解りました
テーブルにフィールドを追加して、そのフィールドをフォームの
VBAで使用できますが、
サブフォーム付のフォームのVBAだと参照できません
回避する方法はあるのかもしれませんが
めんどくさいけど、新規で作り直します
>>884 超テキトーな解法
エラーになることを逆手にとって
ShapeにあってRangeにないプロパティ/メソッドを使ってエラーの場合は終了
On Error ResumeNext
Selection.Shapeにしかないプロパティ/メソッド
If Err.Number <> 0 Then
exit sub
end if
on error goto 0
Selection.Top
とか
× Selection.Top ○ ttt = Selection.Top
>>884 >nnn=Selection.Name
こういうのはTypeNameを使う
If "Range" = TypeName(Selection) Then
MsgBox "Range"
End If
すいません質問をさせてください。 環境はXP、Office2003です。 一つのシートにA1〜N1までのセルに数値が入っていて、その中のの数値の文字を結合して A1に出力する方法を考えているのですが、良い方法は無いでしょうか? マクロの記録でしのごうと思ったのですが、うまくいきませんでした。
sub AddCell() Dim intCell as integer , strOut as string For intCell = 1 to 14 strOut = strOut & cells(1,intCell).value Next intCell cells(1,1).vallue=strOut end sub こういう事でいいのかな?
ありがとうございます。 求められていた動作をしました。
897 :
895 :2006/11/06(月) 17:23:18
....よくよく考えてみたらワークシート上で済む問題じゃないのか?
済まないでしょ。 計算対象になってるA1セルに出力すんだから。
ExcelのVBAにおいて、A列にのみデータを持つ(sheet数は1枚の)ファイルを、text形式にて、両端に「"」をつけずに保存する方法を知りたいのですが、 何かよい方法はありませんか? よろしくお願いします。
ブックのメソッド使わないで、普通のテキスト出力を使って保存すればいい。 具体的なやり方はヘルプ見るなりググるなりして調べよう。
和民氏ね
902 :
899 :2006/11/08(水) 00:15:36
>>900 調べた結果わかりました。
Write♯ステートメントを用いればよいのですね。
ありがとうございました。
しかし、openステートメントでファイルを開くので、ファイル名の一部に変数を参照して保存できないため、今度はそちらへの対処が必要となってしまいました。
どのような対処法があるでしょうか?
904 :
900 :2006/11/08(水) 00:18:27
openステートメントでも、開くファイル名の一部に変数を参照することができました。 早とちりで書き込んでしまってすみません。 ありがとうございました。
905 :
デフォルトの名無しさん :2006/11/08(水) 11:49:21
Word2003 のマクロ機能を網羅した書籍を紹介下さい。
いっぱいあり過ぎて困っちゃうw
907 :
905 :2006/11/08(水) 12:59:48
>>906 読みやすさよりも情報量を優先して選んでクリスマス
909 :
905 :2006/11/08(水) 14:56:58
>>909 情報後出しでは誰も答えてくれなくなるよ。
そういうヤツウザいので俺はパス。
911 :
905 :2006/11/08(水) 17:54:27
俺もパス つーか情報の量を求めてるのに英語NGって何だよ。 自分から、扱える情報の量を減らしてるだけじゃんw
UserForm1のImage1にビットマップを読み込んで, 座標ごとのRGBを調べることを考えてます。 Image1で,Pointが使えるなら,下のソースで 問題ないと思いますが,エクセルマクロでは Pointが使えません。 何か,手がありましたら教えてください。 Image1.Picture = LoadPicture("aaa.bmp") for i=1 to 100 for j=1 to 100 c = Image1.Point(i, j) r = (c And &HFF) g = (c And 65280) \ 256& b = (c And &HFF0000) \ 65536 next j next i
914 :
905 :2006/11/09(木) 09:55:04
>>912 なるほど、それはごもっともだと思いました。
それでは、和限定はなしでお願いします。
ほかによい本はございますか?
915 :
905 :2006/11/09(木) 10:01:44
雑誌と比べりゃ高いけど、専門書としてはそれほど高くないだろ。
まあなんにしても、君自身が買う価値を見いだせなければ買わなければ良いだけだが
単に情報量だけではなく、君が納得する情報量で、君が納得できる価格の本を教えろとか言われても
そんな感覚的なことは他人にはわからないから、それなら自分で探せって話になるよ。
つまり、
>>908 で納得できるなら勝手に買え、納得できないとかワガママ言うなら
あとは自分で探せってことでこれ以上教えることは何もないってことになる。
917 :
905 :2006/11/09(木) 11:09:37
>>916 でもなぁ、中途半端なのかって、結局使えなかったら、
無駄だしなぁ。
そう考えるのは自由だけど、何を紹介されたってその懸念は消えないよ。 紹介を信じて購入に踏み切れないなら、最初から他人の紹介など頼るなよ。 とにかくあとは自分で決定することだけなんだから、買うにしても買わないにしてもここで粘着する必要はないだろ。
わかってねーな。 買ってみて使えなかったら次の買うだけだろ。
920 :
905 :2006/11/09(木) 12:49:15
>>919 金がねーんだよ、死ね死ね詐欺のさくらちゃんに寄付しちゃったから。
921 :
905 :2006/11/09(木) 12:49:47
>>918 で、あなたはどんなVBAの本を持っているの?
紹介しなくてもいいから、その本教えて。
金ないんなら紹介しても買えないから意味無いな。
意味無いのに教えても 無駄だしなぁ。
924 :
デフォルトの名無しさん :2006/11/09(木) 16:52:20
(1)ページ番号を挿入し、(2)フッターを「1」から「第一部 1」に変更する、マクロを教えてください。
>>924 基本だが、マクロの記録を覚えろ。そういう問題は全て解決する。
>>924 黙って
>>925 に従え
エロエロ弄ってみれば、そのうち気持ちよくなってくるよ
そうやって覚えていくもんだから心配するな
927 :
924 :2006/11/10(金) 09:30:25
Selection.Sections(1).Footers(1).PageNumbers.Add PageNumberAlignment:= _ wdAlignPageNumberRight, FirstPage:=True このね、(X)っていうのをどうにか取り除いた書式にしたいのです。
すいません、マリオアドバンスが上手く動かないんですけど、 BIOSがないとやっぱダメなんでしょうか?
930 :
924 :2006/11/10(金) 14:15:10
まあ気付いてないからこそ勘違いしてるんだろうし
932 :
924 :2006/11/10(金) 14:42:18
セクション区切りとか、フッターは複数存在し得るとかのこと?
933 :
<sage> :2006/11/10(金) 14:52:28
みなさま、乙です。Outlook を VBA を使って、いろいろ試していますが、 分からないことがありますので、教えて下さい。 目的: リッチエディト形式で来たメールを返信をする際に、元々の送り主が書いた 文書の書式やスタイルを崩さずに、自分が書いた文書を挿入する。 問題: Body プロパティからメール本文を読み込んで、自分の返信内容をくっつけて、 Body にもどすと元々の本文に掛かっていた、書式がなくなってしまう。 コメント: ようするに何をやろうとしているかというと、Outlook ではなく別のエディタ で書いたメールの内容を返信に使いたいが、送り主の本文の書式を崩すこと なく、Body を構成できないか?ということ
934 :
デフォルトの名無しさん :2006/11/10(金) 15:54:31
おまえら、932に教えてやれば?? ググレいうのもわかるけど、せめて、ここ読んどけくらいのHP みしてやってもいいんジャマイカ?
>934 お前が教えてやれ。 俺?むしろ知りたい側だよ。
936 :
934 :2006/11/10(金) 17:00:52
>>935 早く教えてやれ!!っちゅーか、早く教えろ!
>>927 ワードオブジェクトだな?ヘルプみるなり、省略して実行してみるなり、
してみたその結果が全てだ。
これでいいかかな?
VBAのユーザーフォームで初期設定をした時に デフォルトでクリップボードの文字を挿入したいのですが 下の通り打ち込むとエラー424オブジェクトが必要ですと出てしまいます。 始めたばかりのため、無智な質問で恐縮ですが どこがどうおかしいのかどなたか御指摘頂けないでしょうか? すみませんが宜しくお願い致します。 Private Sub UserForm_Initialize() Dim ob Set ob = New DataObject ob.GetFromClipboard MyClip = ob.GetText UserForm.TextBox1.Value = MyClip End Sub
ユーザーフォームの名前を UserForm に変更してるの?デフォでは UserForm1 のはずだが。フォームモジュールに書く場合は、フォームオブジェクト省略出来るし。 つーか、このくらいなら知識なんか無くても普通にデバッグすれば、すぐに原因に行き着くだろ。 デバッグも出来ないのにコード書き始めるなんて、チェーンの付け方も知らずにノーマルタイヤで 雪国に乗り込むようなものだ。行き当たりばったりじゃなくて、最低限必要なことは先に覚えろ。 あと、それだとクリップボードにテキスト以外が入ってるとエラー出るから GetFormatでテキストかどうか調べてからGetTextした方がいいな。
>>939 ありがとうございます。 お陰さまで解決しました。
debug覚えてはいましたが、不注意で気づきませんでした。
941 :
デフォルトの名無しさん :2006/11/13(月) 15:28:31
弊社の開発環境は、VC#2005EE Word2003 WindowsXPSp2です。 納品先の環境は、Word2000 WindowsXPSp2です。 弊社の環境で作成したWordオートメーションソフトウェアが、 納品先の環境で起動できません。 なぜでしょうか。
943 :
941 :2006/11/13(月) 18:35:18
944 :
デフォルトの名無しさん :2006/11/13(月) 19:10:45
Windows XP、Excel2002です。 A1:C5など、指定したセルの範囲内をダブルクリックしたときに、 入力フォームを表示するにはどうしたら良いのでしょうか? A1などのセル単体の場合は Private Sub Worksheet_BeforeDoubleClick(...... if Target.Address = "$A$1" Then Form.show Endif End sub とすれば良いのは分かるのですが、あるセルの範囲内であるかを 条件判断する方法が分かりません。 どなたか教えて下さい。お願いします。
>>944 「範囲」が分散しているかどうかで話は変わるが、
文章を読むからに分散していないと仮定すると
if Target.Adress ...のところを
if 2<target.row or target.row<6
if 3<target.column or target.column<9
Form.Show
end if
end if
ってな感じが一番分かりやすいかも
分散しているなら配列かな?
このスレの100レス以内に似ているものがあると思う。
ちなみに上記の例だとC2:I6の間で反応するはずです
If Not Intersect(Target, Range("A1:C5")) Is Nothing Then Form.show End If の方が解りやすいと思うが。
949 :
944です :2006/11/13(月) 22:14:12
>>947 パーフェクトだ,ウォルター。
だがこのコードはもう私のモノだ。私だけのモノだ。
エクセルVBAでゲームつくる課題ができて○×ゲームやろうと思うんですが みなさんならどんな点が重要だと思うか教えてくれませんか? 環境はWinXP Home Excel2003です。 個人的には、 4手目からは1手目から順に消えていく とかできたら最高なんですが可能でしょうか?
>>951 バハムートラグーンなんかいいと思うんだ。
NTRも完備しているし。
954 :
942 :2006/11/16(木) 09:42:13
word2000とword2003の両方で一応は安全に作動するマクロの作成は、常套手段とかありますでしょうか。
うん
つうか納品先の環境に揃えて開発しようよ・・・
出会ったな…この私に!
959 :
デフォルトの名無しさん :2006/11/18(土) 12:41:10
セルが入力済みかどうかを調べるにはどうしたらいいでしょうか? ただし読みやすさを考慮して、 以下のような最初に空白の場合のプログラムを書いて、後に入力済みの場合のプログラムを書く方法じゃなく 最初に入力済みの場合、後に空白の場合という順番で書きたい if range(*).value = "" then 〜←ここが長いのでif節が長くなってしまい読みにくい 〜 〜 else 〜←ここは短い end if
960 :
デフォルトの名無しさん :2006/11/18(土) 12:52:48
>>959 ?・・・
> if range(*).value = "" then
↓
> if range(*).value <> "" then
・・・こう?
961 :
デフォルトの名無しさん :2006/11/18(土) 14:36:43
>>960 すげぇ!できた マジサンクス!
不等号そーゆーふうに使えんだな
ほかにもif not range(*).value = "" thenとかもすぐに思いつく。
ゲッターッ |┃三 `、 - 、_ _,. マ |┃三 `ヽ、~` - 、_ , -──、._,. - ' / |┃三 \ i' l´l l⌒l l`i / |┃三 \ |⊂⊃~⊂⊃|_ / そんなことより石川賢が死んだんだが |┃三 ⊂) ). ロ l⌒l ロ|)⊃ |┃三 ヽ.iコ `-´ ri/| |┃三 , '⌒ ヽ_,. -/ヽ._,.旦,_ン. .| , - 、 |┃三 ,. - '~`ヽ `ヽ、 :|, -~──'── 、_ |┃三 >-─-、 | , -─-、. `──── ` ヽ |┃三 , ' |::| | | | ,───、 / ̄ ̄ヽ i_.
excel のvbaに関しての質問なんですが、 chdirステートメントによって、カレントフォルダをネットワーク内の他のPCのフォルダに設定したいのですがうまくいきません。 ChDir "\\PC名\・・・・・" とやっているんですが。 上記が間違っているのでしょうか?それとも、この方法では仕様上不可能ということなんでしょうか? ちなみに上記""内+ファイル名によって、openメソッドでファイルを開くことは出来ています。
>>964 ネットワークだとできない気がした。APIのSetCurrentDirectoryあたり使うのが定番だったような・・
あいまいでスマンが
966 :
デフォルトの名無しさん :2006/11/18(土) 19:51:45
>>962 notはそこにつけるのかorz
=の後につけて試してはみてた・・・
もう一個質問していいですか?
"〜.xls"という名前のファイルが開いてるかどうか調べるのはどうすればいいんでしょうか?
>>966 一つの方法として、Application.Windowsコレクションをfor eachで
これでピンとこないなら調べれ。
コレクションをループさせるのはけっこう重要だから試行錯誤で身につけときな
968 :
デフォルトの名無しさん :2006/11/18(土) 20:22:08
自己解決しました
>>967 さん、早々とレスありがとうございました
やっぱfor eachでしたか
For Each wb In Workbooks
If wb.name = book2 Then
MsgBox "すでに" & book2 & "を開いてるよ!" & Chr(13) & _
"一旦閉じて!", _
vbExclamation
Exit Sub
Exit For
End If
Next wb
>>965 その通りにしたら出来ました。
ありがとうございました。
970 :
959 :2006/11/20(月) 15:54:31
Wordに FAFQR235GGT3GEGATAITII32T2AT ATATWTATATATATAT23T23T23T2T2 2QWTHGQQPQOHYLKJSLGHIJIL4JTI AFGAFGEWGAGAWEGA このよう長い文字列があります。(実際もっと長いですが) 外部のファイルに書いてある数字のリストに沿って、この文字列の特定の位置を赤色なり青色なりで 装飾したいのです。 5 34 80 のように書いてあるファイルだとすると、5番目の文字から5文字を装飾、34番目の文字から5文字を 装飾していきたいのですがVBAだとどのように記述すればよいのでしょうか? よろしくお願い致します。
971 :
970 :2006/11/20(月) 15:57:28
すみません。959ではありません。
>>970 マクロの記録録ってちょこっと書き換えれば出来る。
973 :
970 :2006/11/20(月) 16:03:39
>>972 すみません。マクロの記録とは??
外部ファイルだと記録できないのでは?
テキストの読込みくらいはいくらでもサンプルがあるから解るだろ。 記録を録るのは色付け部分。 読み込んだ値を変数に入れて置いて、記録を録ったものに被せればいい。 なんにしてもあーだこーだ言う前に、まずはやってみろ。
excelに関しての質問です。 選択されているセルの列番号を数字でなくアルファベットで返す方法を探しています。 そのためにコードを書いてしまえばそれで終わりなのですが、すでに用意されているなら毎回それを書くのがすごく無意味なので・・・ エクセルVBAにそれが用意されているようなら教えていただけませんでしょうか。
>>975 オリジナルな関数を用意するしかないと思うな。
列のアルファベットのみ知りたいの何故かな?
functionで書けば毎回まあそう手間はないが
1からn行を全て選択したいんですが、 Rows("1:n").Select としても型が一致しないっていうエラーが出てしまいます。 どうすれば選択できますか?
文字列と変数を区別しろ
例えば、A1〜A10に値が入っていてA11に値が入っていないとして、 Do until Cells(i,1).value = "" i = i + 1 Loop とし、その後で 1からi行全て選択したいわけです。 どのように記述すればよいですか?
文字列と変数を区別しろw 変数を""中に入れずに文字列としてくっつける。
リテラル(?)を外すってことですか? Rows(1:n)〜 にすると違うエラーが、、、(´つω;`)
誰が文字列まで文字列扱いするなと言った? 区別しろと言ったんだ。文字列は文字列として、変数は変数として扱えと言ったんだ。
う〜〜ん(´・ω・`) Rows("1":n)も駄目ですよ、、、 Rows("1:11")ってのが出来るわけだから、 Rows("1":n")、、、? こんな記述見たことねぇ(;´д`) あぁ手元にPc無いのが残念です
変数を文字列として扱うのが問題なんだから、 変数の内容を文字列に変えてから、外側の文字列と連結しろよ。 文字列の連結は知ってるか? "文字列1" & "文字列2"ってヤツだ。 変数の内容を文字列にする関数は知ってるか。str(変数)だ この関数、こういう使い方の時にはちょっと問題があって、 数値を文字列にするとき、先頭の一文字を符号用に予約してしまう。 負の数ならマイナス、正の数ならスペース(空白)だな。 だから、符号を除去する必要があるわけ。 文字列の先頭から2文字目以降を得る。には、mid関数を使え。 最終的には、 Rows("1:" & mid( str( n ), 2 ) ) かな。
> この関数、こういう使い方の時にはちょっと問題があって、 問題ではなく利点だ。そういう仕様が不都合な場合はCStr関数使えば良い。 Str関数を使うのは、スペースが確保された方が都合が良いときだけなので Str関数を使う上でスペースが入ることが問題になることはあり得ない。 それとVB・VBA言語は文字列型変数への代入や、&演算(連結)を行うと、自動で文字列変換を行う。 Debug.Print TypeName(1 & 1)
>>984 ー985さん
非常にわかりやすい説明ありがとうございました。
全く思いもよらない方法でした(´・ω・`)勉強しなおします
A1セルに「あいうえお」 A2セルに「かきくけこ」と入力してあって、A1セルをクリックすると B1セルに「あいうえお」 A2をクリックすると B1セルに「かきくけこ」と入力するような マクロを考えています Excel2002使用しています いまは、ダブるクリックすると起動する プロシージャで対応していますが、 ワンクリックで行いたいのでよろしくお願いします
989 :
デフォルトの名無しさん :2006/11/22(水) 23:05:36
スレ違いなうえにマルチで、しかも発言内容自体もマナーをわきまえてないとは ある意味スゴイですねw
>987 >988のリンク先 >773 に加えて、 表示直後にB1セルをアクティベート(セレクト)したら、 773中に書かれてる問題の半分が解決するんじゃね?
ExcelのVBAでDOM使ってXML書き出すプログラムを作ってます。 で、標準の文字コードがUnicodeのため、XMLファイルもUnicodeで出力されてしまいます。 これをShift-JISで出力したいのですがどうすればよいのでしょうか? DOMリファレンスで見た限りメソッドにもそれらしいものは見当たらなかったのですが。。
マルチ必死だな。
995 :
992 :2006/11/23(木) 01:18:28
ども。すんませんでした。
996 :
デフォルトの名無しさん :2006/11/23(木) 03:56:24
単精度浮動小数点数型 Single型って何なんですか? これで定義した配列に数値を入れてセルに書き出すと数値が変わるんですが。 試しに 20061122 20061121 20061120 20061117 20061116 20061115 20061114 っていう数値を配列に入れて何も処理をせずにセルに書き出すと 20061122 20061120 20061120 20061116 20061116 20061116 20061114 こうなって出てきます、これは一体何が起こってるんでしょうか? すごく困ってます。
>>996 単精度の仮数部は10進数だと6桁ぐらいしかない。(2進数で23桁)
それ以上の桁は記録できない。
@
999
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。