1 :
デフォルトの名無しさん :
04/03/02 09:36
よゆうで2げっと  ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ 。 。 || || /⌒ ヽ. / ⌒ヽ( /⌒ヾ ) ((゚Д゚,,))ゝヽのノノ ⊂⊂ _____つ )) ))
3
通学時間をA2から読み取り 30未満「近い」 30以上60未満なら「普通」 60以上90未満なら「遠い」 90以上なら「超遠い」 と B2に表示 A1に通学時間 B1に判定 を表示 IF文を用いる と、いう問題を学校で出され、模範解答ももらったのですが Sub 通学時間() jikan = Cells(1, 2) If jikan < 30 Then hantei = "近い" Else If jikan < 60 Then hantei = "普通" Eles If jikan < 90 Then hantei = "遠い" Eles hantei = "超遠い" End If End If End If Cells(2, 2) = hantei End Sub で作るとどんな数値を入れても判定が「近い」しかでないのです… どなたか、きちんと動くようにアドバイスいただけませんか? お願いしますっ
6 :
デフォルトの名無しさん :04/03/02 12:04
>>5 ×:jikan = Cells(1, 2)
○:jikan = Cells(2, 1)
×:Eles(2か所)
○:Else
7 :
デフォルトの名無しさん :04/03/02 15:52
>>5 最近では、学校でVBAするの?
学校って、どんな学校?
単位もらえるの?
>>6 ありがとうございます。
おかげで動くようになりました。
>>7 はい、学校でやります。普通の学校で、単位ももらえます。
迷惑ついでにもう1つ詰まった問題をアドバイスいただけないでしょうか…?
10個の整数をA1〜A10から読み取り、それらのうちの任意の
i番目とj番目(iはA12、jはA13から読み取る)の値を交換し、変更後の10個の整数をB1〜B10
に表示する。ただし、配列を使うこと。
Sub 交換()
Dim a(10)
For k = 1 To 10
a(k) = Cells(k, 1)
Next k
i = Cells(12, 1)
j = Cells(13, 1)
x = a(i)
a(i) = a(j)
a(j) = x
For k = 1 To 10
Cells(k, 2) = a(k)
Next k
End Sub
9 :
デフォルトの名無しさん :04/03/02 19:42
>>8 ちゃんと動いたよ。
Rangeプロパティは知らない?
i = Cells(12, 1)
より
i =range("A12")
の方が問題文に近くてわかりやすいと思う。
A12とA13を入れ替えてどうするんだよ! Sub 交換() Dim a(10) For k = 1 To 10 a(k) = Cells(k, 1) Next k i = Cells(12, 1) j = Cells(13, 1) x = a(i) a(i) = a(j) a(j) = x For k = 1 To 10 Cells(k, 2) = a(k) Next k End Sub これでいかがですか? つーか通学時間のやつ、無駄にIfネストで使わずにElse If使ったほうがいいよ。 End If End If End If なんてやめれ。
あ、すいません。よく見たら同じ文になってた。 失敬。
12 :
デフォルトの名無しさん :04/03/02 21:08
>>10 >A12とA13を入れ替えてどうするんだよ!
(´д)ヒソ(´д`)ヒソ(д`)
13 :
デフォルトの名無しさん :04/03/02 21:24
14 :
デフォルトの名無しさん :04/03/03 10:14
セルの設定 A1:"=A2+A3" A2:"3" A3:"2" とします。 「up」と「down」のボタンを作り、 「up」ボタンを押すとA1の値を10倍 「down」ボタンを押すとA1の値を1/10 となるようなマクロを教えていただけないでしょうか?
>>14 収束条件が不足しているためマクロとするのは不可能です。
条件をはっきりさせてゴールシークを利用しましょう。
>>14 何がしたいのか分からんが、
CommandButton1が up
CommandButton2が down とする。
Private Sub CommandButton1_Click()
Range("A1") = Range("A1") * 10
End Sub
Private Sub CommandButton2_Click()
Range("A1") = Range("A1") / 10
End Sub
>>16 こんなときのSpinButtonやろ。
CommandButton使うより。
それだと、A2、A3を変えても、反映しませんね。
>>14 が何をしたいのかわからないけど、設計自体変えたほうが良さげ。
これでは? Public Val As Double Private Sub SpinButton1_SpinUp() Val = Val * 10 Range("A1") = Val End Sub Private Sub SpinButton1_SpinDown() Val = Val / 10 Range("A1") = Val End Sub Private Sub Worksheet_Change(ByVal Target As Excel.Range) If Target.Address = "$A$2" Or Target.Address = "$A$3" Then Val = Range("A2") + Range("A3") Range("A1") = Val End If End Sub
良さげですね。 ただ、Val←関数名と同じ変数名は避けたほうがいいかもね。
age
EXCEL でフォームやVBAを使用し4MBにものぼるプログラムを作成しています。 あまりに大きくなりすぎたので、EXCELブックを最適化したいと思っています。 フォームやモジュールを全てエクスポートし、 解放したあとインポートし直す事によって ある程度サイズ縮小が出来るというところまで分かったのですが、 毎回するのは大変なので、 それを自動で行ってくれるマクロとかプログラムを探しています。 誰か作った方はいませんか? もしいましたら、そのPGを分けていただけませんか? もし他にも最適化する方法をご存じの方はご教授ください。
VBEのVBComponentsをまわしてInport/Export
表を読み取っていろんな関数で内挿までできるマクロって誰か教えてくださいませんか?
25 :
デフォルトの名無しさん :04/03/09 10:24
初歩的質問ですいませんVBAのマクロで 強制的にあるセルにフォーカスをセットさせたいのですが どうすればよいでしょう?
27 :
デフォルトの名無しさん :04/03/09 22:27
質問です。 特定のセルの内容が、数式なのか、それとも直接値なのか、 見分ける方法はないでしょうか? たくさんのシートを持つブックの中に、所々に合計シートが入っていて、 他の複数のシートの合計値を保持しています。 その合計シートを見分けたいのです。 合計シートと単体のシートのレイアウトは全く同じですが、 特定のセルのデータが、合計シートは数式、単体のシートは直接値なのです。 どうかよろしくお願いいたします。
28 :
デフォルトの名無しさん :04/03/09 22:41
>>27 Left(Range("A1").Formula, 1) = "="
29 :
デフォルトの名無しさん :04/03/09 22:42
VBAでコントロールコードを表示(?)させるには? debug.print でイミディエイトウインドウ内で上下左右にカーソルを移動させたい。
>>28 うまくいきました!大変ありがとうございます!
Excelのマクロの記録でコンボボックス貼り付ける処理を記録すると下のようなコードができるんですけど、この処理以降でステップ実行が利かなくなります。 ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _ DisplayAsIcon:=False, Left:=255, Top:=57, Width:=161.25, Height:= _ 44.25).Select ステップ実行していくと↑の処理以降で「中断モードでは入力できません。」ってメッセージがでてデバックも何もできない;; だれか解決方法知ってませんか?
32 :
デフォルトの名無しさん :04/03/10 20:43
ExcelのVBAなんですけど、セルをアクティブにするとき activateとselectとの使い分けってみなさんどうしてますか?
33 :
デフォルトの名無しさん :04/03/11 04:36
すいません。うpしておきました。
セルD4に「不明」という文字が挿入された場合の処理が解らないんですが・・
↓これをどこに入れればいいの?
If IsDate(Range("D3").Value) Then
If IsDate(Range("D4").Value) Then
If IsDate("不明") Then
If IsDate("不明") = False Then
MsgBox "日付データではありません"
ttp://ptba2.hp.infoseek.co.jp/cgi-bin/up/bbs.cgi [No,2395] だめぽ
教えて君 [2004/3/11(木) 午前4:31:37]
どうやったらいいの?
>>33 (1) [ALT] + +[F11] で VBエディタを起動。
(2) プロジェクトの Sheet1 をダブルクリック
(3) 下記コードをコピペ。
(4) D列の値を変更すると、日付かどうかチェック。
日付値と"不明" と "" 以外は警告して入力値を消去する。
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Column <> 4 Then
Exit Sub
End If
If IsDate(Target.Value) = False Then
If Target.Value <> "不明" And Target.Value <> "" Then
MsgBox ("日付データではありません")
Target.Value = ""
End If
End If
End Sub
37 :
デフォルトの名無しさん :04/03/11 20:23
VBAでPerlのsort関数のように 配列の中身でソートする関数はありませんか?
38 :
デフォルトの名無しさん :04/03/11 22:01
Accessでオートナンバー型をやめて Dmaxを使った自動採番にしようと思っているのですが、 分からないので質問させてもらいました。 挿入前処理で H16-0001といった風に番号をつけたいのですが、 ハイフンを入れることもできるのでしょうか? できるとするなら、コードを教えてください。 それと以前、自動採番に挑戦したとき、 テーブルのデータが何もなしの状態で Dmax+1を使用したら、番号がつきませんでした。 テーブルデータがない場合の対策も教えて頂きたいです。 よろしくお願いします。
マルチ、ウザッ
40 :
デフォルトの名無しさん :04/03/12 15:26
Excel2002にてコマンドボタンのVBAを記述しました。 ---- Private Sub DBTrigger_236_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ActiveSheet.Cells(4, 54).Value = "1" ' End Sub Private Sub DBTrigger_236_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ActiveSheet.Cells(4, 54).Value = "0" End Sub ---- このような記述をボタンの分だけ作成しました。 ボタンは1シートに10個ほど作成してあります。 このとき、いづれかのボタンを押す度に全てのコマンドボタンの表示がちらつく のですが、何か対策はありますか?
Perlのスレで質問したのですが、VBAに詳しい人に聞いたほうが良いと言われたので 同じ質問で申し訳ないのですが、よろしくお願いします。 perlで使用するWIN32::OLEについて教えて下さい。 PowerPointでグラフを作っているのですが、 グラフの軸の部分の目盛間隔の設定がうまくいきません。 $Chart->Axes(xlValue->{MajorUnitIsAuto} = FALSE; $Chart->Axes(xlValue->{MajorUnitScale} = 0; $Chart->Axes(xlValue->{MajorUnit} = 10; と指定すると、 目盛間隔の自動は外れ、単位は「日」になるのですが、 肝心の数値部分が10になりません。 10日単位の目盛にするにはどうすればいいのでしょうか? 宜しくお願いします。
>>41 Perl経由じゃなく、VBAだけで試してみてもダメ?
>40 マクロ処理中は画面の更新停止するようにしてみたら?
>>42 すみません、VBA自体使うのが初めてで、VBとかもほとんどやった事がなくて
ソフトも入っていないんですが、
VBがインストールされていなくてもVBAだけっていうのは出来るんですか?
PowerPointがインストールされているならVBAもはいってる
>>34 そっちの域には達してないようです。
これで解決できました。
ごめんなさい。
Sub s_1()
If IsDate(Range("D4").Value) Then
End If
If IsDate(Range("D4").Value) Then
End If
If IsDate("不明") Then
End If
If IsDate("不明") = False Then
MsgBox "日付データではありません"
End If
End Sub
VBAのマクロのパスワードを解除するマクロカッターなるものが あるそうですが、どういう風にしてパスワードを解除してるのか 知ってる人がいたら教えて。 また、本当に解除できるのかも教えて。
48 :
デフォルトの名無しさん :04/03/14 13:09
範囲選択の方法で Range("A1,B2,C3").Select とすると3つのセルが選択できますけど これをR1C1方式で記述するにはどうすればよろしいでしょうか?
49 :
デフォルトの名無しさん :04/03/15 14:39
Excel2000を使用して、以下の事を実現しようとしているのですが、 教えてください。 ・セルの移動を行う ・セル移動のイベントを拾う ・移動前のセルのアドレス(A1とか)を拾う ・移動前のセルの情報を取得して、該当セルであれば、操作を行う。 です。 セルが移動したときのイベントの拾い方が分からないのです。 知っている方いらっしゃいましたら、ご教授お願い致します。
50 :
デフォルトの名無しさん :04/03/15 14:50
UNIXのコマンド郡をVBScriptでリプレースするプロジェクトとかどっかにないのかね。
>>49 Worksheet_SelectionChange(ByVal Target As Excel.Range)
>>48 こういうこと?
Application.Union(Cells(1, 1), Cells(2, 2), Cells(3, 3)).Select
Rangeの引数はA1形式限定なので、Cells(行,列)をUnionでくっつけてます。
自己解決しました Private Sub Worksheet_Change(ByVal Target As Excel.Range) で、セルが修正されたイベントを拾うことが出来ました。
54 :
デフォルトの名無しさん :04/03/16 21:48
シートにコンボボックスのあるブックを開いて閉じる時に ページ違反で強制終了されます。 解決法はないでしょうか?
55 :
デフォルトの名無しさん :04/03/17 15:21
今、友人が作ったVBA(EXCEL)をもらって勉強をしています。 早速実行して、実感してみようと思ったんですが Dim aaa As OraSession ← の所で止まって コンパイルエラーと出て内容が プロジェクトまたはライブラリが見つかりません と表示されました。 これは参照設定が足りないんでしょうか? もし追加をするとしたら何を追加したらいいんでしょうか? 宜しくお願いします。
56 :
デフォルトの名無しさん :04/03/17 20:41
ある列の値が入力されている最後の行まで一つずつセルを進めながら 処理をするというループを考えているのですが、分からないので 力を貸してください。 その列の中には空白のセルもいくつかあるので Do While Activecell.Value <> "" 〜 Loop というのはできません。よろしくお願いします。 Range("A1").Select Do While ??? 'ここに何らかの処理 Activecell.Offset(1,0).Select Loop
>>55 参照設定で参照不可になってるヤツがないですか?
>>56 Range("A65536").End(xlUp)でとれるRangeオブジェクトがA列の一番下のセル
>>55 Oracleのクライアント入ってなきゃ動くわけねえべ。
その友人はどういうつもりでそのファイルを渡したのか。
60 :
デフォルトの名無しさん :04/03/18 22:29
shellで起動をかけたアプリケーションの終了を待って 続きを実行する方法を教えてください。
>>61 問題解決できました。
とても参考になりました、ありがとうございます。
追加 ※参考 Test.batを実行後DOS窓を閉じる dim tmp tmp=Shell("Command.Com /C C:\test.bat",6)
仕事で、申込書(excel)に基づいて契約書(word、約15ページ)を作っています。 申込書から転記するだけの項目が17箇所もあり、いずれの項目も長文の英文なので、 できれば申込書にマクロを組みこんで、契約書を自動作成したいと思っています。 が、 @エクセルのマクロからワードを立ち上げられない Aコピペ先(=契約書の該当部分)がうまく指定できない という問題にブチあたっています。 申込書はwordファイルに変えてもいいのですが、 そうすると、申込書のコピペ元もうまく指定できないような気がします。 また、場所をうまく指定するにはフォームを使えばいいような気がするのですが、 フォームの入っている文書はうまくマクロが機能してくれません。 いかにも素人の質問で恐縮ですが、いい解決策はあるでしょうか? よろしくご教示ください。
65 :
デフォルトの名無しさん :04/03/19 05:58
>64 ExcelからWordへ転記する箇所は、1対1でしょうか? そうであれば、ワードの「差し込み印刷」を使えば良いでしょう。 >また、場所をうまく指定するにはフォームを使えばいいような気がするのですが、 >フォームの入っている文書はうまくマクロが機能してくれません。 ↑この部分だけ、意味がまったくわかりませんでした。 主に”フォーム”が何を指しているのかわかりません。 (実際に)何をどうしたら、どのようなマクロがどう動かないのでしょう?
ありがとうございます。というか不明瞭ですみません。 >ExcelからWordへ転記する箇所は、1対1でしょうか? >そうであれば、ワードの「差し込み印刷」を使えば良いでしょう。 同じ内容を2度繰り返す項目、3度繰り返す項目があります。 また、できた契約書はwordファイルで海外に送付し、 内容について顧客と交渉を行うため、 契約書が1つずつファイルで作成される必要があります。 >↑この部分だけ、意味がまったくわかりませんでした。 >主に”フォーム”が何を指しているのかわかりません。 >(実際に)何をどうしたら、どのようなマクロがどう動かないのでしょう? すみません。×フォーム ○フィールド です。 私が試したのは、申込書をwordファイルで作り、 契約書、申込書それぞれのコピペする部分にだけ入力可能なように フィールドを作り、保護をかけた上でマクロを記録しました。 全然動きませんでした。 難しいことをやろうとしているのでしょうか?
67 :
デフォルトの名無しさん :04/03/19 23:41
変数の代入がうまく出来ません。 D3:test.bat など D3はコンボボックスになっていて いろいろ選択出来るように指定してあります。 以下のような感じで出来そうだと思っていますが 変数がうまく代入できません。 Set apr = Range("D3") Shell("c:\tools\bat\"ここからtest.batを動かしたいのでaprを代入したい) どうやったらうまく動くのでしょうか?
68 :
デフォルトの名無しさん :04/03/20 11:04
>>64 1契約書をテキストファイルで保存
2Excelからそのテキストファイルを開く
3挿入したい位置まで読み込む
4挿入する
以下、3と4を繰り返し、テキストファイルで再保存する。
ワードを立ち上げ再保存したテキストファイルを読み込む
あとは、マクロの自動記録で書式を設定する
こんな流れで以下に作ってみました。
69 :
デフォルトの名無しさん :04/03/20 11:05
Sub test() Dim strTxt2() '契約書をtest.txtでテキスト保存します Open "c:\test.txt" For Input As #1 Do While Not EOF(1) Line Input #1, strTxt ReDim Preserve strTxt2(i) '1行ずつ配列に入れます strTxt2(i) = strTxt i = i + 1 Loop Close #1 i = 0
70 :
デフォルトの名無しさん :04/03/20 11:06
つづき '申込書が含まれるファイルを作成します Open "c:\test2.txt" For Output As #1 '配列の数だけ繰り返します For i = LBound(strTxt2) To UBound(strTxt2) Select Case i + 1 '申込書データを挿入したい位置です Case 1 Print #1, strTxt2(i) & Sheets(1).Cells(1, 1).Value Case 3 Print #1, strTxt2(i) & Sheets(1).Cells(3, 1).Value Case 5 Print #1, strTxt2(i) & Sheets(1).Cells(5, 1).Value Case Else Print #1, strTxt2(i) End Select Next Close #1 End Sub
>>64 契約書.Docに[%01]という形式の置き換え先指定文字列が入っているとして
Sub ReplaceExcel2Word()
Dim wda As Word.Application
Dim wdd As Word.document
Dim idx As Long
'ワード起動
Set wda = GetObject(, "Word.Application")
wda.Visible = True
’ファイル起動
Set wdd = wda.Documents.Open("契約書.Doc")
wdd.Activate
'検索して置き換え
With wda.Selection.Find
For idx = 1 To 10
.Text = "[%" & Format(idx, "00]")
.Replacement.Text = Cells(idx, 1).Value
.Forward = True
.Execute Replace:=wdReplaceAll
Next idx
End With
End Sub
>>67 Shell("c:tools\bat\" & apr.Value)
73 :
デフォルトの名無しさん :04/03/20 21:17
あの、Filterプロパティって、複合条件の結果を代入することはできないんですか? ひとつならいけるのに下のようにandでやると型が一致しませんと言われます。 Me.Filter = "[FEE] >=" & frmF And "[FEE] <=" & tF
>>73 どのクラスのプロパティを指しているのかを書け。
その例では文字列同士が同じだったらTRUEを代入することになる
Me.Filter="[FEE]>=" & frmF & " AND " & "[FEE]<=" & tf
>>68 ,71
ありがとうございます。
会社で試してみます。
77 :
デフォルトの名無しさん :04/03/23 09:18
EXCELでSAVEASを使ってシートをセーブすると、Bookの名前とファイルタイプが シートをセーブした名前に変わります。 変わらないようにしたいのですが、何か方法はないですか? 今はBoockの名前をBookのSaveasでもとに戻していますが、2重にセーブになります。
あ、EXCEL2000です。
80 :
デフォルトの名無しさん :04/03/23 13:19
>79 ありがとう。気がつきませんでした。
81 :
デフォルトの名無しさん :04/03/23 14:51
みんなクラスモジュールってどのくらい使ってますか? 俺はUSERFORM2の設定情報をINIファイルとやり取りする インターフェイスというか、データの仲介者というか そんな感じでしか使ってない。
>79 だめです。SheetにはSaveCopyAsもCopySaveAsもありません。 あー、めちゃ喜んだのに。残念。
テンボラリなbookを作ってsheetをコピーしてから保存すればいいんでは?
>83 あ、そうですね。それはいいアイデアですね。やってみます。 VBAは初めてなんですが、難しいですねー。 FrameにCommandボタン3つ並んだだけの簡単なOCXを作ってEXCELの シートに貼り付けたのですが、2回クリックしないと、EVENTが発生しないんです。 VBでテストすると問題ないのですが、Sheetに貼り付けたときは、 一回目のクリックではフォーカスが移るだけで、EVENTが出ないんですよ。
>83 うまくいきました。ありがとう。 ちなみに sub CommandButton1_Click() Workbooks.add 1 dim w as workbook set W = Workbook(Workbooks.Count) Me.copy W.worksheets(1) W.Worksheets(1).SaveAs "aaa.txt", FileFormat:= xlTextPrinter W.close savechanges := True Set W= nothing end sub ふう。
86 :
デフォルトの名無しさん :04/03/24 00:32
>86 冷たいと言うより答えようが、、、、 77も未熟ものだから、答えても参考にならんかも。 VBAは使ってみて、色色難しいなと思う。 クラスモジュールやOCXはバグに悩まされると思う。今回 簡単に使っただけで、相当悩んだ。VBでは全然問題ないのに Sheet上で使うと問題がでる。動作はするけど、デバッグで ブレークすると、メモリーから飛んでしまう現象もあった。 そこで、自分なりに結論をだした。 VBAはグローバル「が」スタンダード。 つまりグローバルガスタンダードプログラミングがもっともいい。 この方法は関数などはすべてmoduleごとに分類して、modXXX.bas modYYY.basというように、モジュールを山のように並べてプログラミング する方法。 これは構造が簡単なので、言語側のバグの影響がもっとも少ない。 逆にユーザー側のバグは最も多くなるが、そこは注意力と粘りで解決する。 VBAグローバルガスタンダードプログラミングをためしてみてください。 VBAに限らず、バグの多い言語では非常に威力を発揮するはずです。 あまり高度なことを望むと腹が立つだけ損です。 何事もあきらめが肝心。あきらめたとたんにEXCELがとても便利な すばらしいプログラミング環境であることがわかりました。
88 :
デフォルトの名無しさん :04/03/24 22:18
初歩的な質問で申し訳ないのですが、 〜〜〜〜 ActiveCell.FormulaR1C1 = "=b4" 〜〜〜〜 と入れると、セルの中身が='b4'となってしまいます。 これを避ける方法はあるのでしょうか。
まぁ、ワークシートやユーザーフォームもクラスなわけだし つうか、カプセル化すると必然的にクラスモジュールを使うようになる グローバル変数をそこらじゅうに書き散らしてあるプログラムなんぞ読みたくない とはいえVBAは列挙型を公開できないのでつらいものがあるのは事実
>>88 ActiveCell.Formula = "=B4"
92 :
デフォルトの名無しさん :04/03/25 00:20
VBA歴1日の超初心者ですが、ヤフーへの自動ログインマクロを 作って居たところ、input name=".save" となっていて、 "objIE.document.all..save.Click"と、 記述すると文法違反になってしまいます。 良い知恵はございませんでしょうか?
>>81 無視されたままでは気の毒なのであまり参考にはならないかもしれないけど
私が行ったことをお知らせします。
某金融系の仕事をしているのですが、ユーザーはEXCELで数値計算や
シミュレーションを行っています。
私が作ったのは、線形計算に用いられる行列などのクラス、
それから確率過程モデリングしたクラスなどです。
行列クラスなどは、継承が使えないで様々な行列クラスに対応した
演算関数と簡易版のどのクラスにも使えるお手軽演算関数の2本立てです。
誰もがメンテナンスを嫌がるのでちょっと後悔してます。
確率過程クラスは、そのカテゴリーのオブジェクト同士の演算はないので
そのような苦労はないのですが、乱数の生成を数種類のものを用意しなければ
ならないのですが、これは実行時に一度だけですむ事から、実行時の型参照
を行っていましたが、結局はj、各確率モデルごとに異なる乱数ルーチンバージョンの
クラスを作ってしまいました。
いずれも本格的な運用が始まるとDLL化して配布しています。
復活&無くなったログ貼り
94 名前:デフォルトの名無しさん 投稿日:2004/03/25(木) 15:12
>>89 >VBAは列挙型を公開できないので・・・
そうなの?
自分が違ってるかも知らないが、適用範囲のことですよね?
それとも外部にってこと?
95 名前:デフォルトの名無しさん 投稿日:2004/03/25(木) 22:00
質問です
複合化のソフトを使ってPAR→VBAという具合で変換したのに無効になってしまいます
なぜなんでしょうか?
詳しく教えてください
95 :
デフォルトの名無しさん :04/03/30 09:15
セルの書式設定で 数値、小数点以下2桁にしてますが、 0を入力するとスペースになって困っています。 そこでセルの書式をユーザー設定にして#0.00としてみましたがこれでも やはりスペースになります。 このシートはシートAですが、おなじような別のシートBでやると 正常に0.00と表示します。 セルの書式に何かが設定されているようなのです。ちなみに、色々な セルで試して見ましたが、そのシート全体がどうもおなじ反応をします。 シート全体で設定する何かがあるのでしょうか?どなたか教えてください。
96 :
デフォルトの名無しさん :04/03/30 09:21
VBAのコンパイルってなんなの? *.EXEとかができるのでしょうか? EXCELを立ち上げたときに初めてコンパイルエラーというのがでて、VBAで コンパイルしてみたら、バグがいっぱいあって、新発見でした。
>>95 なぜここに質問してくるかがわからんが。。。
オプションでゼロ値を表示しない設定になっとるから
とりあえずそのシートアクティブにしてコレでも実行しとけ
ActiveWindow.DisplayZeros = True
>>96 できるワケがない
コンパイルとはマシン語に翻訳することで EXE を作ることじゃない
VBA はインタプリタ言語で実行時にソースが順次コンパイルされて動作する
>97 じゃーVBAにあるコンパイルってのは、なんなの? したったらずのMSの名称バグってことね。では正確には 「マクロの文法チェック」でしょうか?
> なぜここに質問してくるかがわからんが。。。 あなたしか解決できない難問かもしれないし、、、、。 > オプションでゼロ値を表示しない設定になっとるから EXCEL2000ですが、TOOL>オプションには「ゼロ値表示しない」なんてのは ないような、、、、。 EXCELのバグだとおもうのだが。 > とりあえずそのシートアクティブにしてコレでも実行しとけ > ActiveWindow.DisplayZeros = True すごーい!!! いけました。 ありがとう。
失礼しました。ウインドウオプションにゼロ値というのがありました。 これは日本語のエラーで、正確には 「セル値がゼロのときゼロを表示する。」です。 しかもウインドウオプションっていう名称もおかしいですね。
最近はJavaや.NETの用に中間コードに変換することもコンパイルって言うよ。 インタプリタはソースコードを実行しながら機械語に変換するわけで、 ソースコードを中間コードに変換する作業はインタプリタとはちょっと違う。 中間コードを機械語に翻訳する作業の方がまだインタプリタと言える。
103 :
デフォルトの名無しさん :04/03/31 02:09
いやゴメン タダの見せ掛けだけみたい 起動ランチャみたいな感じの
Excel2k(VB6?)でCreateThreadってやっぱし落ちる?
106 :
デフォルトの名無しさん :04/04/01 23:13
ACCESSで、フォームにパソコン内のファイル選択用の参照ボタンを つけたいんですけど、簡単に作る方法ってあるんでしょうか? まさかプログラムで1件1件コンボボックスに追加して作るってわけじゃないですよね?
FileDialog
>>107 即レスありがとうございます!
ぐぐったらそれらしいのがヒットしたので、さっそくやってみます。
あ〜これで便利になりそう〜どうもでした!
109 :
デフォルトの名無しさん :04/04/02 00:19
VBAファイルって一度でも実行すると他のPCへのコピー時にエラーになる とかって良くあることなの?
110 :
デフォルトの名無しさん :04/04/02 19:31
Runメソッド使って別ブックのマクロ実行する処理作ってるんだが 別ブックで実行するマクロ処理を Sub RunTest(ID as string) 処理開始 ・ ・ ・ 処理終了 Thisworkbook.close End sub みたいな感じにしたら呼び出し元ブックで定義してる変数の中身が何故か 初期化されてしまったんだけどこれは何故かわかる人いますか? ちなみにThisworkbook.closeをせずにRunTest処理を終わらせてから ブックを閉じた場合は初期化されなかったんだけど。
指定パスのファイル名を各セルに表示させたいのですが知っている方いたら教えてください。
>>111 A1 セルにパス(例えば C:\Windows)が書かれているとする。
B列にそのフォルダ内のファイル名を書き出す。
ただしサブフォルダと親および自分自身のフォルダは無視する。
下記のマクロを登録して実行する。
Public Sub FileList()
Dim fn As String
Dim i As Long
ChDir Range("A1")
i = 1
fn = Dir("*.*", vbArchive)
While fn <> ""
If Left(fn, 1) <> "." Then
Range("B" & i) = fn
i = i + 1
End If
fn = Dir()
Wend
End Sub
>>112 早速の返事ありがとうございます!
ドライブがc:\とf:\の2つあるのですが、c:\やその配下を見ようとすると必ずf:\のルートを
見に行ってしまいます。
f:\についてはサブフォルダの参照も問題ないのですが・・・
c:\を見に行くにはどうすればいいのでしょうか?
>>113 Dim i As Long のあとに
ChDrive Range("A1")
を入れてみてください。
116 :
デフォルトの名無しさん :04/04/05 23:59
checkboxesの引数の値がうまくできてないみたいで 以下の構文ですと、1行目で引っかかってしまいます。 excelのsheet1にオブジェクト名"checkbox1"でチェックボックスオンの状態にしてあります。 If Worksheets("Sheet1").CheckBoxes(1).chekcked = True Then Worksheets("Sheet1").Cells(1, 1).Value = 22
ExcelVBAのフォーム上でpictureなどのオブジェクトを ドラッグアンドドロップするにはどうしたらよいでしょうか? 無理なのかな?
118 :
デフォルトの名無しさん :04/04/08 19:31
Excelのsheet1に入っているデータをsheet2の3箇所にコピーし、 かつ、次のデータがその下に表示されるにはどうすればいいでしょうか? sheet間のコピーはできるのですが、データが上書きされてしまします。 どこを直せばいいのでしょうか? 下記のVBです。全部は長いので1部分ですが・・・。 Sheets("入力表").Select Range("N13:R13").Select Application.CutCopyMode = False Selection.Copy Sheets("計算書").Select ActiveWindow.SmallScroll Down:=15 Range("A25").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False If Range("A25") = 0 Then Range("A25").Select ElseIf Range("A26") = 0 Then Range("A26").Select Else Range("A25").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Select End If
119 :
デフォルトの名無しさん :04/04/09 00:29
Sheet1のA列に日々の観測データを記録しています。 現在セルA1〜A1000くらいまで1種類1000個のデータがあります。 未使用だったSheet2に、CommandButton1を置いて Sheet1のデータの算術平均値をSheet2のセルA1に表示するようにしてみました。 Private Sub CommandButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Sheets("Sheet2").Cells(1, 1).Value = "=AVERAGE(Sheet1!A1,Sheet1!A1000)" End Sub このとき、Sheet2のセルA2に"500"と入力してからCommandButton1を押すと Sheets("Sheet2").Cells(1, 1).Value = "=AVERAGE(Sheet1!A1,Sheet1!A1000)" を Sheets("Sheet2").Cells(1, 1).Value = "=AVERAGE(Sheet1!A1,Sheet1!A500)" と変えられるようにしたいと考えております。 Sheet2のセルA2の値によって、平均値の計算に使うSheet1のA列のセルの行数を 任意に変えたいと思うのですが、なかなか妙案が思いつきません。 よろしければアドバイスをお願い致します。
>>119 なんの観測データか気になって3行目以降読んでない私。
Sheets("Sheet2").Cells(1, 1).Value = "=AVERAGE(Sheet1!A1,Sheet1!A" & Sheet2.Cells(1,2).Value & ")" はダメですか?
はじめての裏技 ExcelVBA買いました 1890円ですた。 リファレンス型でなおかつ目的別にVBAが記載されてまして、ちゃんとコード例も載ってます。 なかなかいい感じの本なのでここに紹介をさせて頂きます。 御聴講ありがとうございました
>>119 すなおに計算。
Private Sub CommandButton1_Click()
Dim sum As Double
Dim i As Long
Dim n As Long
Sheets("Sheet2").Activate
sum = 0
n = ActiveSheet.Range("A2")
For i = 1 To n
sum = sum + Sheets("Sheet1").Cells(i, 1)
Next i
ActiveSheet.Range("A1") = sum / n
End Sub
Checkboxesって引数として変数を取ることはできないのでしょうか? 以下の構文ですとChecboxes(i)でエラーになります。 Dim i as Integer i = 1 If Worksheets("Sheet1").Checboxes(i) = True Then Worksheets("Sheet1").Cells(1, 1).Value = 22 End If
127 :
デフォルトの名無しさん :04/04/14 14:25
オートフィルタを仕様して、A列に「1」が入ってるものを抽出して 抽出したデータにだけ、B列に「2」と入れたいのですが、 どうすればいいですか?
128 :
デフォルトの名無しさん :04/04/14 15:24
EXELのVBAにて 単価(既定)と数量(ComboBoxで選択)にて合計(Select Caseで表示) を表示できるようにしたいのですが、ComboBoxで数量を選択しても合計値が リアルタイムで表示されません。 毎回、VBEの方でプレイボタン(実行)を押さないとワークシートに反映されません。 どうしたらよいでしょうか?
>>128 Select caseは制御構造で何かを表示したり云々な機能はないよ。
130 :
デフォルトの名無しさん :04/04/15 09:48
131 :
デフォルトの名無しさん :04/04/15 12:43
>>124 Sheets("入力表").Select
Range("N13:R13").Select
↑このN13:R13のデータを
("計算書")Sheetの
A25から始まって、順に下に表をつくるように
データを転記させたいのです。
気づくのに遅くなってごめんなさい!
>>131 Sheets("入力表").Range("N13:R13").Copy Sheets("計算書").Range("A25")
>>131 おっと、こーゆー意味か?
Dim i As Long
For i = 14 To 18
Sheets("計算書").Cells(11 + i, 1) = Sheets("入力表").Cells(13, i)
Next i
134 :
デフォルトの名無しさん :04/04/15 21:05
EXELにおいて、例えば textbox1に表示されたデータと全く同じものを 別のセルに表示させるにはどうすればよいのでしょう? 例えばtextbox1が[1000円]だったらD1も[1000円] textbox1が[2000円]に変わったらD1も[2000円]とリアルタイムに表示させたいのです。 どなたかよろしくお願いいたします。
135 :
デフォルトの名無しさん :04/04/15 22:36
textbox1のchangeイベントに range("D1").value = textbox1.value とかいう風にすれば テキストボックスの値が変わるとセルD1の値にも反映される
136 :
デフォルトの名無しさん :04/04/16 10:08
137 :
デフォルトの名無しさん :04/04/16 11:14
ワークシートの数が1つより多い時は1つにしたいのですが、 For i = 1 To Worksheets.Count - 1 Worksheets(2).Delete Next i とすると削除しますか?というダイアログがでてしまうので それをでないようにしたいのですが、なにか方法はあるでしょうか?
>>137 DisplayAlerts プロパティ
139 :
デフォルトの名無しさん :04/04/17 00:20
目次・索引を自動で取得するマクロを作りたいと思います。 キーワードを検索し、そのキーワードがあるセルのページ番号(印刷のページ番号)を 読み込みたいのですが、何かいい方法ないですか?
140 :
デフォルトの名無しさん :04/04/17 00:55
>>139 ちょっと文章が分かりにくい
もうちょっと詳しく書いて
ページ番号って対象のあるセルのあるシート番号ですか?
>>140 >ページ番号って対象のあるセルのあるシート番号ですか?
ちゃんと読んでやれ。
142 :
デフォルトの名無しさん :04/04/17 17:52
>>139 こんなんでいかがでしょうか。
Sub test()
'キーワードがあるシート
Sheets(1).Activate
ActiveWindow.View = xlPageBreakPreview
i = 0
For Each pb In Sheets("work").HPageBreaks
If pb.Type = xlPageBreakAutomatic Or pb.Type = _
xlPageBreakManual Then
ReDim Preserve lngRow(i)
lngRow(i) = Sheets("work").HPageBreaks(i + 1).Location.Row
i = i + 1
End If
Next
strMsg = "検索したい文字を入力してください"
strVal = InputBox(strMsg, "入力", "テスト")
'キーワードがある列
Set c = Columns("A:A").Find(strVal, LookIn:=xlValues, LookAt:=xlWhole)
c.Activate
lngRow2 = Selection.Row
For j = UBound(lngRow) To 0 Step -1
If lngRow2 >= lngRow(j) Then
Exit For
End If
Next
MsgBox j + 2 & "ページ"
End Sub
キーワードのある列をA列に限定してるけど、それでいいのかな? 限定しないとすると、VPageBreaks も拾ってやらんと行けなくなるけど。
VBでエクセルを立ち上げているのですが、ユーザーが勝手に EXCELを落として、VBがアクセスエラーすると「バグじゃー」と 騒ぎます。 EXCELをユーザーには終了させないようにすれば、騒ぎが とまるのですが、どうすればいいのでしょうか?
Workbook_BeforeClose(Cancel As Boolean) で終了できないようにはできる。 ペケの場合は終了できない。VBからは終了できる。 そのためには、VBから終了フラグをセットしてやればいい。 これでOK完成とおもったが、問題がある。 EXCELで終了中に終了のキャンセルをした場合は、 VBは終了したと思っているのに、EXCELは残っている。 どうする?
146 :
デフォルトの名無しさん :04/04/17 21:25
>>142 ありがとうございます!
助かりました。
詳細を述べますと
1ブックに20シートぐらいあるファイルを
検索しページ番号を抜き出したいのです
1シートのページ番号は142さんのやり方で出来きますが
シートをまたいだページ番号取得も出来ますでしょうか?
それとページが1ページしかないシートがエラーになりますが
これも対応出来ますでしょうか?
Cancelとる方法みつかりました。 サンキュー。 VBAは難しいね。
149 :
デフォルトの名無しさん :04/04/18 23:46
>>132 ありがとうございました!! 無事に内容が転機されて、
前のデータも消さずにいきました!!
ありがとうございます!
150 :
デフォルトの名無しさん :04/04/19 11:34
comboboxで数値(●●円)を選択する場合、 選択後もボックス内に「〜円」と単位を表示させるにはどうしたらよいのでしょう? 現段階だとcomboboxでリスト選択するときは「円」が表示されていますが 選択後は数字だけとなってしまいます。 よろしくおねがいいたします。
151 :
デフォルトの名無しさん :04/04/19 15:04
>>150 現段階のコードはどのようになってますか?
コンボボックスのスタイルは?fmstyledropdowncombo?
>>151 コードはイジってません(以下)。コンボボックスを右クリック→
プロパティで行っています。
Private Sub ComboBox62_Change()
End Sub
スタイルはfmstyledropdowncomboです。
すみません、よろしくお願いします。。
153 :
デフォルトの名無しさん :04/04/19 16:23
指定したセル(表の見出しにしている)の入力を禁止するにはどうすればよいのでしょうか?
154 :
デフォルトの名無しさん :04/04/19 16:28
エクセルしかしらないのだけど、WORDでかいた様式ファイルから エクセルのデータを出力したい場合、どのようにマクロ書けばいいのですか?
>>152 こんなかんじでどうでしょう。「円」の後ろに半角スペースを入れてください。
Private Sub ComboBox1_Click()
ComboBox1.Value = ComboBox1.Value & "円 "
End Sub
>>156 ありがとうございます、
Private Sub ComboBox62_click()
ComboBox1.Value = ComboBox1.Value & "円"
End Sub
を試してみたのですが、コンボボックス1には「100円円」と
円が二つ繋がってしまいます。また、単価と数量と合計も示しているのですが
このコードを挿入すると合計が#VALUEとなってしまいました。
お手数かけてもうしわけありません。
補足 「100円円」と表示されたのは、コンボボックスのプロパティで 選択した範囲にユーザー定義で「円」を表示させていたためでした。 よってユーザー定義を解除したところ、コンボボックスには「100円」と 表示されましたが、単価*数量=合計 の合計は#VALUEのままです。 説明が下手で申し訳ありません、宜しくお願いいたします。
159 :
デフォルトの名無しさん :04/04/20 10:18
とりあえず × Private Sub ComboBox62_click() ComboBox1.Value = ComboBox1.Value & "円" End Sub ○ Private Sub ComboBox1_click() ComboBox1.Value = ComboBox1.Value & "円" End Sub
>>158 セルのユーザー定義を解除しなくても、「円」の後に半角スペースを入れると「円」と表示されると思うのですが。半角スペースがないと「円円」と表示されます。何でなんでしょうね。
シート1のB1が単価(コンボボックスの値)として試してみてください。
Private Sub ComboBox62_Click()
ComboBox62.Value = ComboBox62.Value & "円 " '←円の後ろに半角スペース
Sheets(1).Range("B1").Value = Left(ComboBox62.Value, Len(ComboBox62.Value) - 2)
End Sub
>>160 度々本当にありがとうございます。お教え頂いたものをペーストしてみましたが、
やはり合計額が#VALUE!になってしまいます。。
しかし新しいワークシートにて最初から作成したところ、しっかり
単価*数量=合計が表示され、単価のコンボボックスにも「〜円」が表示されました。
コードやプロパティを見直してみても、どこがおかしいのかわかりませんが
教えてくださったコードを挿入しなければ、「円」は表示されませんが合計は
エラーになりません。。
ご丁どうしたらいいでしょう(笑
>>161 Private Sub ComboBox62_Click()
msgbox Left(ComboBox62.Value, Len(ComboBox62.Value) - 2)
End Sub
これを実行した時に数字だけが表示されるはずですが、いかがでしょうか。もう少しフォームの仕様とかを詳しく書いていただくと、わかるかもしれません。
163 :
デフォルトの名無しさん :04/04/21 16:08
Excel VBAマクロで以下の方法をご教授いただければ幸いです。 CommandButton1を押したときに、B3セルからE15セルまでの範囲を指定して カンマ区切りのcsv形式で保存することを考えております。
>>163 Private Sub CommandButton1_Click()
Range("B3:E15").Select
ActiveWorkbook.SaveAs FileName:= _
"Book1.csv", FileFormat:=xlCSV
End Sub
>>162 ありがとうございます。そのコードを実行したところ、
「実行エラー5 プロシージャの呼び出し、または引数が不正です。」と表示されました。以下にもう少し詳しく記載させていただきます。
sheet2の
I13からI15まで「100,200,空欄」の3つを記入し、これを「単価」として名前を定義。
同じくSheet2のF2からF12まで「空欄,1〜10」の11個を記入し、これを「数量」として名前を定義。
次にSheet名「計算表」にて
単価のComboBox62はC96に配置し、Linked cellにC96、ListFillrangeに「単価」を挿入。
数量のComboBOx51はD96に配置し、Linked cellにD96、ListFillrangeに「数量」を挿入。
D96に「=C96*D96」を挿入。
知識不足、説明不足で申し訳ありません、宜しくお願いします。
166 :
デフォルトの名無しさん :04/04/22 14:08
>>164 文字列以外のセルは#REF!って表示されません?
>>166 セルの大きさが小さいだけ
セル幅を広げりゃ万事解決
>>165 ComboBox62のLinked cellを削除し、以下のコードを貼り付けていただくとどうなるでしょうか。
Private Sub ComboBox62_Click()
ComboBox62.Value = ComboBox62.Value & "円 " '←円の後に半角スペース
Sheets("計算表").Range("C96").Value = Left(ComboBox62.Value, Len(ComboBox62.Value) - 2)
End Sub
>>164 エクセル2000ですが、選択された部分だけでなく、アクティブなシート全体の値が保存されませんか?
>>169 あ、ほんとうだ。
新しいマクロの記録で、
(1) B3:E15 を選択・コピー。
(2) シートを1枚追加。
(3) 追加したシートの A1 にペースト。
(4) CSV で保存
をやって、そのコードを
Sub CommandButton1_Click() 〜 End Sub の
間に貼りつける。
Access の .mdb ファイルを OpenCurrentDatabase で開くと、 「起動時のオプション」で、「フォーム/ページの表示」で指定してある フォームが開いてしまうのですが、これを開かないようにする方法ってありますでしょうか? いろいろ調べたつもりなんですが、わかりませんでした;;
>>171 開かない方法はわかりませんが、私はこんな感じでやっています。
Dim objAC
Set objAC = CreateObject("Access.Application")
objAC.OpenCurrentDatabase "c:\tmp.mdb"
objAC.DoCmd.Close 2, "Fmenu",2 '開いたメニューを閉じます
objAC.run "abc" '続いて実行したいマクロ
Set objAC = Nothing
>>172 今まで、OpenCurrentDatabase の直後に Visible = false って方法でやってたんですが、
お教えいただいた方法でも、一瞬、チラッとフォームが見えちゃいますね。
社内向けツールなんで、「仕様です」のひとことで済ますことにします。
う〜ん、残念。
すみません。EXCELのセルの中に「A_B_C…」とか入ってるのを 各セルにある文字をキーにして(この場合「_」がキー) 「A」「B」「C」の様に入れることはできるでしょうか? SUBSTITUTE関数を使ってもTABコードがうまくいかないのですが… 宜しくお願いします。
>>168 ありがとうございました!できました!!
176 :
デフォルトの名無しさん :04/04/27 22:50
マクロをいくつか作ったのですが、それを結合するのが大変なので自動で次のマクロに 移動できるようにしたいです。 どうすればよろしいでしょうか?
178 :
デフォルトの名無しさん :04/04/28 19:17
良スレ∩゚∀゚∩age
179 :
デフォルトの名無しさん :04/04/28 19:23
どなたか教えて下さい。 折れ線グラフで、マーカーの部分にカーソルを重ねると「系列 "A株式会社" 要素 "100" 値 "300"」 のような感じで表示されますが、別のデータをグラフの元となっているセルから引用して表示させたい と思っています。 例えば「系列 "A株式会社" 要素 "100" 値 "300" 内容 "○○○"」のような感じで「内容 "○○○"」 を追加したいと思っています。どなたかご存知でしたら教えて下さい。
180 :
デフォルトの名無しさん :04/04/29 22:07
重回帰分析をエクセルの分析ツールではなく、VBAでやりたいのですが、 何か良い関数はないでしょうか。
181 :
デフォルトの名無しさん :04/04/29 22:18
Excel VBA(VBのバージョンは6.0)での質問です。 例えばセルA1に文字や数字を打ち込んだ後に、他のセルをアクティブに しようとした瞬間に(A1がアクティブのままでということ)、メッセージボックスを 出す事って可能でしょうか? WorkSheet_Changeでは無理っぽいのですが・・・。 ご存知の方よろしくお願いいたします。
>>181 元の位置がアクティブなままと言うのはないみたい。
何をやりたいのかよくわからんが、元の位置に何かしたいということなら、Worksheet_SelectionChange でせっせと元の位置を覚えておけばいいと思う。
Private OldRange As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not OldRange Is Nothing Then
OldRange.Font.Color = RGB(0, 0, 0)
End If
Set OldRange = Target
Target.Font.Color = RGB(255, 0, 0)
End Sub
とやれば、選択しているところのフォントだけが赤くなるよ。
183 :
デフォルトの名無しさん :04/05/04 18:59
質問です。 テキストボックスに入力したデータをA5のセルに表示する方法を教えてくださいませんか?
>183 テキストボックスに入力したデータをCtl+Cでコピーして A5のセルCtl+vでペースト
>>183 Cells("A5).Value = Edit1.value
186 :
デフォルトの名無しさん :04/05/05 11:15
質問させて下さい。 ExelのVBAで簡単なプログラムを作りました。 内容はセルの内容を貼り付けたり切り取ったりを繰り返すだけの物です…。 ところが内容を付け加えていくうちに急に処理が重くなり,当初より10倍以上の時間が掛かるようになってしまいました。 プルグラムが長くなりすぎたのかと思い,試しに付け加えた部分を削除してみましたが,やはり遅いままでした。 このような状態の解決法は何かあるんでしょうか? ご教授よろしくお願いします。
取りあえず時間のかかってる処理はどこか探ってみては? ふざけたループが廻ってたりとか。
188 :
デフォルトの名無しさん :04/05/05 11:21
処理が無駄に循環しているとか?
189 :
デフォルトの名無しさん :04/05/05 11:35
いえ,プログラムの内容と言うよりは,根本的に一つ一つの操作(C&Pなど)が遅い状態です。
ウィルスチェックがかかってないかな?
もちろん常駐はしていますが,スキャン中など,システムに負荷が掛かる状態ではありません。 ちなみに他のPCで試してみても同じ状態です。
192 :
デフォルトの名無しさん :04/05/05 14:22
普通のBASICしかやったことなくてVBAに挑戦しようと思っているのですが、 このスレに張り付けられているコードを見たところ 文と文の区切り文字が使われていないみたいなんですが :は付けたらいけないのでしょうか?あっても問題ないのでしょうか?
ごめんなさい。 やってからこい!って言われる前にやってみました。 あっても問題ないんですね。 スッキリしました。スレ汚し巣マソ
>>191 usedrangeを使った時に処理が遅くなった経験があります。見た目はデータがないのに、その部分まで対象になっていたので処理が遅くなっていました。
んー そのケースには該当しないようです。
>>192 ん〜〜 もしかして行末に全部 : つけてるとかw
解決しました
すいません。教えてください。 最近VBをはじめた初心者です。 くだらない質問なんですが、 VBとVBAの基本的な違いは何ですか? 箇条書きで構わないので、メリットとデメリットを 教えてください。 お願いします。
すいません。教えてください。 最近セックスをはじめた初心者です。 くだらない質問なんですが、 セックスとアナルセックスの基本的な違いは何ですか? 箇条書きで構わないので、メリットとデメリットを 教えてください。 お願いします。
201 :
デフォルトの名無しさん :04/05/07 12:52
>>199 VBAは,各アプリケーション固有(ワード,エクセル等)の
マクロ処理言語として提供されています。
パッケージ版のVBとの違いは,パッケージ版VBは単体で
動作することを前提としたプログラムを作成しますが,
VBAの場合は,それが組み込まれているアプリケーション
(エクセル,ワードなど)の上で動作します。
>>202 ありがとうございます。
まだまだ勉強が足りませんでした。
204 :
デフォルトの名無しさん :04/05/09 10:37
Access2000で、フォーム上でのスクロールによるレコードの移動を禁止したいのですが。 Accessでその機能が無いようなので、VBAで行うとすれば、 マウススクロールを無効にするようなコードってありますでしょうか?
205 :
デフォルトの名無しさん :04/05/10 12:36
a
207 :
デフォルトの名無しさん :04/05/10 21:25
ACCESS2000/VBAについて質問させてください。 テーブルをエクセル形式にエクスポートした際にEXCEL5.0/95形式で 保存されてしまうのですが、2000形式の保存を行う方法はありませんか? 現状: DoCmd.OutputTo acTable, "EXP", "MicrosoftExcel(*.xls)", "C:\test.xls", False, ""
>>208 excelオブジェクト作って読み込ませて保存。
とか適当に言ってみる。
210 :
デフォルトの名無しさん :04/05/12 00:48
ご教授お願いします。 Pingの応答確認をしたいのですが。例えばA1にIPアドレスを入力し、 マクロ実行後、A2に○or×を表示させたいのですが。 よろしくお願いします。
>>210 ICMPを扱えないといけません。rawソケットでできるかな?できないかな?みたいな。
と適当
>>210 こんなんでどう? バッチ利用で○×じゃないけど。(ひょっとするとWin98/Meは無理だっけ?)
Public Function IPTest(IP As String) As Boolean
On Error Resume Next
Dim F As Integer, RetCode As Integer, CR As String
CR = Chr(13) & Chr(10)
F = FreeFile
Open "IPTest.Bat" For Output As #F
Print #F, "@Echo Off" & CR & "Ping -n 1 -w 1 " & IP & " > Nul" & CR & "Echo %ErrorLevel% > Res.Txt"
Close #F
Shell "IPTest.Bat", vbHide: Do: DoEvents: DoEvents: DoEvents: DoEvents: DoEvents: Loop While Dir("Res.Txt") = ""
Kill "IPTest.Bat"
F = FreeFile
Open "Res.Txt" For Input As #F
Input #F, RetCode
Close #F
Kill "Res.Txt"
IPTest = IIf(RetCode = 1, False, True)
End Function
214 :
デフォルトの名無しさん :04/05/13 08:12
Public Sub Workbook_Open() Timerloop End Sub Sub Timerloop() Call ThisWorkbook.TimerProc ' Application.OnTime Now + TimeValue("00:00:1"), "Timerloop" End Sub VBAで1秒周期で処理をさせたいTimerProcを上記のように実装しています。 ところが シートラベルをクリックしてシート名称が変更できる状態にすると この処理が停止します。 エラーでもないのにEXCELが中断モードになるのだと思いますが、 なにか回避する方法はないものでしょうか?
よくわからんけど、解決した。 しかし、シートラベルをクリック(ダブル)するとシート名変更の モーダル画面が出るようになった。 モーダル画面中はタイマーは止まるが 画面を消すともとどうり動作するようになった。
216 :
デフォルトの名無しさん :04/05/13 15:30
Public VsH(100) as doubleとかいっぱい配列を宣言したら固まるんですけど限界とかあるんですか?
またおまえか!
218 :
デフォルトの名無しさん :04/05/13 21:29
>216 100だったら固まらん。 100000000ぐらいにしてみたら。
219 :
デフォルトの名無しさん :04/05/13 22:39
ACCESS 2000の質問です。 サブフォーム内のテキストボックスにテーブルの項目を関連づけました。 任意のテキストボックスにフォーカスを当てることはできたのですが、 テキストボックスのプロパティを変更することが出来ませんでした。 1レコード目はテキストボックスを使用不可にし、2レコード目を使用可にすること はできないのでしょうか?
220 :
デフォルトの名無しさん :04/05/13 22:58
221 :
デフォルトの名無しさん :04/05/16 23:15
VBをしらなくとも、 EXCEL VBA関連の本を読んで、できるものでしょうか?
>>221 できないなら覚えればいい。って言う話ですな
誰でも最初は初心者だった。
>>221 漏れはVBは触ったことがないけど、EXCELのヘルプを読みまくって、なんとか作れるようになったよ。
まぁ効率悪いところはいろいろあるんだけどさ。
>221 漏れも最近始めた。 まぁがんがっていこうや (´∀`)
質問です。 EXCELでセルをクリックしたときにイベントを発生させたいのですが どのようにすればよろしいのでしょうか。 よろしくお願いします。
解決しました。 すみませんでした。
229 :
デフォルトの名無しさん :04/05/21 14:45
Excelで文字列処理をするとき、ターゲットファイルを選択にgetfilepath()を 使っています。ただデフォルトで開くディレクトリがマイドキュメントに なってしまうので、できればカレントを表示させたいのですが、良い方法はありますか?
スマソ ミスってしまった getfilepath()じゃなくてApplication.GetOpenFileName です
重ね重ねスマソ こんな風にしたらできますた Function OpenLogFile() As String Dim varFullPath As Variant Dim i As Integer Dim myPath As String Dim myDrive As String myPath = Application.ActiveWorkbook.Path i = InStr(myPath, "\") If i < 3 Then OpenLogFile = "" MsgBox "ネットワークから起動するときはドライブを割り当ててください", vbOKOnly + vbExclamation GoTo No_UNC End If myDrive = Left(myPath, 2) ChDrive myDrive ChDir myPath varFullPath = Application.varFullPath = Application.GetOpenFileName _ ("ログファイル (*.log; *.txt),*.log;*.txt") No_UNC: OpenLogFile = varFullPath End Function A:\〜Z:\まで必ず\が3文字目にあることを利用してChDriveをした、と オナニー見せつけて申し訳ない
>>231 'モジュールレベルで宣言
Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" _
(ByVal lpPathName As String) As Long
'カレントドライブとフォルダの変更(ネットワーク対応)
Function OpenLogFile() As String
Dim varFullPath As Variant
Call SetCurrentDirectory(Application.ActiveWorkbook.Path)
varFullPath = Application.GetOpenFilename("ログファイル (*.log; *.txt),*.log;*.txt")
OpenLogFile = varFullPath
If varFullPath = False Then OpenLogFile = "" 'キャンセルされた場合
End Function
Access2002にて、
http://support.microsoft.com/default.aspx?scid=kb;JA;278379 を利用し、マウスのスクロールによるレコード移動を禁止したところ
フォームのテキストボックスでEnterキーを押すとTabキーのように
次の入力ボックスへカーソルが移動するようになってしまいました。
(それまではテキストボックス内でEnterをおすと改行してました)
オプション設定で「移動しない」にしても、本当に何も起きません。
Ctrl+Enterで改行することは出来るのですが、
使用者がPC初心者のため、普通にEnterで改行出来るようにしたいのです。
Enterを押すと Ctrl+Enterが送られるようにするとか出来る物でしょうか?
236 :
デフォルトの名無しさん :04/05/23 19:06
Outlook2002でメール作成をWord2002で行う設定をしています。 メール作成中Word2002のマクロで、メールの形式をテキストに 変更するマクロを書きたいのです。 どなたかお助けください。 HTMLメールへの返信をテキスト方式で行う際に、整形する マクロを作ったのですが、テキスト方式にするためのプルダウン コントロールへのアクセスの仕方がわからんです。
238 :
デフォルトの名無しさん :04/05/23 21:44
あのー、困ってるので教えてください、エロイ人。 Excelで例えばセルA1に入力されてる文字列中に半角文字があるかを調べるには どんなコードを書いてやればよいのでしょうか?
239 :
デフォルトの名無しさん :04/05/23 21:45
>>238 関数があるかどうかは知らん。
unicodeだから単純に半角文字コードか否かを見るだけでも判断可能。
>>238 '半角チェック関数
Function CheckNarrow(Address As String) As Boolean
'戻り値 True:半角文字がある False:半角文字は無い
&ndsp;&ndsp;Dim CheckString As String
&ndsp;&ndsp;CheckString = Range(Address).Value
&ndsp;&ndsp;CheckNarrow = (CheckString <> StrConv(CheckString, vbWide))
End Function
'↓使い方
Sub StartCheck()
&ndsp;&ndsp;If CheckNarrow("A1") Then
&ndsp;&ndsp;&ndsp;&ndsp;MsgBox "半角があります。"
&ndsp;&ndsp;Else
&ndsp;&ndsp;&ndsp;&ndsp;MsgBox "半角はありません。"
&ndsp;&ndsp;End If
End Sub
間違えた・・・_| ̄|○ '半角チェック関数 Function CheckNarrow(Address As String) As Boolean '戻り値 True:半角文字がある False:半角文字は無い Dim CheckString As String CheckString = Range(Address).Value CheckNarrow = (CheckString <> StrConv(CheckString, vbWide)) End Function '↓使い方 Sub StartCheck() If CheckNarrow("A1") Then &ndsp;&ndsp;MsgBox "半角があります。" Else &ndsp;&ndsp;MsgBox "半角はありません。" End If End Sub 今度はどうだ!
>>243 引数はセルの位置ではなくて評価する文字列にした方が汎用性が上がると思うよ。
ndspじゃなくてnbspだった・・・何度もすまん。
>>244 そうですね。言われてみればそうだ・・・。
フォローサンクス!
一部直しわすれてた。。・゚・(ノД`)・゚・。ウエエェェン ついでに引数を文字列に変更しました。今度こそいいよね。 '半角チェック関数 Function CheckNarrow(CheckString As String) As Boolean '戻り値 True:半角文字がある False:半角文字は無い CheckNarrow = (CheckString <> StrConv(CheckString, vbWide)) End Function '↓使い方 Sub StartCheck() If CheckNarrow(Range("A1").Value) Then MsgBox "半角があります。" Else MsgBox "半角はありません。" End If End Sub
関数にするまでも無いことに気付いた・・・_| ̄|○
>>248 いやいや、可読性、再利用性、修正箇所の減少etcetc大事なことですよ。
250 :
デフォルトの名無しさん :04/05/23 23:46
>>237 Outlookはマクロの記録ができません。
で、この操作はWordでも記録できません。
>>250 じゃあヘルプひけって話になる訳ですね。
252 :
デフォルトの名無しさん :04/05/24 04:53
>>241-249 おおお、ありがとうございます。
vbWideなんて定数があったんかぁ。
ソースまで頂いちゃって、乙です。m(_ _)m
>>251 で、ヘルプでもGoogleでも全く引っかからないんです。(はぁと
254 :
デフォルトの名無しさん :04/05/25 16:39
VBAでコードを検索しようとして検索画面を出し、文字列に漢字とかを2文字以上で打つと、 その2バイト文字の1バイト目のみが送られ、別の漢字に変わったりするんですが、解消方法知ってる方いませんか? VB本体、他のアプリでは問題なく、ATOK,IMEどちらも同じ症状です
>>254 意味が分からん。ATOKだってIMEだ。
>>255 すんません、MS-IMEでもという意味でした
具体的には、VBA Editorで書いたコードを検索しようとしてCtrl+Fで検索画面を出すじゃないですか
そこの検索文字列に例えば、"数量"と入れると"雛"と表示されるんです
数量がS-JISで文字コード"9094 97CA"、雛が"9097"
数と量、両方の2バイト目が省かれた漢字が入力されてる感じなんです
>>254 にも書いた通り、他のアプリ(VBとか)の検索画面では全く問題ないんです
ああレス付いているとは思わなかったので遅レス大変申し訳ない
>>233 おお!そんなAPIがあったとは知らなかった
UNC形式でのカレントディレクトリ変更もばっちり動きました
スマートなのでこちらに書き換えします
ありがとうございました
258 :
デフォルトの名無しさん :04/05/26 23:41
仕事で、エクセルに50〜100個のデータを入力するのですが、途中でどのセルに値を入力したのかわからなくなることが多く、困っています。 ちなみに入力が必要なセルはきっちりと順番に並んではいません。 そこで、 1、再入力が必要なセルにあらかじめ色をつけておき 2、値を再入力すると通常の色に戻る というようなことができないかと考えているのですが、マクロで実現できないでしょうか?
>>258 条件付き書式でもある程度戦えると思った。
>>258 Private Sub Worksheet_Change(ByVal Target As Range)
Target.Interior.ColorIndex = xlNone
End Sub
>>256 Office XPじゃない?
うちでも発生するからバグだと思うが
ただ技術情報にも出ていない
面倒だから問い合わせていないけどMSに問い合わせた方が宜しいね
262 :
デフォルトの名無しさん :04/05/28 00:58
私、VBA初心者です。 すいません。教えてください。 VBAでファイルを名前を変えて保存を実施するのに、名前を 20040527という風に4桁2桁2桁表示にしたいのですが、どうしてもうまく いきません。 現在、設定しているのは date = Year(Date) & Month(Date) & Day(Date) というのを使用して、形式をいろいろ変更しているのですが、 どうしても月と日が2桁で保存できないのです。 どうやって、4桁2桁2桁の名前で保存できるのでしょうか?
263 :
デフォルトの名無しさん :04/05/28 01:08
>>262 Format(DateSerial(2004, 5, 28), "yyyymmdd")
264 :
デフォルトの名無しさん :04/05/28 01:20
>>263 ありがとうございます。うまくできました。
265 :
デフォルトの名無しさん :04/05/28 01:29
262です。 う、、やっぱりうまくいきませんでした。 修正エラーって言われてしまいます。
266 :
デフォルトの名無しさん :04/05/28 01:39
>>265 >>263 じゃないし、漏れもあんま詳しくないけど
日付型だとまずいんでない?
Cstr(Format(DateSerial(2004, 5, 28), "yyyymmdd") )とかは?
>>265 Date はシステム日付を取得する関数だが
Date =...と書くとシステム日付を変更するステートメントになる。変数ではないので変数名を変えなされ。
もし今日当日の日付のファイル名を作りたいなら↓みたいな感じか?
Dim Filename as String
Filename = Format(Date, "yyyymmdd")
Open Filename for...
--------------------------------以下ヘルプより
Date ステートメント
現在のシステムの日付を設定するステートメントです。
構文
Date = date
Microsoft Windows 95 で実行されるシステムの場合は、1980 年 1 月 1 日〜2099 年 12 月 31 日の
範囲の日付を指定する必要があります。Microsoft Windows NT で実行されるシステムの場合は、
1980 年 1 月 1 日〜2079 年 12 月 31 日の範囲の日付を指定する必要があります。
Macintosh の場合には date に1904 年 1 月 1 日 〜 2040 年 2 月 5 日の範囲の日付を指定する必要があります。.
つーかVBAでスシテム日付を変更してはいかん。
>>267 1970 1/1なUNIX時間じゃ無いんですね。
270 :
デフォルトの名無しさん :04/05/28 10:30
>260 遅レスすんません。 色を無色にする操作はそれでできますね。 理想を言えば、値を入力してEnterを押した瞬間色が変わってほしいのですが Enterのタイミングに合わせてマクロが動くようにするのはやっぱり無理でしょうか?
271 :
デフォルトの名無しさん :04/05/28 20:27
>>266 やはり修正エラーがでてしまいます。。。
>>267 そうです。毎日のファイルを吐き出したいため、日付フォーマットで保存し、
読み出すときもその日のファイルを読み出すために作成しているのです。
>Dim Filename as String
>Filename = Format(Date, "yyyymmdd")
>Open Filename for...
こうする場合は、Filenameの変数はどうやって日付の値を取得するのでしょうか?
Filename = Year(Date) & Month(Date) & Day(Date)
Dim Filename as String
Filename = Format(Date, "yyyymmdd")
で定義してみましたが、やはり仮に本日ならば、20040528にはならず、
2004528となってしまいます。
Date関数を使うとだめなのでしょうか?
変数の宣言を先にしてみては? Dim Filename As String Filename = Year(Date) & Month(Date) & Day(Date) Filename = Format(Date, "yyyymmdd")
>>271 これではいかが?
Filename = Year(Date) & Right("0" & Month(Date), 2) & Right("0" & Day(Date), 2)
VBAでファイルを読み込んで処理をするのですが、テキストファイルだと中身の生データを読まれてしまいます 暗号化などよい方法はないものでしょうか?
これで Dim Filename As String Filename = Format(Date, "yyyymmdd") Range("A1").Value = Filename A1に"20040528"が表示されるから Filenameには希望通りの値(文字)が入ってると思うんだけど (WinXP+Excel2003)
>>274 基本中の基本は、ある数とのxorを取ること。
A xor B = C
C xor B = A
VBAならパスワード付きファイルにデータを保存したりするのが楽ちんな気もします。
>>276 ありがとうございます
暗号化したいのは文字列なんですが、アレンジして使えそうです
>>270 次のセルに移動すると同時に色が変わりませんか?
どんな感じになってるんですかね。
279 :
デフォルトの名無しさん :04/05/29 14:01
>278さま すいません。 ものすごく初心者なので、せっかく書いていただいた>260をどう使えばいいのかよくわかってないんです。 privateで始まっているのでこれはサブルーチンみたいなものだと思ったのですが、 Sub macro1() worksheet_change(selection) End Sub というような感じで使用するということなのですか?
>>279 私は 278 ではないが、
(1) [Alt] + [F11] で VBエディタを表示させて
(2) [Ctrl] + [R] でプロジェクトを表示させて、
(3) 対象とするシート(たとえばSheet1)をダブルクリックする。
(4) コードウィンドウが表示されるから、そこに
>>260 をそのまま
コピペする。
(5) VB エディタは閉じてよい。
(6) Excel の Sheet1 に戻って、てきとーにセルに色をつけておく。
(7) 色をつけたセルの値を変更してみる。
(8) (゚Д゚)ウマー
>>279 あれは、標準モジュールではなくシートモジュールに書きます。
Visual Basic Editorの左上のウィンドウに、Microsoft Excel Objects以下に、
存在するシート名とThisWorkbookというのがありますが、該当するシートを
ダブルクリックした時に右側にウィンドウが開きます。
右側のウィンドウの上部に2つのコンボボックスがありますので、左側で
"Worksheet"、右側でChangeを選択すると、空のプロシージャが挿入されるので、
あとは
>>260 のようにするだけ・・・と。
こんな説明でよい?
Excelのバージョンによって、使える関数やコードの書き方が 若干異なったりするので、質問する時はバージョンまで書いたほうがよいと思う。
皆さんありがとうございました。 おかげでうまく日付保存をすることができました。
284 :
デフォルトの名無しさん :04/05/30 01:04
>280さま、>281さま できました。どうもありがとうございます。 すごいです。こんなことができるなんて! >282さま おっしゃる通りですね。今更必要ないかもしれませんが、家のPCには2000が入っており、会社のものは確か2003だったと思います。
285 :
デフォルトの名無しさん :04/05/30 22:28
Excel2002VBAのVBEで,プロパティウインドウを表示して,フォントを変更しようとすると固まってしまいます。 原因は何でしょうか。単にフォントの入れすぎでしょうか。 XPで,メモリーは512MBなんですけど・・・。
286 :
デフォルトの名無しさん :04/06/01 00:31
>>285 CPU使用率表示させながら実行してみ。コードが問題か力不足かがわかる。
漏れが前作らされたの、ファイル開くのにCPU100%で10分以上頑張ってたよ。
ちなみにP4/256MBメモリはたいして消費してなかった。
288 :
デフォルトの名無しさん :04/06/01 01:04
VBAでテキストボックスを指定した位置に表示させる事って できますか?できる場合は、どうすればできるでしょうか?
VBAでVLOOKUPとか使えますか? こういう関数の呼び出し方とかはどこを見れば載ってるんでしょうか
>>290 WorksheetFunction
実際にこれで使えるかどうかは知らんが、まぁテストして見れ
>>290 Excel VBAのヘルプに
Visual Basicで使用できるワークシート関数一覧
という項目がある。
ここにVLOOKUPものってる。
呼び出しは
>>291 の通り。
293 :
デフォルトの名無しさん :04/06/03 02:28
エクセルVBAで行に対して名前定義を行ったのですが (行全体を選択し名前ボックスに名前をつけました) その名前の行の高さやその行が何行目かなど取得できますでしょうか? ご教授ください。 よろしくお願いしますm(__)m
Private Sub CommandButton1_Click() ActiveSheet.Shapes.AddShape(msoShapeRectangle,100#,50,100,90).Select Selection.ShapeRange.ThreeD.SetThreeDFormat msoThreeD1 Selection.ShapeRange.ThreeD.Deppth = 50# End Sub
295 :
デフォルトの名無しさん :04/06/03 17:12
質問です。 AddLineで書いた線をSetステートメントでオブジェクトを参照するように したいのですが、やり方がわかりません・゜・(ノД`)・゜・。 線を7つぐらい引いてそれをグループ化したいだけなのですが… 教えてください。よろしくお願い致します。
>>293 Sub NameTest()
Const AreaName As String = "test"
MsgBox Names(AreaName).RefersToRange.Row & "行目"
MsgBox "行の高さ:" & Names(AreaName).RefersToRange.Height
End Sub
>>295 Sub GroupLine()
Const LineMax = 7
Dim ShapeLines(LineMax - 1)
For i = 1 To LineMax
ShapeLines(i - 1) = "Line " & i
ActiveSheet.Shapes.AddLine(10, i * 20, 110, i * 20).Select
Selection.ShapeRange.Name = ShapeLines(i - 1)
Next
ActiveSheet.Shapes.Range(ShapeLines).Select
Selection.ShapeRange.Group.Name = "Group 1"
End Sub
そんな資格初めて聞いた・・・ 無名過ぎて少なくとも開発現場では評価されないだろうな。
>>296 さん
ご指導ありがとうございます!
上手くできました!!
>>299 て言うか、有名でも VBA○○ じゃ評価は低いだろ。
個人的にはperlとVBAこそが効率化の鍵だと思ってる。
できたばっかりの資格だし。ただ下手なガイド本より試験対策本の方が漏れには
勉強になりました。MOUSもしかり。漏れのとこは設計書なんかにExcel、Access使うことが
多いので
>>302 の言う事は一理ある気がしまつ。資格としては「(w」程度でしょうけど。
非定型業務で使い捨てプログラム書くときは重宝する>VBA 「この作業だと2時間くらいですかね〜」といいつつ、マクロで ちゃちゃっと終わらせてあとはのんびり。30分くらい早めに 終わったことにしてみせたりもいい。
暇そうでいいね。 まあ、所詮そういう仕事しか与えてもらえないわけだ...。
>>305 少なくとも20000行のエクセルシートを手で一行ずつ処理するような雑用にかまけてる暇は無いですね。
そう言う単調だけれど楽な仕事って憧れます。
>>306 ププッ、煽られて必死になるのはわかるけど、Excel で 20000 行と書いてる時点でアフォ丸出し。
Access とか勉強した方がいいぞ。
>暇そうでいいね。 無色に言われたかない罠
>>307 現場を知らない人間の書き込みだな。
引きこもりか、まぁ、せいぜい日曜プログラマだな。
>>308-309 ごめんな、そこまで必死になられるとは思わんかったよ。
せいぜい、VBA 自慢しててください。(ぷぷっ
そういや昔はアクセスなんてなんに使うんだ?とか思ってたなあ。
>>310 ・・・あおりしかできないヤツか。
お前、カッターだけは買うなよ。
>>312 キミ、すごいね。
VBA と煽りができるんだから、もう充分だな。(ぷぷっ
>>313 どっかで配ってるか?カッターって。
確か小中学校では支給してもらえたが。
なお、会社にあるそれを私物化するのは犯罪でつ。
名前:カッターなんか今更買うやつなんかいるのか ? 投稿日:04/06/05 17:49 ご苦労様です
>>314-315 普通の家ならあるだろ ?
ヒッキーだとそんなこともわからんかもしれないけどな。(ププッ
>>316 その家にあるってのは誰かが買ってきてるからあるんだよ?
>>317 そうだよ、だから「今更」買う必要はないんだけど、何か ?
>>318 独り暮らしとかしたこと無いんだね。
親に依存している厨房と。
ぷぷっ、誰かさん ≡ 親 としか思えないのか...。 別に「誰か」って言うのが、一年前の自分でもいいんだよ。
なぁ、ぴろゆきタソ この板もID強制表示にしてくれよ
いいかげん他所いってやってくれ・・・
>>320 1年前の自分は別人ですか・・・。
アブナイ人ですね。
お前は、カッターだけは買うなよ、と。
>>323 どこに「別人」と書いてあるのか示してくれないか ?
まさか、「誰か」≡「自分以外の別人」と思ってるわけ ? (ププッ
誰だ!って俺か!!! ってのが笑い話になるように、「誰か」には自分を含めないのが一般的だな。 もしかして受け狙いだったのか?
お前の意見 ≠ 一般的
やう゛ぁい。 324 は誰にもかまってもらえないさみしい男だぞ。 2ちゃんねるでタタかれて喜んでるヤツだから〜。 おまえ、カッター買って、バスジャックするようなマネだけはやめとけよ。
>>327 > おまえ、カッター買って
だから、「今更カッターなんか買う必要ない」んだけどな。
わざわざ自分が
>>315 で書いてまでいるのに、必死過ぎてわけわからんようになってるんだろうな...。(藁
ドキドキしながら、時々このスレ、リロードしてる328が 目に浮かぶようですね(w 世の中でここだけだからなぁ、 328が相手してもらえるのは。
>>330 継続は力なり
そんな風に飽きっぽいからVBAプログラマはバカに
されるんだぞ、と
>>332 たっぷり寝る時間があってうらやますぃですね。
>>328 お前の日本語はわからんな。
「自分」って誰のことを指してるんだ?
336 :
デフォルトの名無しさん :04/06/09 19:02
VBAでプロパティや変数を参照するときに、"!" と "."の二種類で参照が 可能ですが、何か意味が違うのでしょうか? また、使うならどちらを使ったほうがいいですか?
338 :
デフォルトの名無しさん :04/06/09 23:04
セルの範囲を指定して読み込むプログラムを作ってるんですけど、 仮にDataRangeという変数に範囲終了セルを代入した場合、 Do While ActiveCell.Range("A1") <> "DataRange" ・・・ Loop みたいな感じの条件文にしたいんですけどうまくいきません。 (ちなみに上のような文だとセルにDataRangeという文字が入っているところまでと言う意味ですよね・・・) じゃなくて、変数にB5のように入れてセルB5まで読み込むというふうにするにはどうすればいいでしょうか?よろしくお願いします。
>338 Addressプロパティを使えばよいのでは。 Do While ActiveCell.Range("A1").Address<>DataRange.Address ただこれだとDataRangeのひとつ手前までしか処理されないが。
>>339 333 名前:デフォルトの名無しさん[sage] 投稿日:04/06/08 11:12
>>337 小学校行って時計の読み方から勉強しようね。
>>337 我慢できずに、朝から書き込んでる香具師の言う台詞か(ワラ
>>337 お前が我慢してるからって、みんなが我慢してるわけじゃないんだぞ。
「2ちゃんねる見て〜」→「でも、我慢しなくちゃ」なんて思ったことないぞ(w
お前だけだよ、「我慢」してるヤツは(プ
>>338 質問に要領をえないが、セルを順番に調べたいなら
Dim DataRange As Range
Dim rng As Range
Set DataRange = Range(Range("A1"), Range("B2"))
For Each rng In DataRange
MsgBox rng.Value
Next rng
>>342-345 自演ご苦労。
もう少し、時間を空ければいいと思うが、君には難しいみたいだね。(藁
>>338 >>347 が正解だと思うが、ゴリゴリ回したいなら...
Private Sub test()
Const StartCell As String = "B1"
Const EndCell As String = "B5"
Dim Cell As Range
Worksheets("Sheet1").Activate
Worksheets("Sheet1").Range(StartCell).Activate
Do
MsgBox ActiveCell.Value
If ActiveCell = ActiveSheet.Range(EndCell) Then Exit Do
ActiveCell.Offset(1, 0).Activate
Loop
End Sub
と言う手もある。
>>348 自分のことをバカにする人はひとりしかいないと。
幸せな人だなぁヽ(´ー`)ノ
349 名前:デフォルトの名無しさん[sage] 投稿日:04/06/12 00:10 350 名前:デフォルトの名無しさん[sage .] 投稿日:04/06/12 00:20 いつも仲がいいみたいだね。 ニヤニヤ。
352 :
デフォルトの名無しさん :04/06/12 00:43
ねぇ〜
350 名前:デフォルトの名無しさん[sage .] 投稿日:04/06/12(土) 00:20 351 名前:脳内二重人格ですか ? (藁[sage] 投稿日:04/06/12(土) 00:35 ってか、藻前が自演くさい(w あと、脳内二重人格ってなんだろう? 脳外二重人格ってのがあるのか
356 :
デフォルトの名無しさん :04/06/12 13:30
「1111ぬるぽ2222」という感じで文字列がA1に入っている場合・・ これをぬるぽを置換で消して、A1に「1111」A2に「2222」という ふうに分けたいんです。 Sub ぬるぽ() Cells.Replace What:="ぬるぽ", Replacement:=" " ↑のようにしてタブでセルを分けて、別シートにコピーしようとしたが、無理っぽい。 なにか方法はないでしょうか・・。
>>354-355 > 我慢できずに1時間後ですか(w
ププッ、自分は3時間半も我慢したってか ?
>>356 Option Explicit
Private Sub Test()
Dim A() As String
A = Split(ActiveCell.Value, "ぬるぽ", 2)
ActiveCell.Value = A(0)
ActiveCell.Offset(1, 0).Value = A(1)
End Sub
337 名前:オレモナー。[sage] 投稿日:04/06/09(水) 23:00 348 名前:デフォルトの名無しさん[sage] 投稿日:04/06/11(金) 23:47 う〜ん、我慢できないと言われたのがよっぽどくやしかったのか、 2日我慢してるな〜(ワラ さぞかし辛かったでしょうね;; 我慢してるのはお前だけだよ(ププ
359 :
デフォルトの名無しさん :04/06/12 14:09
うお、一発でできました。悩んだのに! 357氏。ありがとうございます!!!
>>356 解決したみたいだけど
ワークシート関数でやらずに
VBAでやりたい理由でもあんの?
脳内二重人格脳内二重人格脳内二重人格脳内二重人格脳内二重人格 脳内二重人格脳内二重人格脳内二重人格脳内二重人格脳内二重人格 脳内二重人格脳内二重人格脳内二重人格脳内二重人格脳内二重人格 脳内二重人格脳内二重人格脳内二重人格脳内二重人格脳内二重人格 脳内二重人格脳内二重人格脳内二重人格脳内二重人格脳内二重人格 脳内二重人格脳内二重人格脳内二重人格脳内二重人格脳内二重人格 脳内二重人格脳内二重人格脳内二重人格脳内二重人格脳内二重人格 脳内二重人格脳内二重人格脳内二重人格脳内二重人格脳内二重人格 脳内二重人格脳内二重人格脳内二重人格脳内二重人格脳内二重人格 脳内二重人格脳内二重人格脳内二重人格脳内二重人格脳内二重人格 脳内二重人格脳内二重人格脳内二重人格脳内二重人格脳内二重人格
>>360 356氏ではないけど、ワークシート関数だったらどうやるの?
スレ違いスマソだけど、教えて下さい。
>360 いや、関数でもできるならOKなんですが。 たぶん無理?。VBAでやるとカコイイし。 357氏、厨相手の片手間にさらりとコード書いちゃうところがすごいです。
『[脳内二重人格』という名言!を残した357さんはすごいですね! ぼくもそう思います!!!!
>>363 ごめん、よく読んでなかったよ
「A1に入ってる内容をA1とA2に」っていうのは関数じゃむりでした
「A1に入ってる内容をA2とA3に」ってのなら可能だけど
>>358 =
>>361 =
>>364 やっぱり我慢できないみたいね。
ずっと PC の前でリロードしてたんじゃないの ? ププッ
>>359 どういたしまして。
>>365 >>356 さんが、「別シートにコピー」とか書いてるから、別シートに結果を入れるならがんばればワークシート関数でできると思う。
でも、find ワークシート関数は文字列が見つからない時に #VALUE! とかを返してきたりするから、きちんとやろうとすると結構面倒な予感。
テキストデータ(辞書)で5万行ぐらいあるんですが、置換を行う 場合、VBA、WSH(VBS/JSript)、PERLではどの程度速さが違うんで しょうか。簡単な正規表現でやる場合なのですが、、、 というのも、EMEDITORで作業をしたら、正規表現にしたとたん とんでもなく遅くなってしまいますた。てか、一気に変換できず 初めは千行ごとにやらないとフリーズ状態です。 WIN XPでつ。
>>367 VBAで正規表現使えたっけ?と言うツッコミは無しで考えた方が良いですか?
「脳内二重人格」と「二重人格」の違いはなんですか?
>>368 そういやないですね。
Wordでの置換の正規表現モドキとしてください。
おたずねします。 windows2000+EXCEL2000SR-1ですが、webbrowserコントロールをuserformに貼り付けてstopメソッドを使用すると、以下のエラーが出ます。 実行時エラー-2147221500(80040004) stopメソッドは失敗しました。:IWebBrowser2オブジェクト セルに貼り付けてstopメソッドを使用した場合は上記エラーは出ません。これは何故なんでしょうか?
うお、Splitなんて関数があったのか。ガビーン。 先週半日かかった仕事が30分で終わってたよ。orz
374 :
デフォルトの名無しさん :04/06/16 14:38
使用エクセルは2000です。 小数点第3位を四捨五入したいのですがワークシートで=ROUND(0.005,2)だと きちんと0.01と四捨五入されるのですが、VBAで Range("A2").Value = Round(0.005, 2) とやると5で切り捨てられ0、 Range("A3").Value = Round(0.006, 2) とやると6が切り上げられ0.01になります。 VBAの場合のきちんとした四捨五入方法教えて下さい。
375 :
デフォルトの名無しさん :04/06/16 16:19
特定のフォルダ内にあるcsvファイルの名前を全て習得し配列に格納したいのですがうまくいきません。 下記のような物を作りました。 Dim test1() String Dim test2 String FName = "C:\genka\" + 年 + 月 + "\" test1() = Dir(FName + "*.csv", vbNormal) test2 = Dir(FName + "*.csv", vbNormal) test1()はデバック時にコンパイルエラー(配列には割り当てられません。)と出てしまいます。 test2はgenkaフォルダ内のcsvで名前の順で最初のファイル名が格納されているようです。 どのようにすれば巧く格納できるでしょうか? ご教授よろしくお願いします。
>375 ヘルプでredimとdirの使い方をしっかり嫁
いろいろいじってたら出来てしまいました。 お騒がせしました。
378 :
デフォルトの名無しさん :04/06/16 16:58
>>374 Function dRound(Expression As Double, NumDecimalPlaces As Integer) As Double
Dim s As Double
s = 10 ^ NumDecimalPlaces
dRound = Int((Expression + 0.5 / s) * s) / s
End Function
Sub test()
Range("A2").Value = 0.004: Range("B2").Value = Round(0.004, 2): Range("C2").Value = dRound(0.004, 2)
Range("A3").Value = 0.005: Range("B3").Value = Round(0.005, 2): Range("C3").Value = dRound(0.005, 2)
Range("A4").Value = 0.006: Range("B4").Value = Round(0.006, 2): Range("C4").Value = dRound(0.006, 2)
End Sub
379 :
デフォルトの名無しさん :04/06/16 22:15
私の頭ではさっぱり分からないのでお知恵をください。 処理したい内容がシート1上にあり、これを処理してシート2に結果を書いていく というプログラムです。 処理したい内容が膨大なので(5万5千行ほどある)処理中に 今の処理中の行を表示したいのです。”現在”+A+”行を処理中です。” とか。 ただ、セル上には表示したくないので MSGBOXを使おう と思ったんですが、これだと表示するたびにOKボタンを入力しないと 制御が次へ行きません。 MSGBOX で入力待ちにせず、ただ、表示だけする方法や 何か他にいい方法はないもんでしょうか?
>>379 >>380 の意見もまぁ考慮の余地はあるんだけど、、、
これは?(ただし俺はこれを実行したことは無い。動くかどうかのテストはそっちでやってくれ)
様は処理中であることをユーザーに示しておきたいってことだよね。
マクロ処理中にメッセージボックスで処理中の表示をする
sub main
DoEvents '読込ダイアログ表示
他のサブルーチンの呼び出し
Unload UserForm1
endsub
Private Sub UserForm_Activate()'ユーザーフォーム本体
MAIN
End Sub
Sub SHOWFORM1()
'読み込み開始ダイアログを表示
UserForm1.Show'→ユザーフォームに”処理中”
End Sub
383 :
デフォルトの名無しさん :04/06/16 23:05
皆さんありがとうございました。 ApplicationオブジェクトのStatusBarプロパティ これを使ってみようと思います。
384 :
デフォルトの名無しさん :04/06/16 23:13
>>378 CLng使ってきちんと四捨五入できるの作ったのですが
そちらの方が便利ですね
ありがとうございました。
386 :
デフォルトの名無しさん :04/06/17 11:35
Webサーバー上のCSVファイルをVBA(Excel)を使って読み込むにはどうするのが賢明ですか? ftpは使えないとして・・。
387 :
デフォルトの名無しさん :04/06/17 11:51
シェイプを移動させたときのイベントを受けることはできますか? Excel2000 です。 例)四角形を移動させたときに、他の四角形と重なったら警告する、等。
388 :
デフォルトの名無しさん :04/06/17 11:55
まさか!?と思い、やってみたんですが、やっぱりできません。
390 :
デフォルトの名無しさん :04/06/17 14:16
>>390 その csv ってまだあったんだ!?
価格.com のリニューアルの時にトップページにあった
「業者の皆様へ」とかいうリンクがなくなったから、
てっきりダウソできなくなったものだとばかり・・・。
vba とは関係ないがアリガd。
ACCESSのクエリーで、「ある日付に対し○ヶ月後の月末 例:平成16年6月30日の4ヶ月後・・・平成16年10月31日」を指定する関数をつくりたいのですが、是非ご教授下さいませ。
>>392 x月y日に対してzヶ月後の月末とは、(x+1+z)月1日の前日であるからして・・・。
394 :
デフォルトの名無しさん :04/06/19 01:16
VBAってFor文の中で任意のところでスキップさせるには どうすればいいのですか?
>>395 Loopを抜けないのであれば Goto ラベル
400 :
デフォルトの名無しさん :04/06/19 22:54
小数点以下第5位で四捨五入するようなプログラムを作ったんですが 小数点以下が0の場合表示されません。 たとえば結果が500の場合セルで500.0000ではなくそのまま500と表示されます。 小数点以下の0を表示させる方法はありませんか?
>>400 セルの表示形式を0.00000にしちゃだめなの?
やべっ、0が1つ多かった・・・。
>>400 セルの表示正式の変更を自動マクロで記録すれば、VBAで
どうすればいいか分かる。
>>401 ご返答どうもありがとうございます。
その方法を試してみたのですが
計算をし直すとき前回の結果は消し去るようにしたので
セルの表示形式の変更もなくなってしまっていたのです。
>>403 ありがとうございました。
自動マクロを使って何をやってるかわかり
ゼロの表示をプログラムからできるようになりました。
Excelに貼り付けた画像ファイルの中身を、マクロで変更させる方法がいまいち分かりません。 画像オブジェクト . 画像プロパティ =”ファイル名” みたいな形を取るんだと思いますが、そのオブジェクトとプロパティの設定させるのがうまくいきません。 VBオブジェクトでImageを配置して、その中身を変えるというのなら出来るのですが、 裏の画像が透けて見えるような処理が出来ないのと、 クリックしたときに地の色が出るので今やろうとしてる作業に不向きなんで・・・
406 :
デフォルトの名無しさん :04/06/20 18:45
配列に値を設定し、 Dim xvalues(10000) As Double Dim yvalues(10000) As Double ・・・ それをグラフのX軸、Y軸として表示したいんだけど、 直接設定はできないみたいですね .Value = yvalues .XValues = xvalues どうすればよいのですか
407 :
デフォルトの名無しさん :04/06/21 00:56
誰か〜アクセス2000でお助けを・・・ レポートで重複したデータを非表示にするVBAの構文ってしりませんかー レポートで重複したデータを非表示にするプロパティいじってもうまく いかないもんで・・ 今日一日かけて色々やったけどさっぱできんかった・・・ お助けを・・・
>>407 標準機能で納得できないのなら、どういう機能がほしいのか詳細に書くべきだな。
なお標準機能の使い方については他をあたってください。
409 :
デフォルトの名無しさん :04/06/21 21:52
すいません お知恵をください。 塗りつぶしてあるセルだけ、他のワークシートにコピーするような式ってありますか? 赤とかオレンジとか。
>>409 とりあえずこんな感じで。
Dim UsedCell As Range, CheckCell As Range
Set UsedCell = ActiveSheet.UsedRange
Application.ScreenUpdating = False
Sheets("Sheet2").Activate
For Each CheckCell In UsedCell
If CheckCell.Interior.ColorIndex <> xlNone Then
CheckCell.Copy
Range(CheckCell.Address).Select
ActiveSheet.Paste
End If
Next
Application.CutCopyMode = False
Application.ScreenUpdating = True
Set UsedCell = Nothing
てきとーに変えて使ってください。
>>408 失礼しやした。
非常に複雑な構成でして・・・
一言で言えば、レポートで重複したデータを非表示にするVBAっす。
具体的にいうと
テーブルAとテーブルBという二つのテーブルがあります。
テーブルAは「問題年度」「問題番号」「問題の中の選択肢」
というフィールドがあります。
たとえば「平成14年度、第5問、選択肢A」で上記三フィールドを使用します。
テーブルBには「問題年度」「問題番号」「問題全文」
というフィールドがあります。
「平成14年度、第5問、甲は〜をし、こうした。選択肢A、選択肢B(略)」
で上記3フィールドを使用します。
このテーブルAとテーブルBを「問題年度」「問題番号」で共通するものをリンクしております。
で、レポートとしては
「平成14年度」「第5問」「選択肢A」
「問題全文」
「選択肢A」
「平成14年度」「第5問」「選択肢A」
「選択肢B」
「平成14年度」「第5問」「選択肢A」
「選択肢C」
「平成14年度」「第6問」「選択肢A」
「問題全文」
「選択肢A」
というように表示したいのですが・・
レポート上で「問題全文」のテキストボックスの重複非表示の設定を「はい」にしても
「問題全文」が「選択肢A」〜「選択肢C」の上に毎回表示されてしまうんです。
そこで、これをVBAでなんとかできんものかと・・・
よろしくお願いします。
クエリじゃだめなん?
>>411 そのレポート、さっぱりわからんので
俺としては
「平成14年度」「第5問」
「問題全文」
「選択肢A」
「選択肢B」
「選択肢C」
「平成14年度」「第6問」
「問題全文」
「選択肢A」
と表示してほしい。
>>410 ありがとうございます!さっそくやってみます
お忙しいところすいませんでした。
416 :
デフォルトの名無しさん :04/06/22 15:49
現在選択されている図形オブジェクトを判断するにはどうしたら良いでしょうか?
>>416 TypeName(Selection) とか Selection.Name とか。
てすと
>>417 ありがとうございます。
Selection.ShapeRange
で解決しました。
ハマってた原因は複数のオブジェクトが選択される可能性があるのに気づかなかったことでした。
Excel97だと、WhatsThisHelpがFalseの時に「F1」で設定しているヘルプが表示されるのに Excel2000以降だとTrueじゃないと表示されないのは仕様でしょうか?
422 :
デフォルトの名無しさん :04/06/25 17:51
AccessVBAで困ってます。 コンボボックスにDBから検索してきたものを二列表示させているのですが コンボボックスを選択すると左側の列が表示されます。 二列目の項目を選択後にコンボボックスに表示させるにはどのようにすればよいのでしょうか? ご教授よろしくお願いします。
コンボックス名.column(列番号) ※列番号は左端から0,1,2・・・なので2列目は1
424 :
デフォルトの名無しさん :04/06/26 16:38
ExcelVBAで神々の方からの回答お願いです。 スピンボタンで画像が次々とめくれるようにするにはどうしたらいいでしょうか? 例えば写真つきの社員名簿みたいのを想像してください。 ユーザーフォームにテキストボックスを配置してそこには文章を表示するように 出来たのですが、画像をどうしたらいいのか悩んでいます。 loadpicture関数を使って出来そうなのですが俺の技術では無理っぽいっす。 神様方、助けてやってください。 参考になるWebのリンクでも結構ですので貼り付けてください。 たのんます。
>>424 やってみたコードを提示してみてください。
解決しました。
>>424 = 426
"解決しました"じゃねぇだろ。どのように解決したか位書けよ。
ノ∩
⊂ >>
/( 。A。 )っ←
>>424 =426=428
U ∨ ∨
・@;∴‥
∧_∧ ∩ :: :.
( ・∀・)/ :: ::
(つ / :: :'
人⌒l ノ :: ::
し(_)
質問なのですが、ダブルクォーテーションを文字列で表示させたいんですが、どうすればいいのでしょうか?
>>431 MsgBox Chr$(&H22) & "ダブルクォーテーションを表示させたい !!" & Chr$(&H22)
431さんに便乗ですが質問させてください。 431さんのようにCONCATENATE関数や&で繋ぐ場合そのままだとうまく いかないのでxlsファイル上で見えるようにするには、例えばほかのワークシート に置いておいてそこから絶対参照を使って上記の関数などで繋げれば表示される ようになりますが、それをcsvやtxtなどで保存すると"が"""になってしまっています。 しょうがないので現状では文字列は他の記号で保存をして後でエディタ等で置換 をしているのですがVBAなどで一気に処理できるようにはならないでしょうか? VBAは初心者です・・
>>433 これがなんで4つか今だ理解できない漏れ。他にいろんなパターン打ってみたけど
いったいどうやって判定してるのだか。
" "" "
なんで3つじゃないんでつか? MsgBox """でエラー MsgBox """"で「"」???
>>438 Cで言うとこの原理だ。"\\" -> \
>>440 VBってそう言う言語だな。
思想や指向はなく、ただただ仕様と。
442 :
デフォルトの名無しさん :04/07/08 18:22
すびばせん。 Excelの既存のメニューの動作を乗っ取りたいんですが、 方法があれば、教えてください。 Wordだと、[ツール]→[ユーザー設定]→[コマンド]タブの 「すべてのコマンド」の中にある項目と同じ名前のメソッドを VBAで作るとオーバーライドできますが、 Excelで同じようなことはできますか?
443 :
デフォルトの名無しさん :04/07/10 01:06
自動でつけられたグラフの名前を変更するにはどうすればいいですか?
計算というシートのL1からL22までのセルを シートが保護されている記録というシートに行と列を入れ替えて 貼り付けます。 貼り付ける場所はA列の一番したです。 なぜか実行時エラー1004 rangeクラスのpastespecialメソッドが失敗しました。 と出たり出なかったりします(交互に)。 分かる方いません? 明日の課題が。。。(汗) Sub module1() Sheets("計算").Select Range("L1:L22").Select Selection.Copy Sheets("記録").Select 'ActiveSheet.Unprotect password:="unlock" 下端 = Range(Cells(3, 4), Cells(3, 4)).End(xlDown).Row + 1 範囲 = "A" & 下端 Range(範囲).Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True ActiveSheet.Protect "unlock", DrawingObjects:=True, Contents:=True, Scenarios:=True Sheets("計算").Select ActiveWorkbook.Save '上書き保存 Application.DisplayAlerts = False 'メッセージを出さない 'ActiveWorkbook.Close '閉じる End Sub
分かりました。 保護の解除を先頭にもってきたらOKになりました。 お騒がせしました。 Sub module1() Sheets("記録").Select ActiveSheet.Unprotect password:="unlock" Sheets("計算").Select Range("L1:L22").Select Selection.Copy Sheets("記録").Select 下端 = Range(Cells(3, 4), Cells(3, 4)).End(xlDown).Row + 1 範囲 = "A" & 下端 Range(範囲).Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True ActiveSheet.Protect "unlock", DrawingObjects:=True, Contents:=True, Scenarios:=True Sheets("計算").Select ActiveWorkbook.Save '上書き保存 Application.DisplayAlerts = False 'メッセージを出さない 'ActiveWorkbook.Close '閉じる End Sub
保護のオプションによっては、 保護を解除しなくても、VBAで変更かけることができるぞ。
447 :
デフォルトの名無しさん :04/07/15 10:43
シートに含まれているマクロを開放することの出来るマクロを作成することは可能でしょうか?
449 :
デフォルトの名無しさん :04/07/16 16:02
ブックに含まれているマクロの一覧を得るにはどうしたら良いでしょうか?
450 :
デフォルトの名無しさん :04/07/16 17:00
すいません ちょっと方法が思いつかないので質問させてください チェックボックスを一括してコレクションに突っ込みたいわけですが With chkboxCollection .Add item:=CheckBox1 .Add item:=CheckBox2 .Add item:=CheckBox3 .Add item:=CheckBox4 .Add item:=CheckBox5 .Add item:=CheckBox6 .Add item:=CheckBox7 End With では効率が悪すぎます かといって For intCount = 1 To intChkcount chkCollection.Add item:=OLEObjects("CheckBox" & intCount) Next intCount とするとチェックボックスではなく"checkbox1"という「文字列」が 突っ込まれてしまいます 良い方法はないでしょうか
Dim obj as Object With chkboxCollection For Each obj In Oleobjects If left(obj.name,8)="CheckBox" Then .Add item:=obj Next obj End With
フォームのコンボボックス(例:"Drop down 1")の コントロールの書式設定の入力範囲 をプロシージャで変更(例:sheet2!$B$2:$B$3)するには どうすればよいのでしょうか?
455 :
デフォルトの名無しさん :04/07/21 01:59
こんばんは。 VBAでワークシートをコントロールするプログラムを開発しているのですが、 ワークシート上に作成したピボットテーブルの行のグループ化のコントロールの所で 詰まってしまいました。 Range("A5").Select Selection.Group Start:=True, End:=True, Periods:=Array(False, False, False, _ False, True, False, False) で、グループ化そのものはできたのですが、その後、グループ化の状況を確認するために グループの情報を得る方法がどうしてもわかりません。 どなたか、教えてください!
456 :
デフォルトの名無しさん :04/07/21 17:38
プロジェクトの保護について教えてください。 プロジェクトにパスワードを設定する方法だと、世の中には パスワードを破るソフトがあるようなので、あまり信頼できません。 Excel VBA Lockっていうシェアウェアでプロジェクトの保護を 破られないようにすることが出来るそうですが、これはどれくらい安全 なんでしょうか?(100%破られることは無いと考えて良いのでしょうか?) もし、そうならば、利用したいのですが。
457 :
デフォルトの名無しさん :04/07/23 12:58
テキストファイルを読み込んで、半角スペース区切りに データの区切りを行いたいと思います。 データ1 データ2 "データ3" データ4 データ3となっている部分は、そのまま半角スペースを目印に 区切るとデータ3の途中で分割されてしまいます。 すでにテキストファイル上でも"と"の間という目印はありますが どのように処理をすればうまくデータ区切りができるでしょうか。 ご教授をいただければ幸いです。
元のテキストデータはどうなってるの?
459 :
デフォルトの名無しさん :04/07/23 14:04
>>458 年月日時分秒 名前 "コメント" 生息地
20040723123030 名無しさん "もう だめぽ" 浜松市
のようになっているものを、
年月日時分秒,名前,"コメント",生息地
20040723123030,名無しさん,"もう だめぽ",浜松市
という区切りにしてExcelのシートに自動的に貼り付ける
仕掛けを作りたいのです。
"コメント"の文字数が変化するので、
何文字目で区切るという芸当は使えません(泣
基本的にスペースで分けて、 スペースの次にダブルクォーテーションがある場合は、 ダブルクォーテーションの次にスペースがあるところまでを一つにすれば?
エクセルのメニューの 「ファイル」「開く」を使うのじゃなくて、 「データ」「外部データの取り込み」「テキストファイルのインポート」の方を使うとよい。
With ActiveSheet.QueryTables.Add(Connection:="TEXT;C:\Temp\gomi.txt", _ Destination:=Range("A1")) .Name = "gomi" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = xlWindows .TextFileStartRow = 2 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = True .TextFileTabDelimiter = False .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = False .TextFileSpaceDelimiter = True .TextFileColumnDataTypes = Array(2, 2, 2, 2) .Refresh BackgroundQuery:=False End With
463 :
デフォルトの名無しさん :04/07/24 13:09
はじめまして。 VBAで作成したユーザー定義関数をEXCELワークシートのセルから呼出す際に、 通常のワークシート関数のように引数のバルーンヘルプのようなものを出すにはどうしたらよいのでしょうか? どなたかわかる人がいたら教えてください。
Function hogehoge(fugafuga As Integer) As Integer 中身 End Function これで出ない?
質問です Excelを印刷する時に特定のオブジェクトだけを印刷させない方法ってありますか?
すいません 普通にObjectのプロパティにありました PrintObjectをFalseにすればいいだけでした^^; お騒がせしました^^;;
作ったVBAマクロを他人に配布する方法でもっともスマートな手法を教えてください。
469 :
デフォルトの名無しさん :04/07/29 21:59
>467 何をもって、スマートとするのか? 現在どのようの方法を用いていて、問題点は何か?
>>467 スマートメディアにコピーして配布するのがいちばんスマートだわな。
CD-Rに焼いて渡す。 小さい方が好ましい。
説明不足かつ遅レスでスミマセン。 あるExcel VBAマクロを作ったんです。で、それを他の人(十数人)にも使わせたいのです。 で、とりあえず、VBEditorでプロジェクトエクスプローラで、標準モジュールにして、 それをエキスポートし、その(*.bas)ファイルを渡したのです。 で、それを各自のExcelのVBEditorでpersonal.xlsにインポートしてもらいました。 しかし、この方法は手間が多いのでもうちょっとサクッと配布&インストールする方法が無いかなぁ、と思ったのです。 使う人達は素人同然なので... ちなみに私は普通のVBは使ってますが、Excel VBAは初心者です。
>>473 マクロウイルス的手法でインストーラを作成するのは可能だと思いますが、現状の方法が一番素直だと考えます。
>>473 アドイン化すれば?
そうすれば、Application.AddIns.Add一発でインストールできるよ。
476 :
デフォルトの名無しさん :04/07/31 06:08
エキセル
どうもです。
遅レスで申し訳ない...
>>474 なるほどです。
自分の方法におかしな点が無さそうなのは救いです。
>>475 アドイン化?
調べてないので良く分かりませんが、定番な手法なんでしょうか?
一応ググってみます...
Sub まとめて() a = 61 For a = 61 To 1891 Step 60 Rows(a).Rows.Select Application.Union(Rows(61), Rows(a)).Select Next a End Sub 61行から1891まで60行おきに全て選択したいんですが、うまくいきません。 選択されるのは最初の61行目だけです。アドバイスお願いします。
>>478 Sub まとめて()
Dim RowNum As Long
Dim SelectRange As Range
For RowNum = 61 To 1891 Step 60
If SelectRange Is Nothing Then
Set SelectRange = Rows(RowNum)
Else
Set SelectRange = Union(SelectRange, Rows(RowNum))
End If
Next RowNum
SelectRange.Select
Set SelectRange = Nothing
End Sub
>>479 本当に助かりました、ありがとうございました。
481 :
デフォルトの名無しさん :04/07/31 19:09
>>473 テンプレートフォルダにマクロの入ったファイルを置いておくだけで、マクロが呼べるようになるよ。
あと、ワークグループテンプレートを使えば、マクロを配布しなくても、
LAN上の共有フォルダにマクロを置いておけば呼べるようになる。
フォルダの設定は、「オプション」の「既定のフォルダ」を見ろ。
エクセルのVBAなんですが B列に「りんご」、「もも」、「なし」・・・ と入れていって 重複した名前・・・例えば「りんご」を再び入れたら 「もう入ってるよ!」とメッセージが出るようにしたい場合 どうすれば良いんでしょう?
>>482 シートモジュールに
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If WorksheetFunction.CountIf(Range("B1").Resize(.Row - 1), .Value) > 0 Then
MsgBox "もう入ってるよ!"
End If
End With
End Sub
をコピペ。
>>483 早速お返事感謝します
For Nextの方ではまってしまい
WorksheetFunctionを使うなんて想像もしてませんでした
本当に助かりました。有難うございます!
485 :
デフォルトの名無しさん :04/08/06 22:24
本当にvbaの初心者なので申し訳ございません。 keycode=0 というセンテンスですが どういう意味なのか教えてくれませんか?
>>485 KeyCodeには、キーボードで押したキーの定数が入ってきます。
そのKeyCodeに0を代入すると、その押されたキーは無効になるということです。
例えば、テキストボックスのKeyDownイベントに
If KeyCode = vbKeyA Then KeyCode = 0
と書くと、アルファベットのAは入力出来なくなります。
ウインドウ枠の固定とは別に A1:J8を固定(スクロールで動かない)ように する方法ってありますでしょうか?
489 :
デフォルトの名無しさん :04/08/09 23:55
エクセルのVBAで「現在行を選択する」ってどうやるのでしょう? 行番号を指定して選択するのは簡単ですが 現在のカーソルのある行を指定する方法がどうしてもわからず困っています。
>>489 Rows(ActiveCell.Row).Select
492 :
デフォルトの名無しさん :04/08/10 23:54
誘導されました パワーポイントでのVBAです、 やりたいことは、 1.特定のオブジェクトのプロパティをコピーして 2.選択した同種のオブジェクトに適用したい です。 2の動作の前にプロパティ値の確認&書き換え可能なポップアップを出したいです。 よろしくお願いします。 対象とするオブジェクトのプロパティは吹き出しや曲線矢印のトグルなど、アプリケーション上のプロパティでは設定が出きないものです。
ツール->マクロ->VB editor のヘルプに shape とつっこんで、 Shapeオブジェクトからたどれるところを全部見ろ。 LineプロパティのLineFormatオブジェクトのプロパティのところと、 CalloutプロパティのCalloutFormatオブジェクトのプロパティのところあたりが 役に立つかもしれん。 ダイアログの出し方とかの基本的なとこは、 PowerPointとは独立だから別途勉強しろ。 勘とセンスがあればかなりのことはVB editorのヘルプでなんとかなる。
495 :
デフォルトの名無しさん :04/08/12 01:30
末尾の部分が \タブ\改行 \EOF という ファイルがあって \改行 \EOF のように\タブの部分を消したい場合どうすればいいのでしょうか? 2時間悩んでます・・・・ seek()メソッドを使えばよろしいのでしょうか? お願いします。
tabclear()を使ってください
すいません説明が不足していました。 エクセルファイルからセルをタブ区切りでCSVファイルに出力させる作業をやっています。
vbTabを検索して削除だな。
>>496 >>498 ありがとうございます
説明がなっていなくてで本当に申し訳ございません・・・
最後のタブだけを削除したかったのです。
ファイルの末尾から検索(ループ検索)してvbtabを削除することは可能なんでしょうか?
ファイルタイプをCSVファイルでSaveAsしたほうが早そうだな。
501 :
デフォルトの名無しさん :04/08/12 03:06
Excelで作成したグラフをgifに出力して、それをFTPでアップロードしたいのですが、 FTPでのアップロードがうまくいきません。 こんな感じのソースです。 Dim strPNAME As String 'パラメーターファイル名 Dim nFNO As Integer 'ファイル番号 strPNAME = ThisWorkbook.Path & "\ftptest.txt" 'ftpコマンドファイル作成 nFNO = FreeFile '空いてるファイル番号を取る Open strPNAME For Output As #nFNO 'データ書き込み Print #nFNO, "open xxx.xxx.xxx" ' ホスト名 Print #nFNO, "userID" Print #nFNO, "password" Print #nFNO, "cd public_html" Print #nFNO, "put " & ThisWorkbook.Path & "\graph.gif" Print #nFNO, "quit" Close #nFNO Shell "ftp -n -s:" & strPNAME 対処方法をご存知の方がいましたらお教えください。
>>495 いっそのことテキストファイル生成してcsv(形式)になるように手動で書き込んでく、とか。
>496 tabclear() なんてあったっけ?
>>503 昔あったよ、透明のコーラ。おいしくなかったな
俵孝太郎……
その精液は「透明なコーラ」と称され、当時のゲイの方々に愛飲された。
507 :
デフォルトの名無しさん :04/08/14 20:53
16進数を10進数に変換する関数ってありますか? セルに色つけたいんですが、元データが16進数で、RGB関数は10進数なので変換しないと・・・
>>507 16進文字列の長さが0になるまで{
返値に16を掛ける。
16進文字列の前1文字を取り出す。
取り出した16進1文字を0〜15の10進に変換する。
返値に変換した10進を足す。
16進文字列の前1文字を削除する。
}
>>508 ありがとうございます。
一発変換はできないのですねぇ・・・_| ̄|○
>>507 Colorプロパティに16進数をつっこむ。
Range("A1").Interior.Color = &HFFF
>>511 どうもです
&Hですか。0xでやってました。出直してきます...λ
アドインの"分析ツール"を組み込めば、そのまま、hex2decという名前の関数があるのだが。 VBAでも使いたいにゃら、"分析ツール - VBA"アドインも組み込んであげて下さい。
515 :
デフォルトの名無しさん :04/08/17 11:35
A列に日付、B列にデータを入力してグラフを作成。 B列には順次データが追加される。 常に最新のデータを含んだグラフに更新するにはどうすれば良いのでしょうか? これだと、エラーになってしまいます。 Sub graph4() Sheets("graph(1988〜)").Select ActiveChart.SetSourceData Source:=Sheets("data").Range("A6", Range("B6").End(xlDown)), PlotBy:= _ xlColumns End Sub
>>515 以下のような感じでうまくいきました。試してみてください。
Sub graph4()
Sheets("graph(1988〜)").Select
ActiveChart.SetSourceData Source:=Sheets("data").Range("A1:B" & Split(Sheets("data").Range("A1").End(xlDown).Address, "$")(2)),PlotBy:=xlColumns
End Sub
517 :
デフォルトの名無しさん :04/08/19 10:37
四角形や線などの図形オブジェクトの名前を知ったり、変更するにはどうすればよいでしょうか? VBだと、オブジェクトのプロパティで簡単にできますよね。 現在は、名前を表示するには、以下のようなマクロを実行。 Sub ActiveShapeName() Debug.Print Selection.ShapeRange.Name End Sub 名前を変えるには、イミディエイトウィンドウで selection.shaperange.name = "新しい名前" のようにしているのですが、かなり面倒です。 良い方法はありませんでしょうか?
VBAのユーザーフォームってBorderStyleは可変にできないのでしょうか? フォームの最大化(サイズ変更)を自由にさせたいのですが…
>>518 Private Const GWL_STYLE = (-16)
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_THICKFRAME = &H40000
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
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 Sub UserForm_Initialize()
Dim lngWnd As Long
lngWnd = FindWindow("ThunderDFrame", Me.Caption)
SetWindowLong lngWnd, GWL_STYLE, GetWindowLong(lngWnd, GWL_STYLE) Or WS_MAXIMIZEBOX Or WS_MINIMIZEBOX Or WS_THICKFRAME
End Sub
>>519 ありがとうございます! 早速試してみます
main(){ 何かの処理その1 printf("AAAAA");←1番目は最初からある printf("BBBBB");←2番目はここに追加 printf("CCCCC");←3番目はここに追加 printf("DDDDD");←4番目はここに追加 何かの処理その2 } ユーザが任意で二番目以降n番目までのprintf〜を追加し、エクセルのシート に出力するVBAを作るにはどうすればいいのですか?
522 :
デフォルトの名無しさん :04/08/26 18:51
Excel2000のVBAヘルプでキーワード入力等にマウスを持って行くとカーソルが←→になって入力ができなくなりました。 どうすれば直りますか?
シートを並べ替えるコードを教えて下さいm(__)m(Excel2000)
日本語(文字数:不定)+数字という感じなんで文字コード順でいいんですけど、 よろしくお願いしますm(__)m。
>>525 workという名前のシートを作成してから実行してください。
Sub test()
Dim i As Long
Sheets("work").Activate
Columns("A:A").Select
Selection.ClearContents
Range("A1").Select
For i = 1 To Sheets.Count
Cells(i, 1).Value = Sheets(i).Name
Next
Range("A1:A" & Sheets.Count).Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin
Range("A1").Select
For i = 1 To Sheets.Count
Sheets("work").Activate
Sheets(Cells(i, 1).Value).Move after:=Sheets(i)
Next
End Sub
>>527 お礼がおそくなり、すいませんでした。やってみたらばっちりです。感謝m(__)m。
これってsheet名 workにブック内のシート名を書き出して、ソートし、その結果を
元に並べ替えているんですよね?
なにはともあれ、有難うございました。
お知恵をお貸しください。 ユーザーフォームのコマンドボタンから他のexcelシートを呼び出しています。 ユーザーフォームをhideにしないとそのexcelシートが触れないのですが、 hideにしてしまうと呼び出したexcelシートからユーザーフォームへ復帰ができません。 呼び出したシートにはなるべくコードを書きたくないので、 下の様なコードを呼び出し側のシートに書いたのですが、 Activateイベント自体を拾えないようです。 2つ目のexcelを閉じる→一つのexcelがactiveとはならないのでしょうか? xxフォーム Cmd_Click me.hide Workbooks.Open Filename:=CurrentPass & "\" & fname xxフォームのあるexcelシート Private Sub Worksheet_Activate() xx.Show
>>529 UserForm1.Show vbModelessではだめですか?
>530 ありがとうございます。 やってみたがだめでした。 (xxフォームを開くときにvbModelessでいいんですよね?) フォームがシートの上にあってシートクリックしても前面に出ないのです。 よけて入力するにはフォームが大きすぎて・・・ zorderみたいなものがあればいいのですが。
ヘッダーを作成するプログラムを作っているのですが 変数って使えますか?
533 :
デフォルトの名無しさん :04/09/07 12:58
以前に作成したプロジェクトにロックをかけてしまい、そのパスワードを忘れてしまったので すが、解除するソフトってありますか? フリーで結構出回っているということなのですが・・・
その程度ググれないなら使うな
いつまで夏のつもりだ?
現在いじくっているワークシートが 先頭から何番目なのかわかる方法ないでしょうか?
540 :
デフォルトの名無しさん :04/09/11 21:06:21
壁に当たっています。 A1のセルの内容が”22,23”のようにカンマを使って区切られている場合はそれを B2に”22”B3に”23”と分けて出力し、セルの内容が”123”というようにカンマを使われてない 場合はB2に”123”と出力するようにしたい場合はどうすればよいでしょうか? またさらに”port 22,23”というようなセルがあった場合それをB2とB3に”port 22” ”port 23” という風に分けて出力する方法はあるのでしょうか? いずれの場合も区切られている記号はカンマのみで他の記号の場合は分割する必要はありません。 まだ始めたばかりなせいかIfとFindを使うんだなぁくらいしか思い浮かばず 何をどうすればいいか見当もつきません。どなたか宜しくお願いします。
自己レスすいません。 前レスでsplit関数なるものを見つけまして、最初の数字だけのセルだったら Sub test() Dim A() As String A = Split(Cells(1, 1).Value, ",", 2) Cells(1, 2).Value = A(0) Cells(1, 3).Value = A(1) End Sub で何とかなることがわかりました。 ただ二つめの文字列と数字の混合してあるようなセルの場合に対処することが出来ません。 どうか宜しくお願いします。
>>540-541 A列の処理したいところを選択してから下のマクロを
実行してみてください。
Sub Test()
Dim CheckCell As Range
Dim TextHead As String
Dim TempText As Variant
Dim TextSource As String
Dim i As Long
For Each CheckCell In Selection
TextHead = ""
TextSource = CheckCell.Value
If InStr(1, TextSource, " ") > 0 Then
TempText = Split(TextSource)
TextHead = TempText(0) & " "
TextSource = TempText(1)
End If
If InStr(1, TextSource, ",") > 0 Then
TempText = Split(TextSource, ",")
For i = 0 To UBound(TempText)
CheckCell.Offset(0, i + 1).Value = TextHead & TempText(i)
Next i
Else
CheckCell.Offset(0, 1).Value = TextHead & TextSource
End If
Next CheckCell
End Sub
B2とB3か・・・間違えた。 それぞれ以下のように書き換えてください。 CheckCell.Offset(0, i + 1).Value = TextHead & TempText(i) →CheckCell.Offset( i + 1,1).Value = TextHead & TempText(i) CheckCell.Offset(0, 1).Value = TextHead & TextSource →CheckCell.Offset(1, 1).Value = TextHead & TextSource
>>542 さん。どうもありがとうございます。
まだどんな処理しているか分からないですけどとりあえずコピペして試してみたら
やりたいことが出来ました!
しかも理解しやすい変数を使って頂きありがとうございます。これからどのように動いているか
調べます。本当に助かりました。
どうもありがとうございました。
545 :
デフォルトの名無しさん :04/09/12 02:22:12
お力をお貸し頂けたらと思い書き込みさせていただきます。 別々の人がAccessを使って作った顧客管理ソフト?が2つ(A・B) あります。 外部から電話がかかってくると常駐してあるAに切り替わります。 画面上には電話番号・顧客登録で登録した氏名・会社名等を表示す る横長のフォームがあり、そこに上記の情報が表示されます。 そこには「表示」ボタンがありそれを押すと「顧客管理フォーム」 が表示され、電話をかけて来た顧客の情報画面が表示されます。 しかしAの顧客情報画面よりBのソフト方のが登録できる顧客情報 が多いので、Bの方の顧客情報画面を表示させたいのです。 ちなみにBで顧客情報画面を出すには、Bを起動後メインメニュー から電話番号検索を選びそこに電話番号を入力し検索すると検索結 果が表示されその画面上にある顧客情報ボタンを押すと顧客情報画 面が画面が表示されます。 ここで行いたい処理の流れを整理すると 電話がかかってくる→Aが起動する→フォームに電話番号などの 情報が表示される→画面上のボタンを押す→Bが起動→Aで表示 されている電話番号を元に検索→「顧客情報画面」を表示 ということなのですが、このようなことはVBAでは可能なのでし ょうか?可能ならばどの様なプログラムになるのでしょうか? 多分説明(情報)不足ではありますが宜しくお願いします。
>>545 同僚がこんな仕様書書いてきたら怒鳴りつける。
>>545 できる
要するに、別のファイルを開いて変数を渡すってだけでしょ・・・
塚、そのカキコの様子ではVBAの知識ゼロだべ
イチから説明せにゃならんのか?
>>545 その顧客管理ソフトを作った人たちに相談したら?
with range("A1:E10") ~~~~~~~~~~~~~~~~~~ .value = ... ActiveChart.SetSourceData Source:=range("A1:E10") ... ~~~~~~~~~~~~~~~~~~ end with この2ヶ所が重複してしまうのですが、良い指定方法はありますでしょうか (C++のthisの様な物を探しているのですが…)
With使わずに、若しくは使う前に一時変数に保持しといたら?
>>550 一時変数とか言わんでクレ。なんか構造化すらできない言語のように聞こえる・・・。、
特に深い意味はなかったんだが… ローカル変数とでも読んどいてくれ…
被捕食者の数N、捕食者の数Pとするとき、ロトカ・ボルテラの式 dN/dt=r*N-a*N*P dP/dt=-s*P+b*N*P (r,s,a,bはいずれも定数) を、修正オイラー法で近似して、グラフ(横軸:時間t、縦軸:個体数)をシミュレーション、 個体数が2つの波となって周期的に振動する様子を確認せよとの課題が出た。 被捕食者の数は、 N(t)'=N(t-1)+{r*N(t-1)-a*N(t-1)*P(t-1)} 「仮の値」 N(t)=N(t-1)+[ {r*N(t-1)-a*N(t-1)*P(t-1)}+{r*N(t)'-a*N(t)'*P(t)'} ]/2 「修正した値」 捕食者の数は、 P(t)'=P(t-1)+{s*N(t-1)*P(t-1)-b*P(t-1)} 「仮の値」 P(t)=P(t-1)+[ {s*N(t-1)*P(t-1)-b*P(t-1)}+{s*N(t)'*P(t)'-b*P(t)'} ]/2 「修正した値」 だそうだが、y=at+b だの、y=exp(-r*t) だのみたいにもう変数tの式になってるような関数しか今まで 見てないのに、「N(t)=N(t-1)+・・・」とか、関数が関数で表現されてる時点で自分にはもうワケワカメ。 結局NやPを表す式がどうなるのか皆目検討もつきやせん。 「ロトカ・ボルテラ」や「VBA]なんかの単語をを必死で組み合わせてググッてしらみつぶしに見ていったけど 徒労に終わっちゃい、もはやここしか当てのなくなった初心者学生ですが、誰か救いの手を〜
みようみまねの作成途中のやつ。肝心の中身が何にもできてないので「骨組み」とすら呼べんが・・・ これだけすでに「おまえ本当に知識0だろ」と指摘されそうな悪寒。 Dim N As Double, P As Double, a As Double, b As Double, t As double, Dim N0 As Double, P0 As Double Dim n As Integer r = InputBox("被捕食者増加率") s = InputBox("捕食者死亡率") a = InputBox("被捕食者死亡率") b = InputBox("捕食者増加率") N0 = ?? P0 = ? t = 0 With Worksheets("Sheet1") .Cells(5, 5) = "r" .Cells(5, 6) = r .Cells(6, 5) = "s" .Cells(6, 6) = s .Cells(7, 5) = "a" .Cells(7, 6) = a .Cells(8, 5) = "b" .Cells(8, 6) = b For t = 1 To 100 n = n + 1 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 .Cells(n, 1) = N .Cells(n, 2) = P Next t End With End Sub
556 :
デフォルトの名無しさん :04/09/14 18:39:09
ファイルオープンダイアログを カレントディレクトリで開くにはどうすればいいですか?
>>554 漸化式を知らないということは中学生位かな?
まず
P(t)'=P(t-1)+{b*N(t-1)*P(t-1)-s*P(t-1)}
という所から直してね。
>>556 任意の場所で開く場合
ChDir "C:\"
Call Application.GetOpenFilename
>554 >「ロトカ・ボルテラ」や「VBA]なんかの単語を その前に、オイラー法を勉強すること。 修正オイラー法の前に、前進のオイラー法ね。 y'=yとかy'=cos(y)とか解いてみて、振動問題でまずいことになってから修正オイラー法を試す。
560 :
デフォルトの名無しさん :04/09/18 11:41:51
入力規則をユーザーが変更できないようにマクロで固定 する方法を教えてください。 半角英数のみしか入力できないセルを作成したいです。
質問です。 全シートを一括でAutoFit死体のですが、以下のコードでは Sheets.Selectする前にアクティブだったシートしかAutoFitされません。 ー ソース − Sheets.Select Cells.EntireColumn.AutoFit Cells.EntireRow.AutoFit 教えてえっちぃ人。
>>561 こうかな。
Dim WS As Worksheet
For Each WS In Worksheets
WS.Cells.EntireColumn.AutoFit
WS.Cells.EntireRow.AutoFit
Next
>>563 なる程。ワークシートの子要素の数だけループするのですか。
しかもシートをselectする必要無しですね。
( ・∀・)ウマクイッタヨ ステキダヨ カシコイヨ ヌルポ
でもなんで漏れのコードどで思い通りの動きにならなかったのか謎。
>>564 Cells.EntireColumn.AutoFit
シートオブジェクトを省略すると、アクティブシートが
対象になると思うんだけど。
566 :
デフォルトの名無しさん :04/09/20 11:12:06
Excel VBAの初心者なんですが、 Excel起動時にフォームを表示させているのですが そのフォームが表示されていると、 他の動作がすべてロックされていますが これはなぜなんですか? 例えば セルの選択や、ワークシートの切り替えも出来なくなっています。 ツールバーも使用できなくなってます。 フォームを閉じると普通に戻るのですが・・・ 何か設定することでもあるのですか?
>>566 デフォルトでモーダル表示だから。
モードレスにするなら
UserForm1.Show vbModeless
とする。ただし、97では不可。
568 :
デフォルトの名無しさん :04/09/20 16:41:24
>>92 >VBA歴1日の超初心者ですが、ヤフーへの自動ログインマクロを
>作って居たところ、input name=".save" となっていて、
>"objIE.document.all..save.Click"と、
>記述すると文法違反になってしまいます。
>
>良い知恵はございませんでしょうか?
もし解決されていたら方法を投稿して頂けませんか?
同じ問題で3日悩んでます(泣
access2000のVBAで、 テーブルの項目名を取得するにはどうすれば よいのでしょうか? 結構いろんなサイトを探したのですが載っていません どなたか教えたください。よろしくお願いします。
Dim rs As Recordset Dim fld As Field Set rs = CurrentDb.OpenRecordset("テーブル1") For Each fld In rs.Fields MsgBox fld.Name Next ・ ・ ・
>>570 様
できました!!
本当にありがとうございます。
前々からこの部分だけが解らず、ひっかかっていました。
感謝です。
セルの照合をするプログラムを作っています。 ”管理”というワークシートのB列に物品の管理番号、C列に物品番号。 ”検索”というワークシートのB列に管理番号を知りたい物品番号。 が入力されてます。 検索シートでマクロを実行させると検索シートのB列の右側に管理番号が表示されるよう ことが目的です それで以下のようなコードを記述しました。 Sub 検索() Dim objRange As Range Dim l As Long Dim m As Long Dim n As Long Dim i As Long Dim j As Long l = 5 m = 3 i = 4 j = 2 n = Cells(Worksheets("管理").Rows.Count, 1).End(xlUp).Row
next0: Do Until y = z + 1 If Worksheets("管理").Cells(l, m) = Worksheets("検索").Cells(i, j) Then Worksheets("検索").Cells(i, j + 1) = Worksheets("管理").Cells(l, m - 1) GoTo next1 Else m = m + 1 End If Loop next1: If Cells(i + 1, j) = Empty Then GoTo finale Else i = i + 1 GoTo next0 End If finale: MsgBox "検索が終了しました。" End Sub
このように記述して実行したところ If Worksheets("管理").Cells(l, m) = Worksheets("検索").Cells(i, j) Then の箇所で、実行時エラー 1004 アプリケーション定義またはオブジェクト定義のエラーです。 と言われてしまいました。 ちょっと自分ではどこがいけないのか分からないのでどなたか悪いところを教えて頂けないでしょうか? 宜しくお願いします。
575 :
ゆう :04/09/20 17:48:19
私は老人ホームで働いているゆうといいます。 ショートステイという業務があり非常に多忙です。 そこでエクセルのVBAを使用してなんとか業務を改善したいのですが、 どなたかボランティアでプログラムを作成してくださる方はおりませんか? 私もVBAはほんの少しならわかるのですが、業務が複雑でプログラムが かけません。
576 :
デフォルトの名無しさん :04/09/20 18:51:17
エクセルVBAの関数で、指定範囲の空欄個数を返すような関数は ありませんか?
あるだろってかカウントしろよそれくらい。
>>572 n = Cells(Worksheets("管理").Rows.Count, 1).End(xlUp).Row
↑このnは使わないの?
>>573 Do Until y = z + 1 ←このyとzは何ですか?
>>573 m = m + 1
と計算して、列をどんどん右に調べていくことになってシートからはみ出てエラーだな
DGETやVLOOKUP使えばすむのに・・・
>>572-574 以下のように変えればとりあえず動きますね。
※の行が変更点です。
Sub 検索()
Dim objRange As Range
Dim l As Long, m As Long, n As Long, i As Long, j As Long
l = 5: m = 3: i = 4: j = 2
n = Worksheets("管理").Cells(Worksheets("管理").Rows.Count, 3).End(xlUp).Row '※
next0:
Do Until l = n + 1 '※
If Worksheets("管理").Cells(l, m) = Worksheets("検索").Cells(i, j) Then
Worksheets("検索").Cells(i, j + 1) = Worksheets("管理").Cells(l, m - 1)
GoTo next1
Else
l = l + 1 '※
End If
Loop
next1:
If Cells(i + 1, j) = Empty Then
GoTo finale
Else
i = i + 1
l = 5 '※(追加)
GoTo next0
End If
finale:
MsgBox "検索が終了しました。"
End Sub
>>578 さん、ただの間違いです。はじめlmnをxyzで使っていたら
数学のX軸とY軸と混同してしまってワケ分からなくなったので・・・
>>579 さん、ほんとだw 二日酔いで頭が混乱してる・・・
とりあえず
>>580 に示されたとおりに動かしてみたら動きました。
とんでもないアホに付き合わせてしまってどうもすいませんでした。
582 :
デフォルトの名無しさん :04/09/21 00:14:31
Outlook2003、WindowsXPProSP2を使ってまして、 Outlook2003の自作のマクロを実行させようとしたら、 今までは実行できていたのですが、 いつのまにか(ひょっとしたらSP2を入れてから?) 「このプロジェクトのマクロは無効に設定されています。 マクロを有効にする方法についてはオンライン ヘルプまたは ホストアプリケーションのドキュメントを参照してください。」 と言われてマクロが実行できなくなってしまいました。 しかし、ヘルプをさんざんみたものの、その方法が見あたらず。。。 なお、セキュリティを「低」にしてみても、同様です。 上記の解決方法をご存じのかた、教えていただければ幸いです。
583 :
デフォルトの名無しさん :04/09/21 05:41:42
はたしてSP2を入れるメリットはあるのかな 私も一部動かなくなりました。
>>568 ヤフーオークションのログイン画面でしたら、以下のような感じでログインボタンがクリックできると思います。
Set objForms = WebBrowser1.Document.Forms("login_form")
For Each x In objForms
If x.Value = "ログイン" Then
x.Click
End If
Next
>>568 objIE.document.all(".save").Clickではだめですか。
AccessのモジュールにあるFunctionをWORDのVBAから呼び出したいのですが、 どのようにすればいいのでしょうか? WORDからADO使ってAccessのデータベースに接続することはできたけど、 Accessのモジュールを呼び出せると、使い道が増えそうなので…
CreateObject("Access.Application")でAccessを起ち上げさせるのはどうよ
>>588 多分こんな感じになるはずなんだけど、動きません。うーん…
Sub acModule()
Dim Yougo, Imi As String
Dim acDB As Object
Set acDB = CreateObject("Access.Application")
Yougo = InputBox("用語を入力", , "コンピュータ")
Imi = acDB.Run("用語集.mdb!Yougo", Yougo)
MsgBox (Yougo & " : " & Imi)
End Sub
用語集.mdbのModule1にYougoというFunctionを作っています。
こんな感じだと思う Set acDB = CreateObject("Access.Application") acDB.OpenCurrentDatabase ActiveWorkbook."絶対パス" ’"C:\My Documents\用語集.mdb"とか acDB.Visible = True acDB.UserControl = True
スマソ間違えた Set acDB = CreateObject("Access.Application") acDB.OpenCurrentDatabase "絶対パス" ’"C:\My Documents\用語集.mdb"とか acDB.Visible = True acDB.UserControl = True
>>591 ありがとうございます。うまくいきました。
Accessのファイルを開いていなかったのが、最大の原因だったんですね。
既出、スレ違いかも知れませんが、 皆様のお知恵を拝借したくカキコしております。 現在悩んでいること 現在、VB.NETからOutLook2000をCreateObjectして、 MailItemを操作するプログラムを開発しております。 外部プログラムからOutLookを操作する際に、 セキュリティの警告ダイアログが出てしまい、 運用に耐える代物ではなくなってしまっております。 質問 ・外部プログラムからOutLookを操作してセキュリティの警告ダイアログを出さない方法は有るか? ・外部プログラムからOutLookを操作してセキュリティの警告ダイアログが表示された時、 自動的に閉じさせる方法は有るか? ・実現可能な場合、その方法は。 色々調べたのですが答えが出ませんでした。 なお、メール操作にはOutLookを利用することが要件として含まれているため、 他の方法でメール操作の要件を満たすことが出来ません。 一応、以下に調べた結果を列挙します。 主なWeb上の取り扱い 結果1、Officeの仕様だ諦めろ 結果2、ウイルスの中にはセキュリティの警告を出さずに操作するものもあるらしい。 結果3、恥ずかしくなる位簡単な方法で回避できた(OutLook2002) (どうやって回避したとかは載ってませんでした) ※信頼に耐えうるソース
途中で文章が切れてしましました^^; 一番最後の行 ※信頼に耐えうるソース → ※信頼に耐えうるソースは結果1のみです。 質問した上に誤植までしてしまい、申し訳有りませんでした。
質問に顔文字使うような奴に下流工程を任せたくない。
SP2を外せ
>>596 レス有難うございます。
やはりアップデートを外すしか無いのかも知れませんね。
しかし、OutLookの性格上アップデートを外すのはセキュリティ上不安が残るのも事実です。
考えていた対処
・オフィスのバージョン2000=>97に落とすか、2000のアップデートを外す。
・現実的な対処としてOutLookにアクセスする回数を減らしてユーザーに我慢してもらう。
なんとなく踏ん切りが付きましたので、後者をメインに考えてユーザーと相談してみます。
アドバイス頂きまして、誠に有難うございました。
OLでメール出そうという企画がまちがい。ユーザーと相談してみなさい。
599 :
質問です :04/10/04 23:10:22
はじめまして。さっそく質問させていただきます。 コンボボックスに 中1 中2 中3 高1 高2 高3 のような項目を作成しました。 このときコンボボックスの値に上記の値の中から 任意のものを初期値としてフォームに入力しておく ことはできるのでしょうか?
601 :
質問です :04/10/04 23:43:09
>>600 様
もしお時間があるようならばその方法を教えていただけないでしょうか?
>>600 です。
>>602 様、騙り乙です。
で、まずお使いのアプリを教えれ。
話はそれからだ。
塚、ググればいくらでもHitすると思いますよ。
604 :
質問です :04/10/05 07:47:18
>>599 です
>>600 様、返信ありがとうございます
現状を全く書いていなかったのが悪かったのですね。。
以後気をつけます。
使っているアプリはエクセル2002です。
Visual Basic Editer を使用してマクロを組んでいます。
「エクセル マクロ コンボボックス 初期化」
などでググっては見たのですが、3時間探しても見つからないので
こちらに質問させていただきました。
開発途中の画像は↓↓↓です。
ttp://www1.ocn.ne.jp/~nasitaka/situmon.JPG 画面右側のコンボボックスに初期値を入力させるというものを最終的には作ります。
是非アドバイスよろしくお願いします
Excelのフォームは詳しくないですが・・
>>599 で中2を既定で設定するには
コンボボックス名.ListIndex = 1
でできるようです。
未選択にする場合は-1、リストの1番目は0です。
即レスありがとうございました。 またわからないことがありましたら書き込みさせていただきます
急いでいるのでマルチポストをお許し下さい。 折れ線グラフの雛形を作っておき、それに対して毎回不規則に個数の変わるデータを 元データにする(わかりやすく言えば元データを変える)マクロを作ろうとしています。 試しにマクロの記録で見てみたのですが、 ActiveChart.SeriesCollection(1).Values = "=Sheet1!R1C1:R25C1" ↑こんな感じでした。 データの個数が常に一定であれば R1C1:R25C1 をR1C2:R25C2 のような感じにすればよいのですが、 データの個数が一定ではないところが悩みのネタです。 このR1C1:R25C1を開始行と終了行の変数にして、INPUTBOXか、セルに入力して読ませる感じで やれば良いんじゃないかなと思っているのですが、なかなかうまくいきません。 ちなみに、X軸、Y軸ともに同じ個数で毎回変動します。 (つまり、X軸とY軸のデータの個数は等しくなります) A:Aが使えればよいのですが、上記のメソッドでは使えないようです。 google等で調べてみたのですが、解決に至りませんでした。 どなたかご指導下されば幸いです。
>>607 マルチポストした時点で誰も答えるわけ無いのに。
すいませんでした。
>>609 Sheet1.Range("A1:A25")
某掲示板の書いたものの、ちょっと急ぎなので2ちゃんなら 早いレスもらえるかと思った次第です。
>>609 いえ、たまたま例をだしただけで、実際はA1:A150だったり、A1:A2000だったり、
毎回変わるのです。
それをInputboxとかセルから変数に読み込んで元データを指定する感じにしたいのです。
inputBOXとかセルから読ませるのはわかります。が、
ActiveChart.SeriesCollection(1).Values = "=Sheet1!R1C1:R25C1"(←あくまで例です)
の、R1C1:R25C1の部分を変数にしてマクロを組みたいのです。
質問する分際で説明不足で申し訳ありませんでした。
おかしいなぁ。マクロの記録でやると ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:A25"), PlotBy _ :=xlColumns ってなる・・・。バージョンの違いなんかな。
マルチポストするやつってたいてい解決しても終了報告はマルチポストしないんだよね。
>>607 こんなん?
Sub makechart()
Dim line As Integer
line = 1
While (Cells(line, 1) <> "")
line = line + 1
Wend
If (line = 1) Then Exit Sub
Range("A1:A" & CStr(line - 1)).Select
Charts.Add
あとは適当
>>615 がマクロウィルスかどうか私の技量じゃわかりません・・・
なんかそれらしい気もしますが。あした職場のPCで開いてほんとに菌なら処分されます・・・
や、でもなんかそれらしいのでとりあえず持っていって、スタンドアローンで開いてみます。
ドキドキ。
>>615 様、貴方が善意の方でしたら申し訳ありません。
私がみるには菌には見えませんのでとりあえずこれをいじって使わせていただきます。
ありがとうございました。
連続で申し訳ありません。
>>617 で書いた「それらしい」っていうのは、私の質問で対する回答っぽいという意味であり、
菌らしいという意味ではありません。気を害したら申し訳ないです。では明日試します。
621 :
デフォルトの名無しさん :04/10/06 00:49:30
620ワロタ
622 :
デフォルトの名無しさん :04/10/06 23:20:45
Range("A1:A" & Range("A1").End(xlDown).Row).Select ではいかんのかいのぅ?
それだと2行目以降が空欄のとき、最終行までいかなかったっけ?
Word で下の方に 5行 6桁 など現在のカーソル位置がでますが、 「5行6桁」などと指定してカーソル位置を移動させる方法ありますか? ちょうど、 EXCELで、 Range("A1").Select とやるようなことを やりたいわけなんですが。
VBAでWORDのフィールドコードの種類、オプションのスイッチを 取得する方法ってありますか? Fields(i).Code.Textで取得してregexで処理するしかないでしょうか?
シートから1列データを取って、それを重複除去、ソートで整形して コンボボックスに追加しようと思ったけどソート用関数とか無いの?
>>626 口の利き方に気をつけろヴォケ!!
>それを重複除去、ソートで整形して
↑この時点でアフォ丸出しだw
>>624-625 Wordはよく判りませぬ・・
630 :
デフォルトの名無しさん :04/10/09 18:48:42
office2000 excel vbaでセルの高さや幅を変更したら発生する イベントってないですか?
631 :
デフォルトの名無しさん :04/10/10 23:35:32
office2000のExcelでコンボボックスを利用しているのですが、 ▼をクリックして、リストを開いた状態で、マウスのホイールを スクロールさせるとシートのスクロールが発生し、リストのみ画面下部に 移動してしまいます。 できれば、リスト内でスクロールを発生させたいのですが、方法はないでしょうか。
サービスパックあてれ
633 :
デフォルトの名無しさん :04/10/11 18:11:57
マクロの実行した時、随分時間がかかるんですが メモリ増やしたら早くなったりしますか? 処理中すごい音してるしちょっと怖いです
>>633 >処理中すごい音してるしちょっと怖いです
スワップしてるんなら有効。単に外部ファイル読みまくりなら買って西根。
>>633 excelのマクロとかだったら処理中の描画をOFFにするだけでかなり速くなる
>633 ロジック見直せば速くなる
>>635 スワップ、調べましたが私にはどうすればいいのか分かりませんでした。
>>636 最後に
application .screenupdating = false
と書いたんですが何も変わりませんでした。
>>637 638は私ではありません
>>639 次に書きます
Sub ソース() Dim mysheet As Variant Dim b As Integer Dim c As Integer Dim code As Integer, q As String, u As String, rownum As Integer Dim myrange1 As Range, myrange2 As Range Dim move As Integer Set mysheet = Sheets(Array("×", "×2", "×3", "×4", "×5", "×6", "×7", "×", _ "×9", "×10")) For Each mysheet In Array("×1", "×2", "×3", "×4", "×5", "×6", "×7", "×8", _ "×9", "×10") Worksheets(mysheet).Select For b = 61 To 1891 Step 60 Rows(b).Delete Next b For c = 2 To 1831 Step 61 Rows(c).Insert , xlShiftUp Next c
For rownum = 2 To 1891 Step 61 code = Cells(rownum + 1, 1).Value If code > 0 Then Worksheets("○○").Select Set myrange1 = Range("A:A").Find(what:=code, searchorder:=xlByColumns) q = myrange1.Address If Not myrange1 Is Nothing Then Set myrange2 = Range(q).End(xlToRight) u = myrange2.Address Range(q, u).Copy Destination:=Worksheets(mysheet).Rows(rownum) End If Worksheets(mysheet).Select
Range(Cells(rownum + 57, 14), Cells(rownum + 59, 14)).FormulaR1C1 = "=AVERAGE(RC[-6]:R[2]C[-6])" Range(Cells(rownum + 55, 16), Cells(rownum + 59, 16)).FormulaR1C1 = "=AVERAGE(RC[-8]:R[4]C[-8])" Range(Cells(rownum + 50, 18), Cells(rownum + 59, 18)).FormulaR1C1 = "=AVERAGE(RC[-10]:R[9]C[-10])" Cells(rownum, 20).FormulaR1C1 = "=AVERAGE(RC[-10]:R[2]C[-10])" Cells(rownum, 22).FormulaR1C1 = "=AVERAGE(RC[-12]:R[4]C[-12])" Cells(rownum, 24).FormulaR1C1 = "=AVERAGE(RC[-14]:R[9]C[-14])" Range(Cells(rownum, 14), Cells(rownum + 56, 14)).FormulaR1C1 = "=R[1]C+2/4*(RC[-6]-R[1]C)" Range(Cells(rownum, 16), Cells(rownum + 54, 16)).FormulaR1C1 = "=R[1]C+2/6*(RC[-8]-R[1]C)" Range(Cells(rownum, 18), Cells(rownum + 49, 18)).FormulaR1C1 = "=R[1]C+2/11*(RC[-10]-R[1]C)"
Cells(rownum, 15).FormulaR1C1 = "=RC[-7]/RC[-1]-1" Cells(rownum, 17).FormulaR1C1 = "=RC[-9]/RC[-1]-1" Cells(rownum, 19).FormulaR1C1 = "=RC[-11]/RC[-1]-1" Cells(rownum, 21).FormulaR1C1 = "=RC[-11]/RC[-1]-1" Cells(rownum, 23).FormulaR1C1 = "=RC[-13]/RC[-1]-1" Cells(rownum, 25).FormulaR1C1 = "=RC[-15]/RC[-1]-1" 'Cells(rownum, 26).FormulaR1C1 = "=RC[-18]/RC[2]" 'Cells(rownum, 27).FormulaR1C1 = "=RC[-1]/R[1]C[-1]" 'Cells(rownum, 29).FormulaR1C1 = "=RC[-1]/R[1]C[-1]" End If Worksheets(mysheet).Select Next rownum Range("A:D").HorizontalAlignment = xlCenter Range("O:O,Q:Q,S:S,U:U,W:W,Y:Y").NumberFormatLocal = "##0.00%" Range("N:N,P:P,R:R,T:T,V:V,X:X").NumberFormatLocal = "#,###,###,###" Range("A1").Select Next mysheet End Sub
「本文が長すぎます」とエラーがでるので分割しました。 見難くて申し訳ありません。 よろしくお願いします。
application .screenupdating = false は最後じゃ意味ないぽ
>>646 最初に入れたら画面が更新されなくなってしまいました。
どうしたらこの不具合を回避できるでしょうか?
application .screenupdating = true
>>641-644 (1)シート"×1"だけ処理。(行の削除・追加・Excel関数入力など))
(2) (1)で出来たシートをコピーして、シート"×2"〜 "×10"を作成
(3)シート"×2"〜 "×10"で、シート"×1"と違う部分だけ変更。
というようにしてみてはどうかと思ったんだがいかがなものか。
各シートの内容がどうなってるのかさっぱりわからないのでなんともいえないけど。
650 :
デフォルトの名無しさん :04/10/15 15:23:18
Excel2002のVBAはVB.6ベースだと思いますが、 ExcelXP や Excel2003 もそれは変わっていませんか? それともVB.netベースになっていますか? どなたかご存知の方教えてください。
フォームのダイアログボックスにListBox1を作っておいて、 下のような感じで動かしたいのですが、MainからTestを呼び出しても、 testListBoxがNULLになってしまい、動作しません。 どのようにすれば動くようになるのかお教えください。 Sub Main() Call Test(Form1.ListBox1) End Sub Sub Test(testListBox As Object) testListBox.Clear End Sub Office2000のWORD上でやっています。
>>650 微妙に関数が増えていたりするが。netではない。
>>651 Sub Main()
Dim clsList As New Class1
clsList.obj = UserForm1.ListBox1
clsList.Test
UserForm1.Show
End Sub
クラス
Dim WithEvents lst As msforms.ListBox
Property Let obj(ByRef o As Object)
Set lst = o
End Property
Public Function Test()
lst.AddItem "ABCDE"
End Function
初心者なのですみませんですが、おしえて もらいたいのですけど、 Selection って=現時点のオブジェクトって ことなのでしょうか? Selection.xxxの xxxはそのオブジェクトに依存しているメゾット とかプロパティというカンジの。
656 :
デフォルトの名無しさん :04/10/17 08:40:26
>>654 Selectionは Application オブジェクト と Windows オブジェクト のプロパティ
657 :
デフォルトの名無しさん :04/10/17 19:13:14
VBAをエミュだと思って入ったのは俺だけか?
658 :
デフォルトの名無しさん :04/10/17 22:08:36
現在のマウスの位置にフォームを表示したいのですが、 VBにはScreen.TwipsPerPixelXがありますが、VBAにはありません。 どのようにTwipsとPixelを変換すればよいのでしょうか? お助けください。
>>658 [ほかの言葉を使って試してみてください]
660 :
デフォルトの名無しさん :04/10/18 01:15:26
ExcelのVBAで 1.テキストファイルの読み込み 2.一定時間後再度、同じファイルを読み込み を行いたいのですが、「2.」で読み込む場合 は「1.」で読み込んだ箇所を飛ばして、更新 された箇所だけ読み込みたいのですが、どの ようにすればできるのでしょうか?
1.のテキストの最後の文言を控えておいて2.を始める時に検索させれば解決かと
662 :
デフォルトの名無しさん :04/10/18 11:21:26
ExcelVBAで動的にツールバー内部のメニューにマクロを登録したいのですがやり方がわかりません。 通常のボタンですと Toolbars(i).ToolbarButtons(1).OnAction = "method" みたいに設定できるので Toolbars(i).ToolbarButtons(1).Menus(1).OnAction = "method" みたいにやるのかと思ったのですがスカでした。 これは不可能なのでしょうか・・・
メニュー自体がひとつのコマンドバーなんだが
664 :
660 :04/10/18 22:34:54
>>661 解決しました。
ありがとうございます。
Excel で印刷される範囲を知るにはどうしたらいいでしょう? セルは連続してないこともあるので CurrentRegion は使えず、 印刷範囲の指定をしていないときもあるので PrintArea も使えず、 V/HPageBreak もちょっと違います。 具体的には、改ページプレビューで一番外側の青色の線の位置が知りたいんですが。 よろしくお願いします。
VBAのクラスモジュールは標準モジュールに比べて動作が遅い。 とかありますか?
>>665 PrintAreaで取れなければ一番端のセルを取ればいいだろ
Dim strAddress As String
strAddress = ActiveSheet.PageSetup.PrintArea
If strAddress = "" Then
Range("A1").Select
ActiveCell.SpecialCells(xlLastCell).Select
strAddress = "$A$1:" & Selection.Address
End If
>>666 インスタンスを1回しか生成せず、Public変数しか使わなければ
ほとんど変わらんし、インスタンスを何度も作れば遅くなるのは
どんな言語でも常識
668 :
デフォルトの名無しさん :04/10/20 10:56:21
初心者のような質問で申し訳ありませんが・・・・ EXCEL2000で以下のような記述をしたところ、EXCEL2000ではうまく動くのですが、 別機種のEXCEL2002ではエラーメッセージが表示されてうまく動きません。 【VBA】 Range(2, "A"), Cells(65536, "L")).Select Cells(Main_X_start, Main_Y_start).Activate Selection.ClearContents Selection.Font.ColorIndex = 1 【2002エラー】 実行時エラー'1004': 「FontクラスのColorIndexプロパティを設定できません。」 対象シートは保護されてますが、Rangeで指定された範囲のロックはされていません。 ColorIndexをColor=RGB(・・・・に修正しても結果は同じでした。 メッセージだけ見ると、Fontオブジェクトをクラスとして認識してしまってる様なのですが・・・・・・ お分かりの方がいらっしゃいましたら、うまく避ける方法を教えてください。 OSは2台ともWIN2000です。
>>667 例外が起きた後インスタンスがすべて解放されてるのが泣けるのでなんか考えます。
>>667 SpecialCells(xlTypeLastCell)なんてものがあったんですね。
どうもありがとうございました♥
671 :
デフォルトの名無しさん :04/10/20 20:32:25
Sub Macro1() Worksheets("Sheet1").Range("F9").Select With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With Application.OnTime Now + TimeValue("00:00:10"), "Macro2" End Sub Sub Macro2() Worksheets("Sheet1").Range("F9").Select With Selection.Interior .ColorIndex = 46 .Pattern = xlSolid End With End Sub 上記のようなマクロで、マクロ実行後Macro2が呼ばれる前に 別Bookを開いていると(ActiveなSheetは「2」) =========================== 実行時エラー'9': インデックスが有効範囲にありません。 =========================== どのように回避すればよいのでしょうか?
ThisWorkBook
>>671 Macro2の対象が元のワークブックならThisWorkbookつけろ
674 :
671 :04/10/20 21:20:40
>>672 ,673
ありがとうございました。
下記のように記述したら、解決したのですが、
現在Activeのbookが非Activeになるのですが、
現在ActiveのbookはActiveのまま、裏でマクロ
を実行されることはできないのでしょうか?
〜省略
Sub Macro2()
ThisWorkbook.Activate
Worksheets("Sheet1").Range("F9").Select
With Selection.Interior
〜省略
セル自体をオブジェクトにとる方法ってありますか? rangeじゃないですよね。
677 :
デフォルトの名無しさん :04/10/21 22:11:54
ご存知の方いらっしゃいましたら教えてください。 エクセルシートからCSVファイルを作成するときに Open file write #Fileno long(1),long(2),・・・ close file として数値をダブルコーテーションでくくられていない状態にできるのは わかったんですけど、 write #Fileno double(1),double(2),・・・ としたときに 0.123 のような値の出力は .123 とされてしまいます。 一の位の0が落ちないようにCSVを作成するにはどうしたらいいのでせうか?
>>677 VBAは使ったこと無いのだが
Format(0.123, "#0.###")
みたいな事はできないのか?
何も考えずにSAVEASメソッドでCSV形式保存すればいいような…
680 :
677 :04/10/21 23:36:02
681 :
デフォルトの名無しさん :04/10/21 23:37:13
キーボードから5つの数字を取り込み、それらのうち最大の数、最小の数を画面表示するプログラムって作れる人いますか?(Visual Basicです)
>>681 いますよ。
で?VBAでやりたいのか?
683 :
デフォルトの名無しさん :04/10/21 23:45:36
そうです!書いてもらえるとありがたいです
685 :
デフォルトの名無しさん :04/10/21 23:51:06
お願いします〜
SaveAsメソッドでセーブするとき、同名のファイルがあると上書き確認のダイアログ出ますよね。 で、cancelとかいいえをおすとSaveAsメソッドに失敗したという実行エラーになる。。。 処理の最後の部分なので、Resume Nextで進めばいいかとしておきましたが 何かもっとスマートに解決する方法無いですかね?
>>687 saveasの後にスペースを打ってみろ。
>>687 Dirで存在調べてあったら消しゃいいだろ
>>687 On Error Gotoで例外処理。
JavaとかC#とかではそれが当たり前。
ああ、VBしか使ってないから恥かいた。
>>689 そっかそっか。勝手に消すかはともかく先回りして調べておきゃいいよな。
例外処理はTryCatchでできればいいけんだけど、まぁVBAだし。
>>693 >そっかそっか。勝手に消すかはともかく先回りして調べておきゃいいよな。
キャンセルしたら元ファイルが消えるという愉快な罠。
activecell の行の "A1:K1" の背景に色を塗るってどうやるんでつか? 行だけは相対参照で、列が絶対参照なんです。
697 :
デフォルトの名無しさん :04/10/23 08:14:21
Excel2000 VBAでExcelの最大化やリサイズを通知してくれるイベントはあるんでしょうか。
696をちょっと訂正します。 ActiveCell の行の1列目から10列目までのセルの背景を黒くするマクロ を書きたいのですが、どう書けばよいのかわかりません。 行が相対参照で列が絶対参照なんです。
>>699 Cells(ActiveCell.Row, 1).Resize(1, 10).Interior.ColorIndex = 1
でいいのかな?
701 :
デフォルトの名無しさん :04/10/23 18:25:16
>>699 どこでつまづいているんだろう。
アクティブセルの行数を取得できているか、
Rangeで選択するときにCellsを使っているか、
ぐらいじゃないか。
703 :
きょうこ。 :04/10/24 01:31:33
InStr で Chr(10)の位置を検出したいんであけど、どうすればいいですか? textCommentが検索対象のテキストとして InStr(0, textComment, Chr(10), vbTextCompare) とやっても8文字目にはいってる改行コードの位置が帰ってきません。 vbTextCompareをvbBinaryCompareにしてもだめでした。 textComment の中身をメモ帳に貼り付けるとちゃんと改行されるんですけど・・・
検出したいんであけど
A列が空白ではない行のBからK列の空白に*という文字を入れたいのですが どう書けばよいのでしょうか
セル内のデータの取得と変更、空白かどうかの判定式、ループ処理あたりを調べる
質問です。 C++で作成したDLLとExcelの間で、文字列の配列を ユーザ定義型の中の二次元配列でやり取りしようとしてます。 (この時点で間違ってるかな…) で、 public Type STRUCT buf(10) As String * 64 end Type ------------------------ Dim struct As STRUCT としてDLLに渡してやると上手くいくんですが、 渡す直前に配列数を増やそうと思い、 public Type STRUCT buf() As String * 64 end Type ------------------------ Redim struct.buf(10) As String * 64 としてDLLに渡すと上手くいきません。 理由や代替法など、どなたかご教授願えませんでしょうか?
>>708 上手くいきません上手くいきません上手くいきません上手くいきません
上手くいきません上手くいきません上手くいきません上手くいきません
上手くいきません上手くいきません上手くいきません上手くいきません
症状くらい書けねえのか!
>>709 すみません…
症状の方は、DLLの関数を実行して処理が戻ってきた時に落ちます。
「0xXXXXXXXX での命令は、 0xXXXXXXXX のメモリを参照しました。
メモリが read になることができませんでした。」
と、デバッガを起動させると表示されました。
CSVファイルとして出力したいのですが Write #ステートメントで文字列であってもダブルクォートで括らないように出力したいのです Print #でカンマと改行コード足してやるか、SaveAsでFileFormatをcsvでするしかないんでしょうか?
仕様です。
excel VBAで RDOを使おうとして、rdoEnvironmentを setすると、ActiveXコンポーネントはオブジェクトを 作成できません。 といわれます。 参照設定でRDO2.0を設定しても同じです。 RDOは使えないのですか?
質問です。 Excelでプロセスメモリエディタのようなものを作ろうと思っているのですが ExcelVBAでメモリ内の指定のアドレスの値を読むには どのようにしたらいいのでしょうか?
判別式で、もし”ヌルポ”というシートが存在する場合にはAの処理へ ”ヌレポ”というシートが存在した場合はBの処理をするようにしたいのですが、 どのような関数を使えばいいのでしょうか? 教えてください。
Dim Sh As Worksheet On Error GoTo Err1 Set Sh = Sheets("ヌルポ") Worksheets("ヌルポ").Copy After:=Workbooks("galtu").Worksheets("nullpo") GoTo Shori Err1: On Error GoTo Err2 Set Sh = Sheets("ヌレポ") Worksheets("ヌレポ").Copy After:=Workbooks("galtu").Worksheets("nullpo") GoTo Shori2 Err2: Workbooks("galtu").Close MsgBox "ヌルポもヌレポも存在しないファイルを選択しました。処理を中止します。" GoTo ErrorEnd どうもerr1の処理はしてくれるのですがerr2の処理はしてくれないのです。 どこがいけないのか教えていただけないでしょうか?
>>718 Shoriラベルがない。
そう言う使い方する場合はなるべくOn Error Resume Nextを使ってくれ。
読みにくい。
>>720 resume を入れていないからどの部分でエラーが起こっても
On Error GoTo Err1
だけ処理をしてしまって
On Error GoTo Err2
が使われなかったということっすよね?
resumeを知りませんでした。どうもありがとうございました。
722 :
デフォルトの名無しさん :04/10/31 21:53:55
質問なんですが あるフォルダのパスを取得して、そのフォルダ内の ファイル名をセルに書き出して・・・というマクロを作ってるんですが 対象になるフォルダパスの取得方法に悩んでいます。 ファイルを開くダイアログボックスみたいなのをだして フォルダパスを取得したいんですが どうしたらいいのでしょうか?
VBA フォルダを開く ダイアログボックス でググるとすぐ引っ掛かるが…
解決しました スレ汚してスマソ
725 :
デフォルトの名無しさん :04/11/01 02:05:25
質問です。 エクセルで当番表の様なものをつくっています。 土日はその列の背景をオレンジにするようなマクロを作成したいのですが 〜抜粋〜 Do If ActiveCell.Value = "土" Then row = ActiveCell.row col = ActiveCell.Column Range(Cells(6, col), Cells(26, col)).Select With Selection.Interior .ColorIndex = 44 .Pattern = xlSolid End With 〜省略〜 この様な感じで一応は動きます。 ただシート側の曜日の作成をDATE関数で作成しており、↑の比較ではシリアル値が比較対象となっているせいか うまく土曜日、日曜日を判定してくれません。エクセル上のシリアル値ではなく表示されている文字で比較する方法はないのでしょうか? いい解決策がありましたらよろしくお願いします。
すいませ〜ん、ひとつ教えてください。現在PCを使用しているユーザー名って知ることが出来るでしょうか? Excel2000です。
If Week(ActiveCell.Value) = "土" Then
730 :
デフォルトの名無しさん :04/11/01 17:57:08
HTMLの勉強してるんだけど、例文とか高橋愛・モーニング娘。とかばっかだからなw
>>725 If ActiveCell.Text = "土" Then
モジュール - ユーザーフォーム間でモジュールの変数の値を 渡したいのですけど、publicしか方法はないんですか? 逆にフォームの値もモジュールに渡したいんだけど・・。 よく分かりません。出来ればDimでなんとかできませんか?
>>732 非表示にしたラベルのCaption使うとか。
Publicをつかいたくない理由が分からん…
>>735 ユーザが不用意に不正な値を変数にセットするのを防ぎたいんだろう。
つまりアクセサメソッドのことを言いたいんだよ。彼は。
>732 クラス作るのめんどうなんで、もっと簡単な 方法ないかと思っていたのですけど。 ありがとうございます。
>>736 ユーザーフォームもクラスなのでそういうことをしたければ
Property Let/Getがつかえる。
その場合でもPublic PropertyになるのでPublicは必ず必要。
それでもPublicが嫌ならPrivate Propertyにすればいいが、
そうするとユーザーフォームでしか使えない。
だからPublicを使いたくない理由が理解できなかったのだが。
元発言の意図がProtectedを使いたいのだとばかり…
spreadsheetを使っているんですが、セルの書式を文字列に変更したい場合はどうすればいいんでしょうか? 通常のシートの場合だと、cell.numberformat = "@" で うまくいくことを確認しているのですが、spreadsheet では他の方法が 必要なのでしょうか? わかる方いらっしゃったら、よろしくお願いします
>>738 継承できないじゃん。と、つっけんどん。
わるい √の計算方法わがんねぇ だれかご教授ください
>>741 「開平算」でYahoo検索してみるのは?
744 :
デフォルトの名無しさん :04/11/04 00:42:10
sqr
741です すまねぇSqrってやつがどーしてもでてこなかったorz 自己解決しますた 742さん 743さん 助言ありがとです
746 :
デフォルトの名無しさん :04/11/04 22:03:44
ValidMode As Excel.Validation Set ValidMode = CreateObject("Excel.Validation") 又は Set ValidMode = New Excel.Validation これが通らない理由がわかりません。 なぜでしょうか?
書き方が正しくないから。
シート1のA1〜A100まで値が入っていたとして、その中から 文字列で「AA」が入ったセルだけををシート2のB列にコピーしたいのですが どうしてもうまくいきません、誰か助けてください
VBスレでも聞いてるな
すみません。おしえてください。 VBEで、プロジェクトエクスプローラーに microsoft Excel Object ┣---sheet1 ┣---sheet2 ┣---sheet3 標準モジュール ┗---modules1 ってある場合、modules1の変数は sheet1に渡すことはできるのでしょうか?
752 :
デフォルトの名無しさん :04/11/07 14:31:26
>>751 プロシージャの外、一番上に、Publicで宣言。
Public Hensu As String
みたいに。
>751 すみません。できました。
754 :
デフォルトの名無しさん :04/11/07 16:17:22
あー
755 :
デフォルトの名無しさん :04/11/11 21:11:16
作業番号 作業時間 1 7 2 4 3 9 4 2 のような表があるときに作業番号1〜4に対してそれぞれの持っている時間を 求めるにはどうやればいいのでしょうか? それを使ってその中から最小の値の番号を調べるようなプログラムを作りたいのですが
756 :
間違えた :04/11/11 21:12:17
作業番号 作業時間 1 7 2 4 3 9 4 2 のような表があるときに作業番号1〜4に対してそれぞれの持っている時間を 求めるにはどうやればいいのでしょうか? それを使ってその中から最小の値の番号を調べるようなプログラムを作りたいのですが
はっきりいって意味わかんね。 まず他人の立場に立ってみて、この説明を読んで質問内容が理解できるか 考えてみ。
単に作業時間を昇順でソートして一番上にくる作業番号を抜き出すだけだろ。
760 :
>>757 :04/11/12 04:41:28
すんません。文章下手すぎで
このデータは Excel の表に入ってるの?それとも外部ファイルを読むの?
使ってるのはExcel2000で、本でも読んでじっくり勉強したいと思うんですが お薦めの一冊はどれでしょうか?
図書館がお勧め
すみません 教えてください。 ACCESSからEXCELファイルを開く際、 該当のファイルがすでに開かれているか チェックしたいのですが・・・。 EXCELのVBAではできたのですが、 それをACCESSで行おうとするとうまくいきません・・・。
教えてください。 Excelでリストボックス内の項目をダブルクリックしたあとに 選択が解除されている状態にしたいのですがうまくいきません。 ListIndexを-1にすればいいというような記述を見つけたので やってみましたが、選択された状態(項目が反転表示)のままです。 List.Clearして項目を追加しなおすという作業が必要なのでしょうか、、、
>765 どううまくいかないのか書かないと誰も答えられません。
768 :
デフォルトの名無しさん :04/11/17 00:32:33
教えてください。 Access2000で、以下のようなことをやりたいのですが、うまい方法が思いつきません。 クラスモジュールとして Class1 Class2 : Class8 があり、Class1〜8には同じ名前のメソッドが定義されている。 他のクラスモジュールから、Classiのインスタンスを生成したいのですが、 Public sub test(i as integer) Dim obj as Object set obj = new ________ : newの後に、固定以外のクラスを指定する方法が分かりません。 クラスのコレクションみたいなのがあって、"Class" & format(i,"0") でうまいこと出来ないものでしょうか。 どうぞ宜しくお願いいたします。
>>766 とりあえず2通り。
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
ListBox1.Value = ""
End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
With ListBox1
.Selected(.ListIndex) = False
End With
End Sub
>>768 >があり、Class1〜8には同じ名前のメソッドが定義されている。
設計を見直した方がいいとおもう
命名のセンスはともかくとして、同名メソッドがあるなんて珍しくないだろ。 インタフェース使って、あとは>769の言うようにファクトリ的な事すりゃスマートに書けるかと。
>>771 VB以外の先進的なプログラミング言語の本の多態とかポリモフィズムって言う章を良く読むよろし。
774 :
デフォルトの名無しさん :04/11/19 00:00:11
>>769 ,
>>772 う〜ん、やはりファクトリ作るしか解決法はないんですね。
すっきりしました。
どうもありがとうございました。
775 :
デフォルトの名無しさん :04/11/20 14:02:44
セル内に入力されたものが数字か文字列か判定する方法ってないですか? 田中 01-480-21 2350 ひらい 01-481-21 2540 これで文字列のとこだけ処理かけたいのですが
776 :
デフォルトの名無しさん :04/11/20 14:19:29
自分でやるなら 使われている文字コードの範囲が 30H 〜 39H のみからなる場合 かどうかを調べる。
日付ってなんですか?
>>778 今日なら「2004/11/20」です。
>01-480-21 ここでの場合、これも数字扱いするの?どっち?
>>781 文字列だろ。いちいち聞かないと分からないのか?
784 :
780 :04/11/20 22:26:00
俺の質問に答えてくれよ。 「01-480-21」は文字列として省いていんだな?例で挙げている「2350」や「2540」を 抽出するだけでいいんだな? あと「名前」>「なんかのハイフン入り番号」>「四桁のなんかの番号」のペアは必ず一定で、繰り返し続いて いるのか?
もうめんどくさ。組んでやろうと思ったが、質問者が要領を得ないので止めることにする。 ISNUMERIC関数を使え。そんだけ。
787 :
デフォルトの名無しさん :04/11/21 12:54:40
Debug.Print StrReverse("こんちたびなし")
ユーザーフォームを表示させている状態でワークシートのセルが操作出来ません。 ユーザーフォームを表示させながらセル操作をする方法はあるのでしょうか? 若しくはシート上に作ったボタンが画面をスクロールさせても常に同じ位置にあり続ける方法を 教えて頂けないでしょうか? 初歩的な質問かもしれませんが、検索してもなかなか説明してるページに たどり着けません。どなたかよろしくお願いします。
>>788 Modelessは旧バージョンでつかえないのでその場合はあきらめる
定期的にボタンを移動させるだけなら
Public Sub MoveShapeTop(ByVal UpdateIntervalSec As Integer)
Dim rng As Range
Set rng = Cells(ActiveWindow.ScrollRow, ActiveWindow.ScrollColumn)
ActiveSheet.Shapes(1).Top = rng.Top
ActiveSheet.Shapes(1).Left = rng.Left
Application.OnTime Now + TimeSerial(0, 0, UpdateIntervalSec), "'MoveShapeTop 1'"
End Sub
こんなことしないでコマンドバー使ったほうがマシ
>>789 さん
>>790 さん
ありがとうございます。
当方2000の環境なので無事modelessが使用出来ました。
792 :
デフォルトの名無しさん :04/11/22 10:02:54
793 :
デフォルトの名無しさん :04/11/22 23:02:27
問、N回コインを投げ、M回「表」が出たときに「表」のでる割合は、 f=M/Nで表されるプログラムを作成してください。 コインの投げる回数はセルA4~A7の中から1つ取り出した後に Integer型変数に格納して使用し、「表」のでる 割合f=M/Nを対応するセルB4~B7に格納する。 なお、「コイン投げの回数」が格納されているセル位置を毎回修正後に プログラムを実行すること。 コインを投げる回数Nを大きくすると0.5に収束することを確めてください。 ※A4~A7はコイン投げの回数 A4は10,A5は100,A6は1000,A7は10000というコイン投げの回数になってます。 よろしくおねがいします。
実務じゃそんな処理、万に一つもやらねー
>>795 うちはそれを生業にしているシンクタンク系S/Wデベロッパですが。
797 :
デフォルトの名無しさん :04/11/23 07:43:09
すみません。 スレ違いかもしれませんが 質問していいでしょうか。 VBAを勉強したいのですが お勧めの本はありますか。 定番の本など。 急にexelでマクロを書かなくてはならなくなり 田舎に住んでいまして、近くに大きい本屋がなく 店頭で立ち読みしてきめることができません。 アマゾンで購入しようと思っています。 プログラムは、C++やPerlがちょっと書けるくらいです。 よろしくお願いします。
798 :
通りすがり :04/11/23 08:02:09
「かんたんプログラミング Excel2003 VBA」 ・基礎編、・コントロール・関数編、・応用編 定番です
799 :
デフォルトの名無しさん :04/11/23 08:18:59
>>798 早々のご回答どうもありがとうございます。
早速アマゾンで注文したいと思います。
あつかましいのですがもうひとつだけ質問していいでしょうか。
現在、使用しているexelのバージョンが2000なのですが
その場合、
1.かんたんプログラミング Exel2000 VBA を買う
2.かんたんプログラミング Exel2003 VBA を買う
3.かんたんプログラミング Exel2003 VBA と Exel2003を買う
のどれがいいでしょうか。
3.が一番良いのでしょうが、2003用の本でも「リスト機能」など
強化されたところをとばせば、2000用の解説書として読めるのでしょうか。
申し訳ありませんが、わかる範囲でご回答いただけたらうれしいです。
800 :
通りすがり :04/11/23 09:07:12
そこまではちょっと分からないです。
1番が無難かと。
あと分からないことは、下のサイトで聞けばよいと思います。
「Moug モーグ」
http://www.moug.net/ Q&A掲示板 Excel VBA
>>800 どうもありがとうございます。
そうですね。1が無難ですね。
では、これを注文したいと思います。
質問に答えていただきどうもありがとうございました。
4.かんたんプログラミング Exel2003 VBA と かんたんプログラミング Exel2000 VBA を買う
>>802 そうですね。2000を読んでみて、もっと知りたくなったら
2003を読んで新しく何ができるかを勉強してみます。
804 :
793 :04/11/23 12:42:25
おしえてください。たのみます。
SQLのテーブルに TO_DATE('23-11-2004 11:36:44 AM ','dd-Mon-yyyy HH:MI:SS AM') な感じで保存されてる日付データがあるんだが、 これの年月日だけ取り出すにはどーすればいいのかね もしくは全部変数に抽出して、 変数の年月日だけ指定できたらいいんだが‥ むぅ
substrで切り出してto_dateにでも突っ込んでやれ
>806 TO_DATE('23-11-2004 11:36:44 AM ','dd-Mon-yyyy HH:MI:SS AM') という文字列が入ってるって事け? あとSQLServerをSQLと略すのヤメレ
809 :
デフォルトの名無しさん :04/11/26 01:04:51
久々にVBA書かなきゃならないことになったのですが、 多重ループにラベル付けておいて Exit ラベル名 とかで 脱出するようなことってできなかったんでしたっけ? 何かあったような気がするのですが。。。Goto使うしかないのかな。
どっちにしろ構造化無視のジャンプだからどうでも良いような気がした。
ああ、まあ、普通のネストしたループの breakですよ。 ある条件でループをそれ以上実行しなくて良くなるので その関数の終了処理に移りたいという感じ。 Do While ... For ... Exit Do Next Loop <<終了処理>> みたいな感じででとりあえずやってるのですが、 外側のループを Forループにしたいんです。
gotoがいやなら exit sub かな
うーん、Exit Sub使うと その関数内では終了処理できなくなってしまう気が…
On Error で囲んで エラーRaiseでハンドルするのって この手の処理にはキモイやりかたですよね? どう思います?
ごちゃごちゃ言わずにgoto
どうしても構造化したいならフラグをネスト毎に作れ
レス沢山サンクスです。 黙ってgotoすることにしました。ありがとうございます。
818 :
デフォルトの名無しさん :04/11/27 11:56:12
質問です. 初めてVBAを使います. Data0001 Data0002 : : と,順番にファイルを読み込みたいです. For i=1 to n Workbooks.Open Filename:="Data000???.xls" ???のとこのプログラムをどのようにすればいいでしょうか?
>>818 "Data" & Format(i, "0000") & ".xls"
820 :
デフォルトの名無しさん :04/11/27 12:12:24
>>819 助かりました.
初めて使うもので,わからないことが多いもので
821 :
デフォルトの名無しさん :04/11/27 12:28:49
条件付き確率のシミュレーションでは、実験回数をセルより取り出す際 に、VBAのプログラムを修正して行わず、自動的に実験回数10が終了すると実験回数 100、1000、10000と進むようにするにはどうすればいいのでしょうか。
>>821 Dim i As Long, 実験回数 As Long
For i = 1 To 4
実験回数 = Range("A1").Value ^ i
MsgBox 実験回数
Next
823 :
デフォルトの名無しさん :04/11/27 14:26:21
824 :
デフォルトの名無しさん :04/11/27 14:51:50
質問、60%は女性で、その内30%は独身女性であった。 女性客からデタラメに1人選んだ時に、その人が独身である確率を求めた時の 条件付のプログラムを作成した場合、For文、 IF文の使い方、 乱数の使用が分かりません。 実験回数10が終了すると実験回数100、1000、10000と進むようにする。 確率が0.5に収束することを確かめる。 どうすればいいでしょうか?
10000回なら100x100のセルですむからワークシート上だけで 試行できるぞ。
826 :
824 :04/11/27 15:00:45
>>825 エクセルの操作で行うのではなく、全てVBAで行わないといけないんです
宿題丸投げスレになった?
そもそも問題が良くわからん。824の書き方だと 30%ってのは女性客に対する独身女性の割合だと おもうんだが、答えが0.5に収束するってのは変だよね。 実は30%というのは全体に対する独身女性の割合なんじゃ ないの? ○投げにしても問題文ちゃんとこぴぺ してくれよ。
829 :
824 :04/11/27 16:22:22
>>828 ある旅行ツアーで参加者を調べたところ、60%は女性(40%は男性)で、
その内30%は独身女性であった。女性客からデタラメに1人選んだ時に、
その人が独身である確率を求めよ。
事象A:独身である人
事象B:女性である
条件付き確率の公式によって、0,5(確率が0.5に収束することを確かめる)
条件付き確率の公式って何?
831 :
デフォルトの名無しさん :04/11/27 18:43:44
>>829 女性客の内30%が独身で、
女性客からデタラメに1人選んだときに
独身である確率は、当然30%だろ。
そう読めなくもないな
834 :
デフォルトの名無しさん :04/11/27 19:30:11
シートにボタンとリストボックスを作っておいて ボタンクリックイベントでリストボックスを引数にしたプロシージャを呼び出す形で リストボックスのvisibleをトグルしたいのですが上手くいきません 以下失敗作ですがアドバイスお願いします 'リストボックス名 lbcustomer 'ボタン名 cbToggleCustomerList 'Aタイプ: Private Sub cbToggleCustomerList_Click() AnyListBoxVisibleTggle (ActiveSheet.OLEObjects("lbCustomer")) End Sub Sub AnyListBoxVisibleTggle(AnyListBox As Variant) '型は何? AnyListBox.Object.Visible = Not AnyListBox.Object.Visible End Sub 'Bタイプ: Private Sub cbToggleCustomerList_Click() AnyListBoxVisibleTggle (lbCustomer) End Sub Sub AnyListBoxVisibleTggle(AnyListBox As Variant) '型は何? AnyListBox.Visible = Not AnyListBox.Visible End Sub
>>834 Aタイプ
AnyListBox.Visible
Bタイプ
Activesheet.lbCustomer
>>835 両方で出来ました
色々試したつもりだったんですが
同じ間違いを繰り返し続けてたのかもしれません・・・
有り難うございました
837 :
デフォルトの名無しさん :04/11/27 22:52:42
Excel2003を使用してますが VBAでフォーム上のテキストエリアで右クリックしたときにメニューを表示させたいのですがどうすればいいのでしょうか?
838 :
デフォルトの名無しさん :04/11/28 00:08:33
コンボボックスで値を編集できないようにする方法を誰か教えて listfillrange を a1:a10 とセル範囲を指定するまではいいけど、 その値を編集できて値が変わるのがダメなんですよ。。。
840 :
デフォルトの名無しさん :04/11/28 00:51:14
841 :
デフォルトの名無しさん :04/11/28 02:15:40
VBAでフォームモジュールとクラスモジュールだけ使ってりゃ オブジェクト指向と言えますか?
>>841 C言語でかきゃ構造化というわけでもないのと同様でちゃんチャラお菓子い。
コントロールの素早いクリック操作がダブルクリックと判定されて困ってるんですが ダブルクリックイベントって無効に出来ますか? それとも何か良い解決方法がありますか?
844 :
デフォルトの名無しさん :04/11/28 03:04:54
ハンドルしなきゃ無効なんじゃない?
無効ではないっぽいです ダブルクリックするとクリックイベントが2回発生して欲しいんですが 2回目は空のダブルクリックイベントプロシージャが回ってる感じがします ダブルクリックにもクリックと同じコードを書くって手もありますが 美しくない気がしますしそもそもクリックアップダウン時の挙動が違ってきますし・・・
846 :
デフォルトの名無しさん :04/11/28 14:40:29
Timer1がないんです。 VBのTimerはどのOCXですか?
847 :
デフォルトの名無しさん :04/11/30 10:28:26
0.6以下の乱数を表示させるためにはどうしたらいいでしょうか?
引き算か掛け算でmax0.6になるように汁
849 :
独学者 :04/11/30 20:31:23
WEB上のデータを入力し、その後、その入力データを 加工しようとするプログラムを作ったのですが、 入力データがあまりにも多すぎるためか、入力が完全にされる 前に次の作業を行ってしまい、エラーが生じます。 誰か、解決策を教えてください。
Application.Wait
今年度の年齢を出す関数はどう作ったらいいのでしょう…。 DateSerialで、今年度の3月31日を出すところまでやったのですが。。。
>>851 足し算と引き算が出来ると作れるよ
つまり算数の教科書を読めば良いということだね
>851 VBA初心者なのでこの程度まだ思い浮かびませんが・・・ A列:誕生日 B列:今年度の日(3月31日) C列:今年度の年齢を表示 Dim n, counter As Integer n = Sheets("Sheet1").Range("A65535").End(xlUp).Row counter = 0 For i = 1 To n counter = counter + 1 Sheets("Sheet1").Cells(counter, 3) = _ Application.RoundDown(((Cells(counter, 2) - Cells(counter, 1) - ((Cells(counter, 2) - Cells(counter, 1)) / (365 * 4))) / 365), 0) Next i ※B列がCells(counter,2)なので、この部分は今年度の日が一定なら定数にしても良いと思います。 もっとすっきり出来るのであればご教授下さい>中上級者の皆様
すんません・・↑だとおかしいですね・・ Application.RoundDown(((Cells(counter, 2) - Cells(counter, 1) - ((Cells(counter, 2) - Cells(counter, 1)) / (365 * 4))) / 365), 0) ↓ Application.RoundDown((Application.RoundDown((Cells(counter, 2) - Cells(counter, 1)), 0) - Application.RoundDown(((Cells(counter, 2) - Cells(counter, 1)) / (365 * 4)), 0)) / 365, 0) に変更してください。 でも汚いですね・・・;;
856 :
デフォルトの名無しさん :04/12/02 11:57:30
不良品が2個でるまで品物を検査し、5個以内で2回目が見つかったとき 再点検することにしている。製品が不合格になる確率をp=0.05, p=0.1, と変えながらそれぞれ製品数500個を検査した場合、 「再点検(再点検回数と再点検率)」する回数とその確率を求める VBAプログラムをつくりたいと思っています。 *1回目の不合格の製品が見つかると2回目の製品が不合格になるまでに検査 した製品をカウントする。 *1回目の不合格製品と2回目の不合格製品の間の製品カウントが5以上の場合に 再点検回数を1増やす。 乱数、If文、for文を使用しなけ ればならないことは分かっているんですが・・
>854 レスありがdです。 あれから自分なりに考えて見ました。 Function 年度年齢(生年月日 as Date) Dim 今月 As Byte Dim 今年度の日 As Date '←3月31日のこと Dim 誕生月 As Byte 今月 = Format(Date,"m") Select case 今月 Case 1,2,3 今年度の日 = DateSerial(Year(Date),3,31) Case Else 今年度の日 = DateSerial(Year(Date)+1,3,31) End Select '↑ここまでこの前考えてた所です 誕生月 = Format(生年月日,"m") Select Case 誕生月 Case 1,2,3 年度年齢 = DateDiff("yyyy",生年月日,今年度の日) Case Else 年度年齢 = DateDiff("yyyy",生年月日,今年度の日)-1 End Select End Function 合ってるかどうか確証がなかったのですが、 デバックすると、なんとなく年齢はあってるようなので、 この形で落ち着きました。 >854さんすいません…また分からないことあったら教えて下さい。
>>857 それを簡潔にするとこうかな?
Function 年度年齢(生年月日 As Date)
Dim 今月 As Byte, 誕生月 As Byte
Dim 今年度の日 As Date '←3月31日のこと
今年度の日 = DateSerial(Year(Date) + IIf(Format(Date, "m") <= 3, 0, 1), 3, 31)
年度年齢 = DateDiff("yyyy", 生年月日, 今年度の日) - IIf(Format(生年月日, "m") <= 3, 0, 1)
End Function
名前を付けて保存ダイアログの 最初に表示されているフォルダを指定する方法ってありますか? 苦肉の策で Application.Dialogs(xlDialogSaveAs).Show で ファイル名にフルパスを指定したんですが 何故かパスが削られてファイル名のみ有効になりますし・・・
860 :
デフォルトの名無しさん :04/12/03 11:23:45
VBA Accessでの質問したいのですが コンボボックスからモジュールへ値を持って取ってきたいのですが出来ません。 本来だったらコンボボックス名.valueで取れると思うのですが私がしたいのは 列数3,列幅0cm;2cm,0cmのところから二つ目の列の値を持ってきたいのです。 従来通りコンボボックス名.valueをすると一列目が取れてしまいます。 どのようにすれば二列目の値を取ることができるでしょうか? ご教授お願い致します。
861 :
860 :04/12/03 11:35:30
事故解決いたしました。 コンボボックス名.Column(列番号)でした。
コンボボックス名.column(1)でならんかな? インデックスは0かららしいです、念のため。
しまった! タッチの差やった…。
864 :
デフォルトの名無しさん :04/12/03 15:04:46
サブフォームにテーブルを表示させているのですが ここにデータを入力したデータをDBに反映させたり出来るのでしょうか? 色々資料を見るとテキストエリアを並べてRDBの様に見せかけてるやつが 多いのですが・・・。 また「検索」ボタンを押すとコンボで選択した値をキーに検索をかけ サブフォームに反映させたいのですがどのようにすれば可能でしょうか? 2つやり方を思いついたのですがそれで可能なのかが分かりません。 1.コンボの値をモジュールで受け取りSQLを生成してサブフォームに反映。 (SQLを作るところまで出来たのですがサブフォームに反映の仕方がわかりません。) 2.コンボの値をクエリで受け取り画面を生成 どうかご教授お願い致します。
865 :
デフォルトの名無しさん :04/12/03 21:25:00
ご教授願います。 TBL内に任意のアドレスを保持します。 そのアドレスを元に、画像を取得し コントロールに貼り付けたいと思っているのですが、 画像取得時にWindowsの画面と思うのですが、 「インポート中です」と言うメッセージが出てきてしまいます。 このメッセージを消す方法はないでしょうか? 現在、レジストリ等弄りましたが改善されませんでした。 宜しくお願い致します。
>>865 その質問に答える前に一つ聞くがお前巨乳は好きか?
867 :
デフォルトの名無しさん :04/12/04 01:27:49
ExcelのVBAで、applicationのメソッドにEvaluateというのがありますが これはシェルやPerlのevalのように 文字列でサブルーチン名を渡すとそのサブルーチンを実行してくれるような 機能はないのでしょうか? 組み込み関数だと上手くいくようなのですが、自分で定義したものだとどうも駄目です。 関数のディスパッチなどに使えたら便利だなぁと思うのですが…
868 :
デフォルトの名無しさん :04/12/04 15:17:31
VBAでCollectionに入れた要素って 個々の要素を決してRemoveすることがなければ Addした順序で並んでいると信じちゃって良いんでしょうか? ちょっと試したところ、そんな感じになっているのですが。。
>866 好きですが
>>859 ChDir "C:\Temp"
Application.GetSaveAsFilename
>>867 関数のディスパッチってこういうこと?
Sub Main()
Dim i As Long
For i = 1 To 3
Application.OnTime Now(), "Test" & i
Next
End Sub
Sub Test1()
MsgBox "Test1"
End Sub
Sub Test2()
MsgBox "Test2"
End Sub
Sub Test3()
MsgBox "Test3"
End Sub
872 :
デフォルトの名無しさん :04/12/04 18:36:04
Perlのpush、pop、shift、unshift、split、join あたりの関数誰か作ってくれないかね?
>>871 おお、まさにそれです!
OnTimeというのには面食らいましたが素晴らしい。
お借りします。サンクスです。
Application.Runのほうがいい希ガス
>>874 そうですね。
Application.Run は出てこなかった・・・。
CSVファイルをエクセルに取り込もうと思ったら CSVファイルの中身が ・先頭にCRが二つ ・改行がLF になっていました 毎回、ワードパッドで変換するのも大変なので エクセルのVBAで改行コードを書き換えようと思いました CSVファイルをエクセルの#1に取り込んだ後 ・先頭のCRを削除 ・LFをCRLFに変換 という作業をしたいと思います
とりあえず ↓こんな感じで構想したんですが Open FILENAME For Input As #1 <開いた#1を全部 C に突っ込む作業> C.Replacement What:=Chr(13), Replacement:="" 'LF CRLFへの変換 C.Replace What:=Chr(10), Replacement:=Chr(13) & Chr(10) <#1に書き戻す作業> '以下Sheet1に書き込む という流れを考えたんですが <開いた#1を全部 C に突っ込む作業> <#1に書き戻す作業> この作業がうまくいきません はたしてChr(13)やChr(10)で変換できるのかも不明・・・ うまくエクセル内部で改行コードを変換したいのですが 達人のみなさん、良い方法ないでしょうか?
perlの方が楽。
>>876-877 置換する前の状態でExcelに取り込むとどういう状態に
なるんですか?
>>879 CSVをダブルクリックで普通に開くと
先頭にCRがくっ付いてるので最初の一行目が「・・」か文字化け、あるいは「・・データ」または
一行目も正常に読まれる
という状況です
2行目以降は、LFはCRLFに置き換えて読み込まれて各セルに格納されるようです
Open FILENAME For Input As #1
をつかっているのは
CSVそのままだと65536行以上になる場合があるので
内部で開いて同じグループは横に伸びるように振り分けて取り込んでいます
ワードパッドで毎度変換するのも大変なので
なんとかできないものかと思考錯誤しております
>>880 参考になれば。
Sub Macro1()
Dim FS, CSVFile
Dim FileName As String, CSVStr As String
FileName = ActiveWorkbook.Path & "\TEST.CSV"
Set FS = CreateObject("Scripting.FileSystemObject")
Set CSVFile = FS.OpenTextFile(FileName)
Do Until CSVFile.AtEndOfStream
CSVStr = CSVStr & Replace(CSVFile.ReadLine, vbCr, "") & vbCrLf
Loop
CSVFile.Close
Set CSVFile = FS.OpenTextFile(FileName, 2)
CSVFile.Write CSVStr
CSVFile.Close
MsgBox "変換完了"
End Sub
>881 こんな夜更けに有難うございます!!! とりあえず、今あるマクロに上記のコードを組み込んだら 秀丸で意図的に作ったLF改行のCSVで うまく動きました 明日・・・というか今日ですが 881さんのを参考に職場の方にある問題のCSVファイルで実行 してみます これから寝ます かみさまありがとうございました
883 :
デフォルトの名無しさん :04/12/05 22:40:41
エクセルのコマンドバーなんですが Set Ctrl = Application.CommandBars("Cell").Controls.Add() With Ctrl .OnAction = "Sheet1.Hoge" .Parameter = "12345" End With とすると、Sheet1.Hoge が引数 "12345" で呼び出されるようなことが ヘルプにあるのですが、どうも引数が渡っていないようです。 Public Sub Hoge(Arg as String) と受け側を定義して実行すると「引数は省略できません!」と怒られてしまいます。 多分、どこか間違っているのでしょうが、コマンドバーから呼び出す関数に引数を渡すのは どうやったら良いのでしょうか?お助け下さい。
884 :
デフォルトの名無しさん :04/12/05 22:59:42
ある集合(標本数は変数)を辞書式配列にして表示するマクロを考えていますが 組み方が思いつきません 何重かのループになりそうなんですが…
>>884 ハッシュとか連想配列を使いたいということですかね?
>ハッシュとか連想配列 違うもんでしたっけ?
>>883 確実に間違った解決法だと思うけど、
With Ctrl
.OnAction = "Sheet1.Hoge"
.Parameter = "12345"
End With
↓
With Ctrl
.OnAction = "'Sheet1.Hoge 12345'"
End With
とすると引数(12345)は渡されてるようです。
>>887 あ、シングルコーテーションするのですね!!
やってみます!!ありがとうございます
>>887 ばっちしでした。ありがとうございます。
>>884 Microsoft Scripting Runtimeに参照設定(or CreateObject)して
Scripting.Dictionary使うなり
Collectionでそれっぽく使うなり...
880です スレの皆さんにはあまり興味ないかもしれませんが事後報告です 問題のCSVファイルを881氏のを参考に試行錯誤してみたんですが 予想していた動きにならずおかしいなぁ・・・と思い、ファイルダンプしたら FF FE 22 00 30 00 31 00 ・・・0A・・・と、成っており、どうやら ファイルエンコードタイプ:UTF-18,リトルエンディアン,BOM付 改行コード:LF というファイル形式になっていました ファイルタイプの変更はAODというのを使うとうまくいきそうだという事で あんまり良く分からないんですがファイル変換→保存できるコードを作ってみました
Sub Macro() Dim xlAPP As Application Dim Stm1 As Object Dim Stm2 As Object Dim SourceFilePath As String Const TITLE = "テキストファイル読み込み" Const FILTER = "全てのファイル (*.*),*.*" Const adLF = 10 Const adCRLF = -1 Const adReadLine = -2 Set xlAPP = Application xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" SourceFilePath = xlAPP.GetOpenFilename(FileFilter:=FILTER, TITLE:=TITLE) If StrConv(SourceFilePath, vbUpperCase) = "FALSE" Then Exit Sub 'UTF-16 の取込 Set Stm1 = CreateObject("ADODB.Stream") Stm1.Open Stm1.Charset = "UTF-16" Stm1.LineSeparator = adLF Stm1.LoadFromFile SourceFilePath
'shift-jis の書込 Set Stm2 = CreateObject("ADODB.Stream") Stm2.Open Stm2.Charset = "shift-jis" Stm2.LineSeparator = adCRLF Stm1.CopyTo Stm2 Stm2.SaveToFile SourceFilePath, 2 Stm2.Close Stm1.Close Set Stm2 = Nothing Set Stm1 = Nothing End Sub 達人なら、直接セルに割り振ったり出来るんでしょうが 当分の間、自分はまず変換保存してから再度読み込んで処理しようかと
895 :
デフォルトの名無しさん :04/12/06 16:09:17
表形式のサブフォームがあるのですがその表の内容をAccessDBに更新したいのですが どのような処理を行えば実現するでしょうか? 表形式のサブフォームをの内容をモジュールの方へ持ってこられればなんとでも出来そう なのですが・・・。 どなたかお教え願えませんでしょうか?
896 :
デフォルトの名無しさん :04/12/06 17:14:25
サブフォームで一番左の列の▲マークがある所のレコードのデータは 『サブフォーム.列名』で習得できました。 しかしこの方法だと▲マークがあるところだけで全部の行を更新するには 手動でレコードを次にしてあげなくてはなりません。 DBのレコードはMoveNextで次の行に行ってくれると思うのですがモジュール上 にてサブフォームのレコードを次に移して上げるにはどのようにすればよいのでしょうか?
897 :
デフォルトの名無しさん :04/12/06 20:01:54
VBAってどんなことできるんでしょうか? VBみたいにウィンドウ表示させたり、API関数使っていろいろできたりするんでしょうか?
899 :
865 :04/12/07 10:05:30
900
901 :
デフォルトの名無しさん :04/12/07 22:21:02
どなたかご教授お願いします。 最近VBAに目覚めたものです。 Sub データ行のあるところまで計算式挿入() Range("c1", Range("c1").End(xlDown)).Select '3列目のデータ最終行のセルを選択 Selection.Insert Shift:=xlToRight '一列挿入 Range("c2").Formula = "=a2+b2" 'c2に計算式を入れる Range("c2").Copy 'それをコピー Range("c3", Range("c3").End(xlDown)).PasteSpecial 'Bのセル(Dのセルでもよい)のデータの最終行まで計算式を入れる End Sub としたら、その列の最終行(65536行)まで計算式がコピーされてしまいます。 どなたか、bのセルの最終行(行は任意、ケースバイケースで最終行が変わる) 方法をご教授していただきますよう、お願いします。
902 :
デフォルトの名無しさん :04/12/07 22:49:04
>>901 Range("c3", Range("c3").End(xlDown)).PasteSpecial
↓
Range("c3", Range("c65536").End(xlUp))).PasteSpecial
最終行から上に向かって飛ばす癖をつける方がいいよ。
データの入力された範囲を調べるのにもね。
つか、コピーしてから貼り付けんでも、一発でいれりゃぁいいと思うが。
Range("c2", Range("c65536").End(xlUp))).Formula = "=a2+b2"
>>901 たんま、よくコード見てなかった。
Selection.Insert Shift:=xlToRight '一列挿入
ここでC列がD列になっているんだから
Range("c3").End(xlDown)で最終行まで飛んであたりまえ。
だって、データがないんだもの。
904 :
901 :04/12/07 23:06:24
>>902 ,903
さっそくのご回答ありがとうございます。
そうなんです。最終行まで飛んでしまうんです。
列を挿入して、(空白列に)一セルだけデータを入力し(ここまでは出来る
んですが)横のセルにはデータが入ってる最終行までデータを貼り付けする
のは無理なんでしょうか?
Range("c1", Range("c65536").End(xlUp)).Insert Shift:=xlToRight Range("c2", Range("D65536").End(xlUp)).Formula = "=a2+b2" この2行ですむんじゃない?
906 :
901 :04/12/07 23:24:58
>>902 丁寧なご回答ありがとうございます。
イメージ的には上の記述でいいのですが、これだと、隣のセル(d列まで)
計算式が入ってしまうんです。大変度あつかましいですが、
cの行だけデータを貼り付けする方法をよろしけれ教えてください。
Sub hogehoge() Dim n As Long n = Range("C65536").End(xlUp).Row Range("C1:C" & n).Insert Shift:=xlToRight Range("C2:C" & n).Formula = "=a2+b2" End Sub これでどないでしょ。
908 :
901 :04/12/07 23:42:41
902>> バッチリできました! 大変助かります。ありがとうございました。 dim n as long ・・・と nの意味が分かりません。 とりあえず結果オーライとなりましたが、これからまた勉強します。 ホントVBAって面白いですね。 いままでハンドでちまちま入力していたのはなんだったんだろうか・・・・。 ともあれ、ありがとうございました。
ヘルプで 変数の宣言 って質問してみましょう。( ̄ー ̄)
>>902 ちょうどいま、変数のところを見て、なんとなく意味が分かった
ところです。as long は長整数型の数値型で変数を宣言することなんですね!
(マニュアルをそのまま引用してますが)
これはどう? Sub データ行のあるところまで計算式挿入() Range("C1", Range("C65535").End(xlUp)).Select Selection.Insert Shift:=xlToRight '一列挿入 Selection.Formula = "=a1+b1" '計算式を入れる Range("C1").ClearContents 'C1はいらないので消す End Sub
913 :
デフォルトの名無しさん :04/12/08 03:01:34
エクセルVBAで罫線の位置を調べる(取得する)ことは出来ますか? 無理ならば罫線で囲まれたセルの数でもいいんですが、探しても見当たりませんでした。 知っている方教えてください。
>>913 こんなかんじでいかがでしょうか。セルを適当に選択してから試してみてください。
Sub test()
Dim x As Object, i As Long
For Each x In Selection
If x.Borders(xlBottom).LineStyle <> xlLineStyleNone Then
i = i + 1
End If
Next
MsgBox "罫線で囲まれたセルの数:" & i
End Sub
英語版のAceessで、日本語版で作ったAccessのプログラムは動くものなのでしょうか? 勿論表示は全て英語に置き換えます。
916 :
デフォルトの名無しさん :04/12/10 22:43:19
マクロをいじっていたら、エクセルを起動したときに《ファイルが見つかりません》のダイアログが出るようになってしまいました。 何のファイルが見つからないのかさっぱりわからないのですが。。 ちなみにエクセル97です。
97・・・ そんなもん窓から投げ捨てろ
918 :
デフォルトの名無しさん :04/12/11 14:39:42
モンテカル法でπの値をシミュレーションする プログラムを作りたいんですが・・・
Dim n As Long Dim i As Long Dim sum As Long Dim c As Long Dim cc As Integer n = Range("A1").Value Randomize sum = 0 c = 100 cc = 3 For i = 1 To n If (Rnd ^ 2 + Rnd ^ 2) < 1 Then sum = sum + 1 End If If (i Mod c) = 0 Then c = c * 10 Cells(cc, 1) = i Cells(cc, 2) = sum * 4 / i cc = cc + 1 End If Next i If Cells(cc - 1, 1) <> n Then Cells(cc, 1) = n Cells(cc, 2) = sum * 4 / n End If
920 :
デフォルトの名無しさん :04/12/11 23:14:42
エクセル97なのですが Nameオブジェクトの RefersToに 設定できる文字列の長さって制限とかあるのでしょうか? 絶対参照で30セル分くらいのアドレスに名前をつけたいのですが なにか制限ありそうな気がしてググったのですが見つかりません。 安心しても大丈夫なのかなぁ? 知っている方すみません教えてください
922 :
920 :04/12/11 23:54:13
>>921 確かに、おっしゃるとおり。m(__)m
試したところ、260文字前後でアウトでした。(255文字?)
Unionもアドレスがこの文字数超えるとおかしくなっちゃうし、まいった。
みなさん、分散してならんでるセルを名前かなんかでハンドリングしたい場合って
どうされています?
コレクションにいれといて ループで回すとか、そんな感じになっちゃいますかね。。。
ブック名:file1.xls シート:先頭のシート このシートに、ラベルやコンボボックスなどを並べた操作画面の イメージがあります。この中から全てのラベルに書かれた文字列 を抜き出し、別のブックなりに一時的にそれらを書き出すには どうしたらいいですか?
925 :
デフォルトの名無しさん :04/12/13 01:50:45
ワークシートに文字列型で入力してある、"0001"のような値を、 Cells(行,列)で取得しているのですが、数値と判断されてただの1になってしまいます。 どうすれば文字列として扱うことができるでしょうか。
>>924 イメージからは抜くのは非常に難しい
文字認識エンジンを作れるなら別だが
>>925 Cells(行,列).Text
927 :
デフォルトの名無しさん :04/12/13 21:28:56
初歩的な質問で申し訳ありません。 本日からExcel2000を使用してVBAを始めたのですが、 複数行選択したとき、値が選択した最初の行しか取ることができません。 どのようにすれば全ての値を取ることができるのでしょうか。 どうかよろしくお願いします。
>>927 Dim rng As Range
For Each rng In Selection
rng.Value="Hoge"
Next rng
929 :
927 :04/12/13 22:21:04
>>928 解決することができました。
大変助かりました。ありがとうございます。
930 :
925 :04/12/13 23:18:45
>>926 ありがとうございました。できました。
実は値を再び別のセルに挿入するプログラムだったのですが、
挿入時にも数値型に変換されてしまいました。
こちらは挿入時に"'"と文字列連結してから代入することによって解決しました。
あわせてご報告します。
>>930 そういう場合は下のコード使ったほうがいいんじゃないですか?
A1セルの値をA2セルへ入れる場合。
Range("A1").Copy Destination:=Range("A2") 'コピー
Range("A1").Cut Destination:=Range("A2") '移動
932 :
918 :04/12/14 13:12:02
Sub Vba() Set en = Range("C2:C6") Set hit = Range("B2:B6") Const z As Double = 3.14159265358 X = 5 For j = 0 To X hit = 0 For i = 1 To 10 ^ j If (Sqr((Rnd * 2 - 1) ^ 2 + (Rnd * 2 - 1) ^ 2)) < 1 Then hit = hit + 1 End If Next i en(j) = 10 ^ j en(j) = hit / 10 ^ j * 4 Next j End Sub このプログラムで円周率の値はでるのですが、このプログラムから ヒット数をRange("B2:B6")につくりたいとおもいます。 どのようなプログラムが必要なのでしょうか? 力をお貸しください。
cells( j + 1, 2 ) = hit
934 :
918 :04/12/14 19:41:49
>>933 あ、ありがとうございます。
あともう一個質問させてください。
各シミュレーションが終了する度に(10回100回と)、
Msgboxを表示してシュミレーションを続けるかどうかを問い合わせる
ためにはどうすればいいでしょうか?
質問ばっかですいません
配列の受け渡しなんですが Dim X(42) As Variant Range(Sheet1.Cells(EGYO, 12), Sheet4.Cells(EGYO, 43)).Value = X(11 to 43) 43個の配列変数があって そのうちの11〜42をセルに入れようと思って X(11 to 42) と、書いてみたんだけど無理なようです やっぱり Do LoopとかFor Nextで 一個一個入れないといけないんでしょうか?
訂正です Dim X(42) As Variant EGYO As Integer 中略 Range(Sheet1.Cells(EGYO, 12), Sheet1.Cells(EGYO, 43)).Value = X(11 to 42) こんな感じになってます
938 :
デフォルトの名無しさん :04/12/16 00:22:35
エクセルのグラフの散布図等で、あるデータラベルが他のデータラベルと 重なっているかどうかを判定するような関数を書くにはどうやったら良いのでしょうか? 大量に値をプロットしてラベルを付けるとラベル同士重なって読めなくなってしまって… 適当に間引きしたいのです。 ラベルの topとleftと文字数で地道に計算する方法しか思いつかないのですが なんか良いやり方ないでしょうか?
939 :
デフォルトの名無しさん :04/12/17 13:37:02
A,B二つのブックがあったとして BのブックからAに作成してあるUserFormを操作する方法ってあるのでしょうか? あればヒントだけでもよいので教えていただけないでしょうか。
940 :
デフォルトの名無しさん :04/12/17 20:49:42
VBAで変数の型変換(キャスト)ってできますか?
CBool(expression) CByte(expression) CCur(expression) CDate(expression) CDbl(expression) CDec(expression) CInt(expression) CLng(expression) CSng(expression) CVar(expression) CStr(expression)
ユーザー定義関数の戻り値として配列を返すのはどうやればいいでしょうか?
普通にできるぞ
>>939 Bのブックから、Aのブックを参照設定する。
945 :
デフォルトの名無しさん :04/12/18 23:59:09
エクセル97のVBAなんですが、たとえば以下のクラスがあったとして <<Class Foo>> Public Field_A as Long Public Field_B as String Public Field_C as Date このインスタンスが詰まったコレクション Foos があったとします。 このコレクションをField_B, Field_C 等の好きなメンバでソートしたいのですが どうやったらよいのでしょうか?
946 :
デフォルトの名無しさん :04/12/19 00:40:52
なんかググってみたら こういうのはADOとかにリンクさせて処理するもんなんでしょうか? (確かにそのほうがラクそうだ)
947 :
デフォルトの名無しさん :04/12/19 06:29:10
エクセル2000を使っています。 表示しているシートを、VBAを使って 画像として保存することできますか?
>>947 ウインドウハンドルからデバイスコンテキストを取得してそれの中身をビットマップファイルとして保存すればよいですよ。
>948 ありがとうございます。早速やってみます。
'質問 1 Word VBA Option Base 1 Sub Q1() Selection.WholeStory Selection.Delete ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=4, NumColumns:=6 For K = 1 To 4 For J = 1 To 6 Selection.TypeText Text:="(" & K & "," & J & ")" Selection.MoveRight Unit:=wdCharacter, Count:=1 Next J Next K End Sub '上記によって4行6列のテーブルを Word2000 の Book1 に作表しました。 'この後、テーブルの2行目と3行目の欄は全て高さを30ミリに、また4列目と5列目の欄は全て横幅を15ミリに変更しようと思います。 'End Subの前に何を追加すべきでしょうか。どなたかご教示いただけると有難いです。
A1とC1のセルを選択していたとして。コードでA1のセルの選択だけを解除したいときはどうやったらいいのでしょうか?
C1を選択で出来ない?
>>952 出来ましたがA1,C1,E1と3つあってA1だけ解除したいときE1も選択解除されてしまいます。
こういった場合はどうすればいいのでしょうか?何度もすいません。。
仕様かわってんじゃん…
>>953 Range("C1,E1").Select
956 :
デフォルトの名無しさん :04/12/22 16:07:57
教えてください。 Excel2000でクリップボードのクリアをするVBAがわかりません。 マクロの記録をしても記録されないようです。 よろしくお願いします。
>>956 Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long 'クリップボードをオープン
'クリップボードを空にし、クリップボード内のデータのハンドルを解放
Declare Function EmptyClipboard Lib "User32" () As Long
Declare Function CloseClipboard Lib "User32" () As Long 'クリップボードをクローズ
'クリップボードクリア関数呼び出し 別にこれを呼び出さなくても直接CLR_ClipBoard "" でかまいません
Sub ClipCLR()
CLR_ClipBoard ""
End Sub
Function CLR_ClipBoard(myString As String)
Dim ret As Long
'クリップボードオープン
If OpenClipboard(0&) = 0 Then
GoTo ERR1
End If
'クリップボードクリア
ret = EmptyClipboard()
'クリップボードクローズ
If CloseClipboard() = 0 Then
GoTo ERR2
End If
Exit Function
ERR1:
MsgBox "クリップボードが開けません(エラー)"
Exit Function
ERR2:
MsgBox "クリップボードが閉じれません(エラー)"
Exit Function
End Function
>>956 ひょっとして、VBAでブックを閉じる時に「クリップボードに大きな情報があります」
ってエラーを出さないようにしたいからですか?
変数にセルの情報として条件付書式設定で設定した色を 入れることはできないんですか? 「.Text」だと書式のみになってしまいます。
961 :
デフォルトの名無しさん :04/12/26 08:37:23
>>960 このあたりの事?
.Interior.ColorIndex = 6
.Interior.Pattern = xlSolid
>>961 それは色をあらかじめ指定しておかないといけない、ということですか?
964 :
デフォルトの名無しさん :04/12/27 04:02:31
If Selection = SpecialCells(xlCellTypeBlanks) といった、もしアクティブセルが空白だったら Exit Sub する といったのを書きたいのですがどうしてもわからないので教えてくれませんか。
まだまだ初心者ですが If Cells(*,*)<>""Then じゃだめかな?
966 :
デフォルトの名無しさん :04/12/27 19:08:38
vba3週間目さん、解答してもらいありがとうございます。 Cells(*,*)といった形ではなく、SelectionかActiveCellを使いたかったんですが 一応、 If Selection.Value = " " Then でできました。
If ActiveCell.Value = "" Then でもいけるし。
>>960 アクティブセルが対象だとして、条件書式の1番の色を拾うには
myColorIndex = ActiveCell.FormatConditions(1).Interior.ColorIndex
969 :
デフォルトの名無しさん :04/12/28 10:25:59
VBエディタで、nameNumberという変数を作ったとします。 naまで入力したら、何かキーを押すと補完してくれる、 という機能があったら教えて下さい。
A列の1行目から10行目の中で太字になっている数字を合計しA11に表示したい のですが、「太字のみ」という処理がうまく出来ません。 教えていただけないでしょうか?
971 :
デフォルトの名無しさん :04/12/28 13:29:00
>>970 Public Sub test()
Dim intSUM As Integer
Dim I As Integer
intSUM = 0
For I = 1 To 10
If Range("A" & I).Font.Bold = True Then
intSUM = intSUM + Int(Range("A" & I).Text)
End If
Next I
Range("A11") = intSUM
End Sub
すみません、馬鹿な質問かもしれません・・・が、教えてください。 JISコードをSJISに変換する関数とかってありますでしょうか?
975 :
デフォルトの名無しさん :05/01/01 14:14:05
∧_∧ ┌──────────── ◯( ´∀` )◯ < あけおめ! \ / └──────────── _/ __ \_ (_/ \_) lll
976 :
デフォルトの名無しさん :05/01/03 00:35:05
VBAのuserform上に線とか四角形など 描くことってできるのでしょうか?
書ける