ExcelのVBAに関する質問スレです ★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。 ★2 ExcelのVBA以外の部分に関する質問はNGです。 但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。 ★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。 ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、 コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 ★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
>>1 乙
それにしても前スレ最後の方ときたら次スレ案内どころか、くだらない喧嘩でスレを埋め尽くすんだから、
やっぱVBAは厨房言語と言われても仕方が無いほどの民度の低さを実感する
なんで終わった話蒸し返すかなぁ。 そんなに悔しかったのか?
>>1 乙
>>4 何で蒸し返すかなぁ・・・
そういうのが呼び水になるんだって気付けよ
ID付けない辺りが民度の低さだろ
vba初心者です。 フォームに名前、番号、部署を入力して、登録ボタンをクリック。 A2に値が入っていない場合はその列に項目を追加。 もし入っているならば、次の行へ移動してもう一度条件分岐開始。 というプログラムをつくろうと思ったのですがうまくいきません。 どこがおかしいのでしょうか。初歩的な内容ですがヒントください。 Private Sub 登録_Click() If TextBox1 = "" Then MsgBox ("名前が記入されてない") ElseIf TextBox2 = "" Then MsgBox ("番号が記入されてない") ElseIf TextBox3 = "" Then MsgBox ("部署が記入されてない") Else Cells(2, 1).Select Do While ActiveCell Like "" ActiveCell.Offset(1, 0).Select Loop ActiveCell = TextBox1.Value ActiveCell.Offset(0, 1) = TextBox2.Value ActiveCell.Offset(0, 2) = TextBox3.Value Me.Hide End If
>>10 > Do While ActiveCell Like ""
ここ
「もし入っているならば」になってない
>>10 いろいろ突っ込み所満載だが
とりあえずWhileをUntilにすれば問題は解決すると思う
相当悔しかったらしい。(w
16 :
デフォルトの名無しさん :2012/01/29(日) 20:06:22.65
俺は Do While 〜、Do Until 〜、Loop While 〜、Loop Until 〜 は一切使わない 必ず Do If 〜 Then Exit Do Loop を使う While & Untilで出来ることは全て出来る While & Untilには出来ないことも出来る わかりやすい 修正しやすい 条件内容によっては速い 良いことずくめ
いきなりなんだ 好きにしたらええがな
>条件内容によっては速い これ詳しく教えてください。 どういうときに速くできるのですか?
いきなりじゃないじゃん。 つい数レス前の質問で間違いがあった部分の話題じゃん。 もしかして前スレからの下劣なケンカにご執心で それ以外の質問回答とか目に入ってないのか?
>>21 いや、質問の内容と一切関係ない話だろ
コーディングスタイルの話なんか不毛だし荒れるだけ
23 :
20 :2012/01/29(日) 20:34:33.04
>>22 すいません、
>>18 さんのレスはVBA初心者としては関心ある話題なのですが・・・
>>18 同じく初心者としては興味ある
DOとLOOPの2つと
それにwhileかuntilのどちらかの3つがセットなのかと思ったんだけど違うのか
相変わらずスレチの話題で伸びてるな
26 :
20 :2012/01/29(日) 21:03:22.50
>>24 さん
Do Loop だけで成立しますよ。
ただ、そのままだと無限ループなので何らかの脱出条件は必要ですから
通常はおっしゃるとおりにUntilやWhileを組み合わせる訳ですよね。
で、
>>18 さんはIf文で脱出条件を設定することを推奨されていて、
私はその手法自体は知ってたのですが、
そのほうが速くなる状況というのが分からないのでぜひ知りたいと思いました。
無理やりWhile/Untilの条件をでっち上げる位なら、 Exit Doするコードを書くほうが良い、ってことじゃね? 機械的に適用するのは頭が固すぎると思うが。
28 :
デフォルトの名無しさん :2012/01/29(日) 21:19:41.12
>>10 のコードを
DO ifで書きなおして無事動きました。
確かにこっちのほうがわかりやすい気がします!
ありがとうです!
俺もDo Until の中に必ず If Then Exit Do End Ifを付けてる For Next なら Exit For だな 明示しておけば(自分にとって)判りやすいという理由だけど
30 :
20 :2012/01/29(日) 21:26:33.22
>>27 それって速度は変わらなくないですか?
自分でちょっと考えたのは脱出条件でAndを使うときに
UntilやWhileだとAndしかだめだけどIf文だとIfのネストで書けるから
(本当にほんのちょっとだけ)速く出来るかも、ということです。
31 :
20 :2012/01/29(日) 21:32:26.12
ゴガギーン
ドッカン
m ドッカン
=====) )) ☆
∧_∧ | | / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( )| |_____ ∧_∧ < おらっ!出てこい
>>18 「 ⌒ ̄ | | || (´Д` ) \___________
| /  ̄ | |/ 「 \
| | | | || || /\\
| | | | | へ//| | | |
| | | ロ|ロ |/,へ \| | | |
| ∧ | | | |/ \ / ( )
| | | |〈 | | | |
/ / / / | / | 〈| | |
/ / / / | | || | |
/ / / / =-----=-------- | |
>>31 成りすましは勘弁してください
私は31じゃないです。
>>29 >明示しておけば(自分にとって)判りやすいという理由だけど
意味がわからん。
Do While 〜 Loop も Do ... Loop Until 〜 も、「〜」で充分明示的だと思うが。
まあ、ループ中で読み込みとかの処理をして、EOF ならぬけて、そうでなければ
読み込んだデータの処理をして最初に戻ると言うような処理は、それなりにあるから
Do: ... : If 〜 Then Exit Do: ... : Loop も使うけど、それに限定するのは
>>27 の
言うようにちょっと頭固すぎと思う。
冗長に書いた方がわかりやすいと感じる人は結構いるっぽいね。
でも
>>29 は同じ条件判断を2箇所に書く(2回やる)ってことでしょ? それはないわー。
>>10 ActiveSheet.ShowDataForm
マジオススメ
>>34 >でも
>>29 は同じ条件判断を2箇所に書く(2回やる)ってことでしょ? それはないわー。
さすがにそれはないと思うが...、修正面倒だし、
そもそも他人が見たときヘタすると意図汲み取れないと思う。
37 :
デフォルトの名無しさん :2012/01/30(月) 00:27:10.99
>>35 使ってみたのですが、よく意味がわかりません。
起動時にフォーム呼び出しっぽいのですが、何もおこらないのですが
どういう効果があるのですか?
Test
2003/2007で質問です。 .OnAction で文字列を使うときにはどうすれば良いのでしょうか? 例えば、キー "foo" を持つ "dic" というディクショナリを引数とする関数を .OnAction に指定したい場合、 Sub Menu() Dim CB Set CB = Application.CommandBars("Cell").Controls.Add() With CB .Caption = "テスト" .OnAction = "'testfunc dic(""foo"")'" End With End Sub のようにしてもうまく動きません。 仕方が無いので、 val = dic("foo") .OnAction = "'testfunc " & val & "'" のように対処しています。 よろしくお願いします。
OnActionの実行されるスコープでは、 dicが見えていないって事なんじゃないか?
OnActionに指定するのはマクロ名 式は評価しないんだろ
OnActionは罠が多いよな…
>>40 > val = dic("foo")
> .OnAction = "'testfunc " & val & "'"
これで対処できるって事は
.OnAction = "'testfunc " & dic("foo") & "'"
で済む話のような気もするが…まさかな
&を使わずに書きたい、ってことじゃない?
式を評価した結果の文字列をOnActionに設定してるだけで、 OnActionに式が設定されて評価されてるわけではないと思うが
バカ多すぎw このレベルのことで意見割れるとかあり得ねぇw
草=複数の連続する"w" 1個の場合、複数でも連続でもないから、実は草ではない
マクロから別名保存のダイアログを出して、ユーザーにブックを保存してもらおうとしているのですが、 ダイアログおw表示させた時に初めての保存ならマイドキュメント、2回目以降なら前回のフォルダーを 表示されるようにするにはどうすればいいでしょうか? よろしく御願いします。
>>54 まず仕様をしっかり確定させないとプログラミングはできないぞ
初めてかどうかはどうやって判別するんだ?
前回のフォルダはどこにどうやって保存するんだ?
これが答えられない(わからない)ってなら、もうちょっと詳しく状況を書かんとなんとも言えん
>>54 初めての保存→直接Excelを起動しての作成
2回目以降→既存のBookを呼出し修正保存
意味はこれで合っている?
1年1組成績表フォルダの1月成績結果というBookを呼出して新規作成を選んだ時の保存先もやはりマイドキュメント?
或いは2月成績結果にBook名に流用変更して保存する場合は?
>>53 残念、ハズレ
というか、そもそも「単草」なんてないから
草=複数の連続する"w"
数が複数と定義されているので、単数を表す接頭語を付けることは無い
芝="w"そのものであり数は関係ない
数が定義されていないので、数を表す接頭語を付けることもある->単芝、複芝
「単草」ってのは君と同じく、単芝と草を混同した勘違い君が
思いつきで口にするだけで、定義としては存在していない
>>57 どっちでもええやん
言葉とはそういう勘違いから定着するもんだよ
正しい日本語は〜と言ってる学者連中はただの馬鹿だぞ
もう広まってる用法ってのは正しいものとしていかんと
59 :
デフォルトの名無しさん :2012/02/04(土) 07:16:34.18
>>57 そもそも「草」とか「芝」とかが定義されてるってどこで?
少なくとも非ネットの日常生活においてwを草とか芝とか言わない訳だが。
単にネット上のコミュニティーで認知されてると「君個人が認識してる」だけでしょ。
だったら「単草」だっておkじゃないの?
その辺の線引きが曖昧すぎだよ
ちなみに
>>53 ではありません。
草とか芝の定義とやらにも興味ないです
ネタ解説に釣られ杉wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
61 :
デフォルトの名無しさん :2012/02/04(土) 09:02:23.24
言い負かされるとネタで逃げる奴
かまうなよ これは僕はレス乞食ですって自己紹介をしてるだけなんだからwwww
>>58 いい訳必死だな
あのさ、誤用と、新語や新たな言い回しを一緒くたにしてないか?
別に既存の日本語以外は使っちゃだめとは言わないけど、
間違いを内包する言葉までまとめて「定着すればそれは正しい」なんて言うのはただの馬鹿だぞ
wを芝と呼ぶのは良いが、wをエックスと呼ぶのは明らかな間違いだろ
>>59 > 「w」の文字が並ぶ様子が「雑草が生えているように見える」というところから、
~~~~~~
> 「w」を多数並べて笑いを表現する行為を「草を生やす」と呼ぶ場合がある。
~~~~~~~~~~~~~
> 草 - ネットスラングでwwwwwwwのこと。
> 草:インターネットスラングのひとつ。(笑)の略であるwを多数書き連ねることで蔑笑を表したもの。
~~~~~~~~~~~~~~~~~
どこを見ても、「並ぶ」「多数」「書き連ねる」と複数であることを説明し、例としても7連のものが上げられている
因みに上記は独断と偏見入り交じる個人サイトの記事ではなく、ウィキペやニコペなど大手の手がける辞典の記事ですよ
荒らすなら他へ行け、馬鹿
こういう話題しかレスできないんだろ。 スルーしとけ。
66 :
デフォルトの名無しさん :2012/02/04(土) 11:44:22.68
wikiが定義ってアホかと
広辞苑だって出版された当時のスラングを個人の独断で大量に収録してんのに それは信頼してWikipediaをバカにする男の人って本質がわかってないってゆーか、頭悪いよね
反射的に wiki を馬鹿にする奴もどうかと思うが、 広辞苑が個人の判断で作られてるって、これまた 頭悪い以前のアホが来たな。
wikiをバカにしてるんじゃなくて、wikiがネットスラングの定義だって言ってるやつをバカにしてるんじゃないかな
まあ結論は出たみたいだから、もう終わりにしようぜ。
71 :
54 :2012/02/04(土) 19:32:32.70
>>55-56 レス、ありがとうございます。
返事が遅くなってすみません。
ユーザーフォームに保存用のボタンを貼って、保存しようとしています。
保存を行った時に保存先フォルダーの記憶用変数を用意して、その変数が
空なら初めての保存、空白以外なら保存用ダイアログを表示した時にそのフォルダーが
表示したいという事でした。
変数に取り込めれば、フォームを閉じる際にiniファイル等に保存して次回以降は
フォルダー選択の手順を省けると思いました。
よろしく御願いします。
72 :
54 :2012/02/04(土) 19:55:05.76
書き忘れました。 保存先記憶用変数が空の場合は、保存先ダイアログ表示時の フォルダーはExcel任せでも良いです。 よろしくお願いします。
73 :
デフォルトの名無しさん :2012/02/04(土) 20:05:32.51
iniファイルへの書き込みや読み込みはAPI使うっての知ってますか? まぁ単純にテキストファイルのオープンで読み込み書き込みでも出来なくはないだろうけど
>>71 chdir 前回保存先
名前を付けて保存ダイアログ表示
今回保存先を選択
非表示シートにcurdir(今回保存先)を書きみ保存
名前を付けて保存
複数のブックの一部を読み取っていくマクロを書いているのですが 非表示・バックグラウンドでブックを開くにはどうしたら良いのでしょう? ググったりしていろいろ試してみたのですが、どうしても一瞬表示されてしまいます。 マクロは Application.ScreenUpdating = False Set _ActiveSheet = ActiveSheet Set book = Workbooks.Open(PATH) book.Windows(1).Visible = False Call _ActiveSheet.Activate() Application.ScreenUpdating = True というようにしています。 また、ブックのオープンに時間がかかっているため、非同期でブックをオープンしてそれをキューに放り込んで行きたいのですが、 こういったことはどうやってやれば良いのでしょう?
>>71 ini ファイルじゃなくて、ブック自体に覚えさせることもできるよ。
Option Explicit
Const PropertyName As String = "SavedFolder"
Sub Macro1()
Dim SavedFolderProperty As DocumentProperty
Set SavedFolderProperty = Nothing
Dim Index As Integer
With ActiveWorkbook.CustomDocumentProperties
For Index = 1 To .Count
If .Item(Index).Name = PropertyName Then
Set SavedFolderProperty = .Item(Index): Exit For
End If
Next
End With
With Application.FileDialog(MsoFileDialogType.msoFileDialogSaveAs)
.FilterIndex = 2
If SavedFolderProperty Is Nothing Then
.InitialFileName = ""
Else
.InitialFileName = SavedFolderProperty.Value
End If
.Show
If SavedFolderProperty Is Nothing Then
ActiveWorkbook.CustomDocumentProperties.Add PropertyName, False, MsoDocProperties.msoPropertyTypeString, .SelectedItems.Item(1)
Else
SavedFolderProperty.Value = .SelectedItems.Item(1)
End If
.Execute
End With
End Sub
78 :
2000 :2012/02/05(日) 02:30:18.27
>>76 > Application.ScreenUpdating = False
> Set _ActiveSheet = ActiveSheet
> Set book = Workbooks.Open(PATH)
> book.Windows(1).Visible = False
> Call _ActiveSheet.Activate()
ActiveWorkbook.Close
> Application.ScreenUpdating = True
79 :
デフォルトの名無しさん :2012/02/05(日) 17:31:56.30
エクセルの関数について質問です。 B1セルに10が入っていたらA1セルに100と返し、 〃 11か12、13のいずれかの数字が入っていたらA1セルに200と返し、 〃 14が入っていたらB1セルに300と返し、 〃が空欄もしくは、10.11.12.13.14以外の数字が入っていたら100と返す 数式を組みたいのですがIFとORを組み合わせてもうまくいきません。 どなたかご教授頂けますでしょうか。
それをVBAでやりたいってことかな?
81 :
79 :2012/02/05(日) 17:43:45.11
>80 いえ、違います。 エクセル上で上記の数式を完成させたいだけです。
83 :
79 :2012/02/05(日) 17:50:34.95
あ、スレ違いでしたね。 ちょっとこっちで質問してみます。
同一コードなのに、コードのキャッシュでもされてるのか、結果不定で「?」なときがあると思いますが、そんな時の対処方法はありますか?
構文エラーを起こす
>>84 プログラムとは…
自分が思った通りに動く物ではない
自分が書いたとおりに動くのである
つまり結果が自分の希望に反して不定になるのは書き方が悪い。はっきり言えば間違ってる
よく見直せ
Excel2003です セルの内容でDBに更新を行う処理です Set crs = New ADODB.Recordset crs.CursorType = adOpenDynamic crs.LockType = adLockOptimistic crs.CursorLocation = adUseClient crs.ActiveConnection = cn ' sSQL = "" sSQL = sSQL & "SELECT *" sSQL = sSQL & " FROM WSEL" sSQL = sSQL & " ORDER BY WSEL.Chusyutu" crs.Source = sSQL crs.Open ' Do Until crs.EOF : DBの項目にセット処理 : crs.Update ←エラー発生 crs.MoveNext Loop crs.Close 1/2
2/2 DBはMySQLをODBCで使用しています Updateのところでエラーが発生します 実行時エラー '-2147217864 (80040e38)': 行が見つからなかっため、更新できません。列の値は最後に読み込まれた後で変更された可能性があります。 OpenしてからUpdateまでただ項目をセットしているだけでカーソルを移動させていません 項目のセット処理を削除するとエラーは出ません ただの ○○=×× という処理でカーソルが移動するとは思えないのですがどんな問題があるのでしょうか?
89 :
デフォルトの名無しさん :2012/02/06(月) 11:02:10.59
ADOのUpdateコマンドではなくSQLのupdate文を その例で言えば crs.Execute updateのsql文 という書き方でいつもExcelからmysqlに対してやってる そのやり方ではどうなの? まぁ続けるとスレ違いと騒ぎ出す野郎が多そうだから mougのDB板で聞いてみたら?
>>89 レスどうもです
>crs.Execute updateのsql文
この方法でやってみます
もし上手くいかなかったらDB板で聞くことにします
ありがとうです
91 :
84 :2012/02/07(火) 02:38:18.51
それ主キーがないとかで行を特定できてないだけじゃないのか
93 :
デフォルトの名無しさん :2012/02/07(火) 12:04:22.02
質問です。 「初項(セル B3 の値)と公差(セル C3 の値)を元にして, セル範囲 B5:G5 に等差数列の値を入力する マクロ「等差数列」を定義せよ」 という課題があるのですが、何から手を付ければいいのか分かりません。 よろしければご教授お願いします。
公式にぶちこめ
>>93 おっぱい見せて
Option Explicit
Private Sub マクロ等差数列()
Dim 初項 As Double
Let 初項 = Application.ThisWorkbook.ActiveSheet.Range("B3").Cells(1, 1).Value
Dim 公差 As Double
Let 公差 = Application.ThisWorkbook.ActiveSheet.Range("C3").Cells(1, 1).Value
Dim 数列1番目 As Double
Let 数列1番目 = 初項
Application.ThisWorkbook.ActiveSheet.Range("B5").Cells(1, 1).Value = 数列1番目
Dim 数列2番目 As Double
Let 数列2番目 = 数列1番目 + 公差
Application.ThisWorkbook.ActiveSheet.Range("C5").Cells(1, 1).Value = 数列2番目
Dim 数列3番目 As Double
Let 数列3番目 = 数列2番目 + 公差
Application.ThisWorkbook.ActiveSheet.Range("D5").Cells(1, 1).Value = 数列3番目
Dim 数列4番目 As Double
Let 数列4番目 = 数列3番目 + 公差
Application.ThisWorkbook.ActiveSheet.Range("E5").Cells(1, 1).Value = 数列4番目
Dim 数列5番目 As Double
Let 数列5番目 = 数列4番目 + 公差
Application.ThisWorkbook.ActiveSheet.Range("F5").Cells(1, 1).Value = 数列5番目
Dim 数列6番目 As Double
Let 数列6番目 = 数列5番目 + 公差
Application.ThisWorkbook.ActiveSheet.Range("G5").Cells(1, 1).Value = 数列6番目
End Sub
96 :
デフォルトの名無しさん :2012/02/07(火) 16:41:05.20
すみません、ワードのVBAについてはどこか質問スレってありませんでしょうか?
ない 場違い承知・まともな回答返ってこない前提でここかパワポVBAスレッドで聞いてアレンジするか ググって見つかる掲示板利用するしか
(*ノノ)イヤン
VBEで入力した全角文字が片っ端から自動で確定されて日本語入力できないんですが、仕様ですか?
102 :
デフォルトの名無しさん :2012/02/07(火) 21:11:34.07
>>97-98 ありがとう、ダメ元ですがエクセル場合はこーする、でも構わないので聞いてみます。
検索対象文字列の手前に改行を入れる、というVBAをつくろうとしています。
物:いちご物:みかん物:バナナ
となってる文章を
物:いちご
物:みかん
物:バナナ
と整形したいため、「物:」を検索し、その手前で改行を入れるVBAを作りたいです。
以下は自分で作ってみたものの、物:そのものを消して改行を3発入れてしまう駄作です。
Sub 検索()
With Selection.Find
.Text = "物:"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchWildcards = True
Do While .Found = True
If .Execute(FindText:="物:", Forward:=True, Format:=True) = True Then
Selection.TypeParagraph
Selection.TypeParagraph
Selection.TypeParagraph
Else
End If
Exit Do
Loop
End With
エクセルならこーする、ワードは知らん。でも構いませんのでご教示頂けると幸いです。
Selection.TypeParagraphが三つあるから改行がみっつ入るんじゃないのか? それひとつにしてそのあと"物:"追加すればいいんじゃね つか物:を置換してマクロ記録すればすぐわかるような
104 :
デフォルトの名無しさん :2012/02/07(火) 21:36:32.82
>>103 回答ありがとうございます。
例で出したソースは例えで、「物:」実際は数字や日付、名前のような動的なものが入ります。
なので静的に「物:」を後から足すという手法が使えません。
さらに、実際は改行は1発ではなく、間に3行欲しいので3発入れる必要があります。
例えが下手で申し訳ありません。
データの整理をVBAで行うことを考えている初心者です VBAを試しに書いて実行してから保存をしてみたところ、VBAによって行われたシート側の改変まで保存されてしまうようなのですが、 コードの部分だけを保存する方法はないでしょうか?
>>93 斜め上から
Sub 等差数列()
Range("B5") = Range("B3")
Range("C5") = Range("B3") + Range("C3")
Range("B5:C5").AutoFill Destination:=Range("B5:G5")
End Sub
>>105 VBAを行うファイルとデータファイルとを別々にスレばいい。
今は同じブック内でやってんでしょ?
>107 なるほど、それは盲点でした どうもありがとうございます
>>106 オートフィルメソッドなんか使わんでも数式は代入だけでコピーできる
Sub 等差数列()
Range("b5") = "=b3"
Range("c5:g5") = "=b5+$c$3"
End Sub
さらに短かく
Sub 等差数列2()
Range("b5:g5") = "=$b$3+$c$3*(column()-2)"
End Sub
>>102 >>97 または
mougでもいけばいいんじゃない
With Selection.Find
Replacement.ClearFormatting
.Text = "物"
.Replacement.Text = vbCr & "物"
.Execute Replace:=wdReplaceAll
End With
112 :
デフォルトの名無しさん :2012/02/08(水) 00:33:54.14
>>95 ,
>>106 ,
>>109 ,
>>110 の方々、ありがとうございます。とても助かります。
もうひとつ質問があるのですが、
・選択したセル範囲に対して、
a.空白セルの場合には背景色を黄色( RGB(255,255,0) )にする
b.空白でないセルの場合は背景色を色なし( xlColorIndexNone )にする
マクロ「チェック」を書きたいのですが、どのようにすればいいのでしょうか。
>>112 順番は逆だが気にするな
中学か高校の情報の授業なんだろうが先生が期待している回答ではないかと
Sub チェック()
With Selection
.Interior.Pattern = xlNone
.SpecialCells(xlCellTypeBlanks).Interior.Color = RGB(255, 255, 0)
End With
End Sub
>>112 Sub チェック()
Selection.Interior.Color = -4142
Selection.SpecialCells(4).Interior.Color = 65535
End Sub
115 :
デフォルトの名無しさん :2012/02/08(水) 04:11:01.60
>>111 スレチの質問にヒントありがとうございます。
しかし実際は
>>104 なので、"物"とすることができません。
具体的には2ちゃんのレス番、名前欄手前に3つ改行を入れたいのです。
Sub TEST()
With Selection.Find
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True
.Text = "[0-9]{1,3} :* ??:??:??.?? ID:????????"
.Replacement.Text = vbCr & vbCr & vbCr & "ここに何か".
.Execute Replace:=wdReplaceAll
End With
End Sub
検索結果をそのまま持ってくるような関数は無いでしょうか?
上記"ここに何か"部分にそれを入れれば上手く動きそうな気がします。
117 :
デフォルトの名無しさん :2012/02/08(水) 16:02:40.64
118 :
デフォルトの名無しさん :2012/02/08(水) 16:14:10.84
>>116 ありがとうございます。
>>111 さんに教えて頂いたmougにて有用な回答を得て解決出来ましたので
エクセルでも応用が利くかもしれないので、方法を貼っておきます。
.Replacement.Text = "^p^p^p\1"
とすることで、\1が置換後の文字列をそのまま使ってくれる事を教わりました。
これで解決することが出来ました。
以上です。ご回答頂き本当にありがとうございました。
お邪魔します。 OS:WinXP-SP2 Ver:Excel2002です 目的:シートAとBの特定範囲を一括して印刷プレビュー Sheets(Array("A", "B")).Select Range("A1:F59").Select Selection.PrintPreview Sheets("C").Select と入れてシートAとBのA1:F59の印刷プレビューを開きたいのですが この命令を実行するとシートAのA1:F59のプレビューしか開けません。 シートAとBを一括してプレビューさせるには何が足りないのでしょうか?
>>119 ActiveWindow.SelectedSheets.PrintPreview
>>119 Worksheet オブジェクト(普通のシート)には PrintPreview メソッドが存在する、よってシートを選択してプレビューできる
sheets オブジェクト(複数のシートを保持できる)には PrintPreview メソッドが存在する、よって複数のシートを選択してプレビューできる
range オブジェクトには PrintPreview メソッドが存在する、よって範囲を選択してプレビューできる
range オブジェクトは同一シート内なら複数の範囲を保持できる、よって同一シート内なら複数の範囲をプレビューできる
ただし、Excel には複数のシートをまたがる複数の Range を保持できるオブジェクト自体が存在しない
そのため、それに対応する PrintPreview メソッドも存在しない
たぶん
>>119 PageSetupを変更して良いなら
↓はどう?
Sheets("A").PageSetup.PrintArea = "A1:F59"
Sheets("B").PageSetup.PrintArea = "A1:F59"
Sheets(Array("A", "B")).PrintPreview
123 :
119 :2012/02/09(木) 11:32:11.25
>>120-122 ありがとうございました。
最終的にこうなりました。
Sub 印刷プレビュー()
'セルB55の数値からシート印刷か部分印刷かを判断
If Range("B55") <> "" Then
'B55に数値が存在するならばシート印刷
Sheets(Array("請求書", "見積書")).PrintPreview
Else
'B54に数値が存在しなければ部分印刷
Sheets("請求書").PageSetup.PrintArea = "A1:F59"
Sheets("見積書").PageSetup.PrintArea = "A1:F59"
Sheets(Array("請求書", "見積書")).PrintPreview
'印刷範囲を初期化
Sheets("請求書").PageSetup.PrintArea = "A1:F119"
Sheets("見積書").PageSetup.PrintArea = "A1:F119"
End If
End Sub
124 :
デフォルトの名無しさん :2012/02/09(木) 17:07:00.03
Dim 変数 as Range このようにオブジェクト変数を使いセルを代入すると その情報の中にそのセルの上位のシートやブックも一緒に保存されてるんですか?
>>124 たしかParentプロパティとかに入ってたと思う。
126 :
124 :2012/02/09(木) 19:08:28.56
Parentプロパティって何でしょうか? つまりそのRange型変数には入ってるってこと? その特定のセルの場所を保存するには ブック型変数(Dim〜as Workbook)、シート型変数(Dim〜as Worksheet)、セル型変数(Dim〜as Range)の3つが必要かと思ってたけど セル型ひとつで済むならかなり楽だけど、違うのかな?
127 :
125 :2012/02/09(木) 19:41:53.50
たとえば、こんな風にやってみると レンジ型変数からシート名とブック名も取得できる でもこんなことするより シートやブックもオブジェクト変数に代入しちゃう方が早くないか? Sub test() Dim Rng As Range Set Rng = ThisWorkbook.Sheets(1).Cells(1, 1) Debug.Print Rng.Parent.Name Debug.Print Rng.Parent.Parent.Name End Sub
128 :
125 :2012/02/09(木) 19:49:11.26
>>126 ごめん、後半読んでなかった
セル範囲の指定をRange型変数ひとつでできないか、という話だったのね。
Range型変数に代入されたセル範囲はRange型変数だけで特定できるから
そういう意味ではWorkBook型やWorkSheet型の変数は不要だよ。
てっきりブックやシートの指定もレンジ型一つで全部済ませたい
ってことかと思ってたよ
(
>>127 で書いたとおりそれもできることはできるけど、
記述が長くなるからあんまりメリットを感じない。)
129 :
デフォルトの名無しさん :2012/02/09(木) 22:17:32.76
バイナリファイルを読み込んでデータの中の文字列を探したいと思ってます。 バイト配列と文字列を比較するためにしなくてはいけないのですが、 型を合わせる方法がわかりません。 バイト配列から文字列、また 文字列からバイト配列に変換する方法を教えてください。 よろしくお願いします。
>>129 バイナリファイルを文字列に変換して処理する例(すべてのバイトをを &H0000〜&H00FF のUnicode文字として変換)
Const adTypeBinary = 1
Sub Foo()
bin = LoadBin("D:\misc\a.txt")
n = GetBinSize(bin)
Text = ""
For i = 0 To n - 1
Text = Text + ChrW(CodeAt(bin, i))
Next
index = InStr(Text, ChrW(&HFF))
MsgBox "最初に見つけた &HFF の位置: " + CStr(index)
index = InStr(Text, "hello")
MsgBox "最初に見つけた hello の位置: " + CStr(index)
End Sub
Function LoadBin(path)
Set stm = CreateObject("ADODB.Stream")
stm.Type = adTypeBinary
stm.Open
stm.LoadFromFile (path)
LoadBin = stm.Read()
stm.Close
End Function
Function GetBinSize(bin)
GetBinSize = LenB(bin)
End Function
Function CodeAt(bin, index)
CodeAt = AscB(MidB(bin, index + 1, 1))
End Function
>>129 >ANSI 形式のバイト型配列を文字列に変換する場合は、StrConv 関数を使用してください。
>Unicode 形式の配列を変換する場合は、代入式を使用してください。
以上 StrConv 関数のヘルプから
それ以外の文字コードだった場合はVBAだけで簡単にやる方法は多分ない
文字コードによるけど、バイナリファイルだって最初っからテキストモードでオープンすりゃええがな
133 :
126 :2012/02/10(金) 00:29:11.59
>>127 >>128 すばらしい解説ありがとうございます。
なるほど、Rangeでもシートやブックの情報を裏で持ってたんですね。
頭スッキリしました。
こういうスッキリ感がプログラムという複雑化しやすいことを扱うにはものすごく重要ですしね。
ということはRangeのオブジェクト変数はものすごく便利ですね。
間違ってた ○ChrW ×Chr
136 :
129 :2012/02/10(金) 01:23:07.49
>>130 >>134 >>135 具体的なサンプルありがとうございます。
SJISの場合はChrでUTFの場合はChrW
を使えばよいのでしょうか?
>>131 たしかSJISだったと思うのでStrConvを使えば
比較できるということですね。
ヘルプを確認してみます。
>>132 テキストモードでオープンすると正しく取得できない
値があるのでバイナリモードでオープンする方法を検討しています。
137 :
130 :2012/02/10(金) 01:44:11.61
>>136 >SJISの場合はChrでUTFの場合はChrW
違う
ChrWは単なる間違い
130の例で Shift_JIS の "あ" を検索したいなら、
Chr(&H82) + Chr(&HA0)
を検索する必要がある
面倒だけど、その代わりバイト並びさえ分かっていれば変換による情報落ちの心配なしにどんなコードでも処理できる、という例
138 :
デフォルトの名無しさん :2012/02/10(金) 11:13:23.28
VBAの基本的な文法はマスターしたのですが Error処理のしかた プロシージャのCallの呼び方 きれいなコードの書き方 イミディエト窓の使い方 バグフィックスのしかた など、普通の入門書にはほとんど書かれていないこともマスターしたいです そのためのいい本はありますか?
139 :
デフォルトの名無しさん :2012/02/10(金) 13:05:03.46
これは正しいですか↓ ------------------------------------------------- LoadするとInitializeイベントが発生して、 ShowでActivateイベントが発生する。 HideするとDeactivateイベントが発生して、 UnloadでTerminateイベントが発生する。 LoadしないでShowすると自動的にLoadされてShowするし、 HideしないでUnloadしても自動的にHideされてUnloadする。
140 :
デフォルトの名無しさん :2012/02/10(金) 13:07:14.91
>>139 神!
こういう整理された情報こそ実用的であり非常に有用。
みんなも
>>139 みたいな情報を共有しあうために貼り付けようじゃないか!
すくなくとも >ShowでActivateイベントが発生する。 >HideするとDeactivateイベントが発生して、 は正しくない Showした結果アクティブになればActivateイベントが発生するし Hideした結果アクティブじゃなくなればDeactivateイベントが発生する HideしたからってかならずDeactivateが発生するわけじゃない
142 :
デフォルトの名無しさん :2012/02/10(金) 14:42:14.40
Workbooks(x)のxを そのworkbookの名前から取り出す方法を教えてください。
取り出す必要なんてない。
>>142 WorkbookオブジェクトにはIndexプロパティがないので直接求めるのは無理
Workbooksコレクションをループで順番に見ていくしかない
けど
>>143 の言う通り、インデックス番号なんかわからなくてもプログラムは書ける
何がやりたいの?
145 :
142 :2012/02/10(金) 16:31:35.11
長いコードを短くしたいの。
146 :
デフォルトの名無しさん :2012/02/10(金) 16:33:32.37
コピペをVBAコードて書く場合、 なぜ対象オブジェクトはシートなんですか? 普通に考えてセルであるべきだ。 納得される説明・理由が聞きたいのですが。
>>145 短くしたいなら、
dim book as workbook
set book = workbooks("bookname.xls")
'以降bookを使ってコードを書く
の方が良くない?
>>145 それならオブジェクトを変数に入れた方がいい
短くなるだけでなく、処理も少し軽くなる
具体例は
>>147 コードを短くする方法はいくつかあって、Withを使うのも効果的
>>146 そんなことをここで聞かれてもな
マイクロソフトに聞け
ただ、おまえが普段どんなコードでコピペしてるかしらんが
少なくとも俺はコピーするときはRangeが対象なことがほとんどだし
Rangeに張りつけたければPasteSpecialも使えるぞ
150 :
デフォルトの名無しさん :2012/02/10(金) 19:38:29.05
VBAでVLOOKUPのようなことをしたい場合どうしてますか?
151 :
デフォルトの名無しさん :2012/02/10(金) 19:41:55.38
VBAで改行を文字列にするにはどうすればいいですか?
154 :
デフォルトの名無しさん :2012/02/10(金) 19:57:04.82
>>152 使い方をしらないからまだ使ったことない。
>>151 vbLINEかvbCRみたいなのなかったっけ?
VBAでワークシート関数を使いたいとき、Application.WorkSheetFunctionを使えばいいと書いてあるけど
どんな関数でもVBAでも使えるのですか?
さらにWorkSheetFunctionのあとは単にワークシート関数の単語を書けばいいだけ?
155 :
デフォルトの名無しさん :2012/02/10(金) 20:04:05.38
ワークシートとVBAで混乱するもの FindとInstr TextとFormat DateとToday その他多数 これみんなどうやって記憶してるの?
>>150 VBAでもVLOOKUP関数は普通に使える
>>154 オブジェクトブラウザで、WorksheetFunctionオブジェクトを見れば良い。
Application.WorksheetFunctionプロパティが返してくるのがこいつだから。
別にExcel固有の記述とかそういうものじゃない。
なんだか真面目に質問しているようにみえないんだが 気のせい?
>>155 使ってれば自然に覚える
間違えばエラーが出るから、それを見て直す
忘れたらヘルプを見る、Googleで検索する
せっかくコンピューターが色々と助けてくれるんだから
完璧に暗記することよりも、それを活用する方法を考えた方が応用範囲が広くなる
161 :
デフォルトの名無しさん :2012/02/10(金) 20:20:58.66
>>156 ありがとう。それはWorksheetFunctionを使って?
>>157 ありがとう。はじめオブジェクトブラウザを見てみた。たくさん入ってる関数は全部ワークシートの関数なんだね。
でも例えば単純なSum関数だとActivecell=Application.WorksheetFunction.Sum("A1:E5")と書けば
そのセルに”=Sum("A1:E5")”と入力されるってことで合ってます?
>>158 ありがとう。それだ。
>>159 今後仕事でVBA使うので復習中。
>>160 確かにそうですね。丸暗記はやめます。しかし例えば6か月くらいBAを全く使わないと基本機能すら忘れるね。
その忘れたときに思い出すための対策(例えば基本機能のメモと特殊的機能の一覧をノートにまとめるとか)は何かしといたほうがいいと感じてます。
>合ってます? 聞く前に試せば済むこった
163 :
デフォルトの名無しさん :2012/02/10(金) 20:30:50.24
あなたの回答力も試したいと思って。
やはりそうでしたか
165 :
デフォルトの名無しさん :2012/02/10(金) 20:34:45.43
>>162 試してもエラーが出るんですけど。エラいこっちゃ。
>>165 WorksheetFunction.Sum(Range("a1:e5"))
167 :
デフォルトの名無しさん :2012/02/10(金) 20:37:47.13
Activecell=Application.WorksheetFunction.Sum(Range("A1:E5")) ならうまくいきました。 しかもセルには数式じゃなく結果の数値のみが表示されてる。 もしVBAでセルに数式そのものを入力したい場合はどうすればいいの?
>>167 ActiveCell.FormulaLocal = "=Sum(A1:E5)"
169 :
デフォルトの名無しさん :2012/02/10(金) 20:38:34.59
170 :
デフォルトの名無しさん :2012/02/10(金) 20:39:38.10
>>168 ありが十匹。
ところで単にActiveCell= "=Sum(A1:E5)"、または、ActiveCell.Value= "=Sum(A1:E5)"、でも問題ないですか?
あなたのVBA力と回答力を試しているんですが
173 :
デフォルトの名無しさん :2012/02/10(金) 21:47:11.33
ワークシート関数のSumと
VBaのApplication.WorksheetFunction.のあとのSumでは
そのあとに続くコードが微妙に違うの?
Vlookupの場合は?
まさか関数ごとに全部覚えないといけないの?
>>171 できた。
>>173 > Vlookupの場合は?
試してみたらどうだ
175 :
デフォルトの名無しさん :2012/02/10(金) 22:03:27.91
VBAのコードを使って、ファイルやフォルダを自由自在に操ってみたいと思ってます。 [ファイル]と[フォルダ]のそれぞれ2つについて、 [移動][コピー][削除][名前の変更]の4つはどうコードで記述すればいいか(つまり2x4=8個について)、 どなたか教えていただけませんか? それが載ってあるサイトのURLでもいいです。 (*[フォルダ]の[削除]は、もしその中にファイルやフォルダがあったらそれも含めて全部削除するとします)
あなたの検索力を試したんですよ まあまあですね
179 :
デフォルトの名無しさん :2012/02/11(土) 17:49:13.59
>>178 くやしいのうwwwwwwwwwくやしいのうwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
180 :
デフォルトの名無しさん :2012/02/11(土) 19:00:02.04
"w" も使い過ぎると逆効果だなあ。
図形を含んだシートのコピーに関して教えてください。 セル範囲を指定してコピー、別シートに貼り付けをしているのですが、 コピー自体はできるのですが図形の大きさが変わったり、印刷した時の大きさが違ったり してしまいます。 全く同じにコピーするにはどうすればいいのでしょうか? シート自体のコピー挿入の方がいいのでしょうか? よろしくお願いします。
>>181 図形の生成はマクロでやってる?
そうならコピペせなんでも生成時のアドレス変えてもう一つ作ればいいんじゃ?
もし、マクロで生成したものでない図形を〜って話なら
図形のプロパティでセルの移動とかにあわせて大きさを変えないようにすればいけるかと。
ペースト先セルの列の幅やら行の高さやらがコピー元と違うと大きさ修正されちゃうし。
エスパー(マクロでやってないな)
こんにつわ、他人から貰ったExcelファイルがどういうコードで動いてるか見るにはどうすればいいのじゃ?
185 :
デフォルトの名無しさん :2012/02/12(日) 14:59:31.37
ありがとうちゃん
187 :
129 :2012/02/12(日) 23:35:21.88
>>137 全角文字、たとえば”あ”を&H82 + &HA0に変換する場合は
どうすればよいのでしょうか?
以下のように記述を比較してみましたが一致しませんでした
ご教授おねがいします。
msg = Chr(Asc("あ"))
msg2 = Chr("&H82") + Chr("&HA0")
>>187 MsgBox Hex(Asc("あ"))
189 :
デフォルトの名無しさん :2012/02/12(日) 23:52:57.06
他Bookに記述してるマクロを実行(あるいはSubやFunctionを呼び出し)することって できる? 頻繁にやるのは望ましくない?
>>189 たとえばBook1.xlsmのThisWorkbookにあるsub testを呼び出すなら
Application.Run "Book1.xlsm!ThisWorkbook.test"
でできる
頻繁どころか、アドインでもない限り他ブックのマクロ実行させるのはまったく好ましくない
191 :
デフォルトの名無しさん :2012/02/13(月) 00:23:18.72
マクロでコントロールを状況に応じて増やしたいんだけど そういうことってできる? たとえば5と入力したら別Window(Form)を開いて そこに5つのラベルとテキストボックスを挿入したいの。
なんでマルチポストすんの?
>>189 もちろんできる
複数のブックから使用するマクロを別ブックにしたり、
複数のブックのマクロを呼び出すメニュー用のブックを作ったり、
xlsxのファイルで使用するためのマクロを別ブックにしたり、
いろいろ
ExcelVBAの考え方としては、データを置くワークシートと、
プログラムを置く標準モジュールをどう配置するか
194 :
187 :2012/02/13(月) 01:11:58.07
>>188 ありがとうございます。
MsgBox Hex(Asc("あ")) は 82A0と表示されましたが
MsgBox Hex(Asc(Chr(&H82) + Chr(&HA0))) が 8145になってしまいましたが
MsgBox Hex(Asc(Chr(&H82A0)) では 80A0と表示されたのでこちらとは一致させることができました。
全角文字の場合には &H80A0 のような書きかたが正しいのでしょうか?
しかし
>>130 のコードで
”あいうえお”を検索したく
msg = Chr(&H82) + Chr(&HA0) + Chr(&H82) + Chr(&HA2) + Chr(&H82) + Chr(&HA4) + Chr(&H82) + Chr(&HA6) + Chr(&H82) + Chr(&HA8)
InStr(Text, msg)
とした場合には検索できるのですが
msg = Chr(&H82A0) + Chr(&H82A2) + Chr(&H82A4) + Chr(&H82A6) + Chr(&H82A8)
InStr(Text, msg)
のような書きかたをした場合には検索できませんでした。
”あいうえお” を検索する場合にはどういう書きかたをすればよいのでしょうか?
「あいうえお」と書かれたテキストファイルを
>>130 のコードに突っ込めば直ぐ解る。
196 :
187 :2012/02/13(月) 02:53:20.17
保存ダイアログが出たときに、特定のフォルダーが出るように下記の様に 書いたのですが、Win7 32bitでは希望通りの動きなのですが、64bitだと マイドキュメントが選択された状態で表示されてしまいます。 xlAPP.GetSaveAsFilename(InitialFileName:=SaveDir & FileName) 64bit版でも指定したフォルダーを選択状態にさせるにはどうすればいいですか? よろしくお願いします。
すみません。 コピーし忘れがありました。 一度保存すると、その時のフォルダーを保存しておいて、2回目からは SaveDirに記憶したフォルダーを選択するようにしています。 SaveaDir = CurDir そのために上記の様にして記憶するようにしています。 (このスレを読んで参考にしました。) 32bit版は変数の中身が変わるのですが、64bit版ではブックを読みだしたフォルダーから 変更されない感じです。 よろしくお願いします。
>>198 省略しすぎ。もう少しコードを見せられないの?
>>197 ディレクトリだけ?
ファイル名は正しく表示されるの?
201 :
デフォルトの名無しさん :2012/02/14(火) 15:30:51.13
VBAについて質問させてください! OS Windows7 2003使ってます。
下記のプログラムでYAHOO競馬からラップタイムって物だけをダウンロードしてきてるんですが、今は
1Rづつしか持って来れてないんで、これを全レース(最大で1日36R)一回の作業でダウンロードしてくる
プログラムに直せませんか?
宜しくお願いいたします!
Sub test()
Dim ie As Object
Dim elements As Object
Dim i As Integer
Cells.Clear
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "
http://keiba.yahoo.co.jp/race/result/1206010512/ "
Do While ie.Busy Or ie.ReadyState <> 4: DoEvents: Loop
Set elements = ie.Document.getElementsByTagName("div")
For i = 0 To elements.Length - 1
If elements(i).innertext Like "ラップタイム*" Then
Set elements = elements(i).getElementsByTagName("td")
Exit For
End If
Next
For i = 0 To elements.Length - 1
Range("B" & i + 1).Value = elements(i).innertext
Next
ie.Quit
Set ie = Nothing
End Sub
>>197 32ビット版なので確認できないが、
64ビット版だとSaveDirに関係なくいつもマイドキュメントが開くってことか
Sub test()
Const FileName = "test.xlsx"
Const SaveDir = "C:\"
Dim fname
MsgBox CurDir
fname = Application.GetSaveAsFilename(InitialFileName:=SaveDir & FileName)
MsgBox CurDir
End Sub
204 :
197 :2012/02/14(火) 22:05:33.85
皆さん、レスありがとうございます。 どうも、CurDirの返り値が32bit、64bitで違うみたいです。 32bitの時は保存したり、読み出したりした時のフォルダーが返ってくるのですが、 64bitの時は読み出したフォルダーが返ってくるみたいです。 '保存 Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name) '保存先フォルダー記憶 File_Name = Dir(Save_NAME) Save_dir = Replace(Save_NAME, File_Name, "") こんな感じでできるようになりました。
× Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name) ○ Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_dir) です
>>201 いらん機能までゴテゴテ付けたら改行が多すぎるって怒られちったお
Sub test()
Dim ie As Object, elements As Object
Dim i%, url$, n%, y%, m%, d%, r%
Dim name As Variant
Dim flg As Boolean
Dim j As Variant
name = Array("札幌", "函館", "福島", "新潟", "東京", "中山", "中京", "京都", "阪神", "小倉")
url = "
http://keiba.yahoo.co.jp/race/result/ "
j = Application.InputBox("開催地、年月日をすべて2桁の数値で入力" & vbCrLf & _
"札幌=01,函館=02,福島=03,新潟=04,東京=05,中山=06,中京=07,京都=08,阪神=09,小倉=10", "下記の順にデータを入力してください", , , , , , Type:=2)
If j = False Then Exit Sub
If Len(j) <> 8 Then Exit Sub
n = Left(j, 2): y = Mid(j, 3, 2): m = Mid(j, 5, 2): d = Mid(j, 7, 2)
With ThisWorkbook.Sheets(1)
.Cells.Clear
.Cells(1, 1) = y & "年" & m & "月 " & name(n - 1) & d & "日目"
For i = 1 To 11
.Cells(1, 1).Offset(i).Value = "^" & i * 200
Next i
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
For r = 1 To 37 flg = False ie.navigate (url & y & Format(n, "00") & Format(m, "00") & Format(d, "00") & Format(r, "00") & "/") Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop Set elements = ie.document.getElementsByTagName("div") For i = 0 To elements.Length - 1 If elements(i).innerText Like "ラップタイム*" Then flg = True Set elements = elements(i).getElementsByTagName("td") Exit For End If Next i If Not flg Then .UsedRange.EntireColumn.AutoFit Exit For End If For i = 0 To elements.Length - 1 .Cells(1, 1).Offset(, r).Value = r & "R" .Cells(2, 1).Offset(i, r).Value = elements(i).innerText Next i Next r Set elements = Nothing ie.Quit Set ie = Nothing End With End Sub
208 :
206 :2012/02/15(水) 00:15:06.33
個人的には ie.visible=true はFalseのほうが画面の切り替えがなくて好きだけど、 非表示にしとくとIEのアクセスでエラーが出てるときの エラーメッセージも表示されなくなるんだっけ?
209 :
206 :2012/02/15(水) 00:19:14.69
連投スマソ 入力する年月日のうち、日は日付じゃなくて開催何日目かなので そこんとこよろしく (たとえば、06120105は中山競馬場、2012年1月の開催5日目の意味)
それだと一つの競馬場で36レースやらないと全レースのデータは拾えないんじゃね? 多分、一つの競馬場では1日に12レースしかやらないと思うよ。 同じ日に最大で3カ所開催するから3*12で36レースってことじゃないかな?
211 :
206 :2012/02/15(水) 00:54:42.24
>>210 さん
えーと、
ご指摘ありがとうございます・・・orz
私は競馬やったことないんで知りませんでした。
そうすると、開催地の変更もループ処理に掛けないといけないですね。
でも、ちょっと調べたところ、
http://keiba.yahoo.co.jp/schedule/list/2012/?month=1 ここを見たら同じ日でも場所によって開催何日目かがまちまちなので、
単純に場所だけを変えても上手くいかなそうです。
(データを取り込むURLが
[年][場所][月][開催何日目][何レース]の組み合わせですので、
日付から開催日を知る方法がないとすべてのデータが取り込めません。)
同じ日に開催する場所や日数に何か規則性があるなら良いのですが、
私は競馬のことをよく知らないので見当も付きません。
力不足で申し訳ないです。
212 :
デフォルトの名無しさん :2012/02/15(水) 02:52:59.70
皆さんホントこんな初心者の為に考えてくださってありがとうございます! 何か別な方法考えてみます!
214 :
デフォルトの名無しさん :2012/02/15(水) 04:15:47.11
ありがとうございます! なんとか頑張ってみます!!
215 :
デフォルトの名無しさん :2012/02/15(水) 11:53:49.85
ユーザーフォームに複数の項目(名前、年齢、身長、体重など)を設定して、 空欄があった場合に「名前を入力して下さい」とかメッセージボックスで表示するようにしたいんです。 それでもし、複数の項目が空欄なら「名前を入力して下さい」「年齢を入力して下さい」と 1つのメッセージボックス内に表示されるようにしたいのです。 順列組み合わせをIFしていったらすごいことになるので短くプログラムする方法はないかなと思いまして。 IFのネストとかstrを使ってとか断片的には思い浮かぶんですけど……
216 :
デフォルトの名無しさん :2012/02/15(水) 12:31:51.42
質問させてください。 シートにフォームのボタンを貼ったのですが、このボタンをVBAから押した ことにする方法はあるでしょうか。
217 :
デフォルトの名無しさん :2012/02/15(水) 14:01:56.17
>>215 何項目あるかしらんが、一つずつ検査して文字列にまとめるのが結局いちばんはやくて保守しやすいんじゃね?
Private Sub CommandButton1_Click()
Dim str As String
If TextBox1 = Empty Then
str = "TextBox1が空白です" & vbCrLf
End If
If TextBox2 = Empty Then
str = str & "TextBox2が空白です" & vbCrLf
End If
If TextBox3 = Empty Then
str = str & "TextBox3が空白です" & vbCrLf
End If
If TextBox4 = Empty Then
str = str & "TextBox4が空白です" & vbCrLf
End If
If TextBox5 = Empty Then
str = str & "TextBox5が空白です" & vbCrLf
End If
MsgBox str
End Sub
>>217 なりました!
ありがとうございますm(_ _)m
>>216 そのボタンを押した時に実行するプロシジャを実行すれば良いだけなのでは?
220 :
デフォルトの名無しさん :2012/02/16(木) 01:25:02.28
横から失礼。 > そのボタンを押した時に実行するプロシジャを実行 でなく、そのボタンを押す事は出来ないの?
命令文うんたらかんたら CommandButton1_Click 命令文うんたらかんたら
>>220 メッセージを送ればボタンは押せるけど
プロシージャ実行と結果は同じだから手間がかかるだけで意味がない
他の常駐アプリでボタンクリックのメッセージ監視目的とかだとスレ違い気味だし
そんだけ知識ある人がこんな質問するとは思えない
224 :
216 :2012/02/16(木) 10:15:08.10
みなさんありがとうございます。
>>222 どうやってシートのボタンオブジェクトを取得して、どんなメッセージを送ったらよいのでしょうか。
VC++とかはよく使いますが、ExcelVBAは初めてです。
ユーザーフォーム上のボタンは押したことにできるので、シート上のフォームのボタンも押す方法が
ないか探しております。
よろしくお願いいたします。
225 :
デフォルトの名無しさん :2012/02/16(木) 12:51:14.76
>>224 Sub onButton()
Worksheets("Sheet1").CommandButton1.Value = True
End Sub
Sub onButton()
Worksheets("Sheet1").OLEObjects("CommandButton1").Object.Value = True
End Sub
どちらでもすきなように
226 :
デフォルトの名無しさん :2012/02/16(木) 18:29:17.43
VBA初心者です Excel2007 A1 ALL1 A600 ALL600 この範囲内に画像を取り込んでモザイク画を作っています。 画像サイズによっては空白部分も多いのですが空白部分を省いて印刷するにはどうすればいいでしょうか? プリンターの関係上A1サイズなので後で組み合わせるのにヘッダーでページ番号もつけています
>>226 印刷した時にどこで切れるかはHPageBreaks(n).Location
またはVPageBreaks(n).Locationで調べることができる
あとは、ページごとにセルの色が全部標準か白なら印刷しないっていう
ちょっと面倒なプログラムを書くしかない
>>225 それってフォームのボタンでないんじゃない
教えてください VBAにアドインってのが有るそうなんですが、マクロをアドインとかいうものにするのはどういうメリットがあるんですか? 皆さん、どういう風につかっておられます?
230 :
216 :2012/02/16(木) 23:29:29.26
>>225 ありがとうございます!
コントロールツールボックスのボタンの場合は、どのようにしたらよいでしょうか。
>>229 アドインって .xla のこと?
.dll のように、色んなワークブックからCallされる自分用関数をまとめておくとか。
でも、キャッシュみたいのがかかっていて結果不定になるので、デバッグ面倒だよ。
>>232 229です。
>結果不定になるので、デバッグ面倒だよ。
なんか扱いが大変そうだな・・・
教えていただきありがとうです
>>232 > でも、キャッシュみたいのがかかっていて結果不定になるので、デバッグ面倒だよ。
んなこと全然無い。
アドインのメリット。
例えば、社内用の勤怠計算を行うマクロを書いたとする。
そのマクロが入った、データ入力用シート入りのBookを社員に配布する。
配布した後で、バグが見つかって修正したり、機能を追加したりしたくなったらどうする?
「マクロが入った、データ入力用シート入りのBook」だと、もうデータ入力済みの場合、
全員のBookをまるごと取り替えることはできないから、マクロ部分だけ入れ替える必要がある。
これを、「勤怠計算を行うマクロ」が入ったxlaと、データ入力用のBookに分けておくと、
xlaを更新したら全員に配布して、ファイルを入れ替えてねで済む。
もちろん、他言語のライブラリ同様、ライブラリとしてのメリットは全て持ってる。
関数について質問です 1日 名前A 条件1 1日 名前B 条件2 8日 名前C 条件1 8日 名前D 条件2 8日 名前E 条件1 8日 名前F 条件2 とシート1にデータがあり、別シートのリストに8日で条件2に合致する名前だけを 上から順に(空白行無しで)抜き出す場合、どのような関数を使えば出来るでしょうか? IFでやろうとするとどうしても不一致の行が空白になってしまいます。 お力添えをよろしくお願いします。
なにそのタライ回し。いつもより多く回ってるんじゃないの。
238 :
デフォルトの名無しさん :2012/02/17(金) 20:43:07.85
このスレはいつもこうだよ
239 :
デフォルトの名無しさん :2012/02/18(土) 01:22:32.32
チェックシートを作成したく、 表の右に設置したボタンを押すと隣接するセルの背景色が変化するものを作っています。 ボタンの数が100程度あるのですが、ボタン1つ1つに以下の関数を格納するのには非常に手間がかかります。 Private Sub CommandButton1_Click() With Range("A2").Interior .ColorIndex = 36 .Pattern = xlSolid End With End Sub Private Sub CommandButton2_Click() With Range("A3").Interior .ColorIndex = 36(省略) 一括で設定する方法はありませんか?
修正です 誤 With Range("A2").Interior 正 With Range("A2:C2").Interior
241 :
デフォルトの名無しさん :2012/02/18(土) 01:31:10.99
× チェックシートを作成したく、 ○ チェックシートを作成したいのですが、 日本語は大切にね
>>239-240 スレ違いな答えになるけど、条件付き書式を使ったほうがいいかと。
書式を「"○"」、条件付き書式として0より大きいなら背景色を設定とかやれば、
1を入力してやればチェックって感じに出来ると思う。
>>239 コマンドボタンはどのセルに配置してあるの?
D列のセル?
244 :
239 :2012/02/18(土) 02:02:35.32
>>241 失礼しました。
以後気をつけます。
>>242 ググってみましたが自分の希望に沿えるものではなさそうです。
あくまでワンクリックで背景色の変化ができるものを作成したいと思っております。
参考画像を用意いたしました。
ttp://uploader.sakura.ne.jp/src/up84658.jpg 作成したいと思っているチェックシートについて
・隣接する行の背景色を変えることによるチェックをする。
※詳細
チェックボタンを押すと背景色を変化させる
(With Range("A2").Interior .ColorIndex = 36 以下略)
さらに隣の取り消しボタンを押すと背景色なし設定にする
・値の入力ではなく、ボタンをワンクリックすることで変化させる。(これが重要事項だと思われます)
例の画像は8行ですが実際に作成するものは100行以上になります。
以上になります。よろしくお願いいたします。
245 :
239 :2012/02/18(土) 02:11:02.38
>>243 画像では見やすくするために中央のほうへ寄せましたが、
いわゆるD列にボタンが配置されているものと思われて結構です。
ボタン自信をセルに配置することが自分の知識ではわからないので、
配置はコピーで行ってます。(セルを選択してCtrl+vを押すだけなので我慢)
つまるところボタンのオブジェクト名の番号が1,2,3...と上昇します。
ボタンが数個なら
>>239 のコードを複数コピーして値を変化させることができますが、
100以上となると無理ではありませんが非常に面倒です。
そこで一括で設定する方法は無いものか模索していたところです。
多分一番重要なことを忘れていましたが私はExcelVBAについては初心者です。
度々すみません。よろしくお願いいたします。
>>244 答えてあげたいが、時間がない
例えば
topleftcellを引数で渡すプロシージャを作って
それぞれのボタンクリックのプロシージャから
呼び出せば?
テキスト(プログラム)を出力するプログラムを書いて
それをインポートする手もある
クラスモジュールを使うか
>>244 よくわからんがこんなのでいいのか?
' ボタンを D5 から 10個作成
Sub CreateButtons()
Set baseaddress = ActiveSheet.Range("D5")
For i = 1 To 10
CreateButton baseaddress.Cells(i, 1)
Next
End Sub
Sub CreateButton(cell)
x = cell.Left
y = cell.Top
w = cell.Cells(2, 2).Left - x
h = cell.Cells(2, 2).Top - y
Set btn = ActiveSheet.Buttons.Add(x, y, w, h)
btn.Text = "chk"
btn.Name = "chkbtn_" & cell.Row
btn.OnAction = "CheckButton_Click"
End Sub
Sub CheckButton_Click()
Row = Mid(Application.Caller, 8)
With Range("A1").Cells(Row, 1).Interior
.ColorIndex = 36
.Pattern = xlSolid
End With
End Sub
248 :
247 :2012/02/18(土) 03:13:52.81
一応簡単に説明しておくと ボタンクリックのイベント内からは Application.Caller でクリックしたボタン名が取得できる ボタン名をあらかじめ chkbtn_<行番号> として作成しておき、イベント内で行番号をボタン名から切り出して現在の自分の行番号を取得している イベント内でボタン名が取得できるので、クリックのイベントプロシジャを個別に作成する必要はなく、すべて共通でよい この例はチェックボタンだけだけど、当然同じやり方でクリアボタンも作成できる
249 :
239 :2012/02/18(土) 03:25:21.74
>>247 試してみましたがうまく動作しませんでした。
多分こちらのボタンの置き方が悪いのかもしれません。
(前述の通りExcelVBA及びコンソールの配置等は初心者です。すみません。)
また関数の大まかな意味も知っておきたいのですが、
もしお時間が許すのであればご教示のほどをお願いします。
250 :
239 :2012/02/18(土) 03:26:41.00
>>247 書き込み中のすれ違いになってしまいました。
ありがとうございます!!
もう一度試してみます。
251 :
239 :2012/02/18(土) 03:45:13.45
>>247 すみません何度か試行錯誤を繰り返してみましたがどうにもうまく動作しません。
お手数ではありますが扱い方のご教示、
もしくはソースファイルのアップロードをお願いいたしたいのですが。
252 :
54 :2012/02/18(土) 03:52:25.06
253 :
デフォルトの名無しさん :2012/02/18(土) 04:37:15.26
>>251 俺は247さんじゃないけど、
247さんのコードを標準モジュールにコピペするだけで動いたよ
(全部コピペして、Sub CreateButtons() を実行)
ちなみに環境はWin7 64bit、Excel2000、です
むしろ貴方がどのようにやったのかを具体的に提示したほうが早いと思う。
たとえば上記コードを標準モジュールじゃなくボタンに貼り付けたりしてないよね?
254 :
239 :2012/02/18(土) 05:25:47.81
>>253 今までシート自体にコードを貼り付けていました。
標準モジュールを新たに挿入して貼り付けたら無事動作いたしました!
大変勉強にもなりました。
ご回答していただいた皆様本当にありがとうございました。
ソースコードを記述いただいた
>>247 さんには感謝の限りです!
本日は朝も近いのでお休みいたします。
最後に改めてありがとうございました。
俺もこれ利用したいけど 単一のセルしか塗りつぶしできない どうすれば行を(この場合だとA2からC2までの)指定出来ますかね
256 :
253 :2012/02/18(土) 09:55:21.93
>>255 With Range("A1").Cells(Row, 1).Interior
を
With Range("A1").Cells(Row, 1).Resize(, 3).Interior
にするとAからCの3列が書き換わる
すみません
>>247 のコードでボタンを二つ作りたいのですが、
標準モジュールを新たに挿入すると内容が二つとも同じになってしまいます。
対処法を調べても理解できないのでどなたか教えてください。
>>257 Sub CreateButtons()
Set baseaddress = ActiveSheet.Range("D5")
For i = 1 To 10
CreateButton baseaddress.Cells(i, 1), True
CreateButton baseaddress.Cells(i, 2), False
Next
End Sub
Sub CreateButton(cell, check)
x = cell.Left + 4
y = cell.Top + 2
w = cell.Cells(2, 2).Left - x - 4
h = cell.Cells(2, 2).Top - y - 2
Set btn = ActiveSheet.Buttons.Add(x, y, w, h)
btn.Text = ""
btn.Name = "chkbtn_" & cell.Row
If check Then
btn.OnAction = "CheckButton_Click"
Else
btn.OnAction = "ClearButton_Click"
End If
End Sub
259 :
258 :2012/02/18(土) 13:38:28.19
続き Sub CheckButton_Click() Row = Mid(Application.Caller, 8) With Range("A1").Cells(Row, 1).Interior .ColorIndex = 36 .Pattern = xlSolid End With End Sub Sub ClearButton_Click() Row = Mid(Application.Caller, 8) With Range("A1").Cells(Row, 1).Interior .Pattern = xlNone End With End Sub
260 :
253 :2012/02/18(土) 13:46:16.46
>>257 具体的にはどう調べたの?
これって調べてどうこう言うような次元の話じゃなくて
単純にVBAのプログラムが読めるかどうかの話だよ。
一応説明すると、247氏のコードは3つのプロシージャから構成されてるけど、
Sub CreateButtons() は単に最初のセル位置(D5)を決めて、
そこから下方向に10回同じことを繰り返す、って言う処理だけを指示している。
次の Sub CreateButton(cell) で指示されたセル位置にボタンを作る作業をしている。
作るボタンの名前は"chkbtn_"に何番目のボタンかを示す数字1~10が付いたもので、
そのボタンの動作は"CheckButton_Click"で指定されたものになる
で、最後の Sub CheckButton_Click() は上で書いたとおり、
そのボタンがクリックされたときの動作を指定している。
つまり、ボタンの名前"chkbtn_"+番号 の番号部分からセルの行位置を割り出して
その行の色を塗り替えてるわけ。
だから取り消しボタンを作りたいなら2番目のプロシージャに取り消しボタンを作る処理を追加して、
3番目と同様に取り消しボタンの動作を指定する4番目のプロシージャを書き足す作業をすれば良いんだよ。
これだけ説明されて分からないなら、多分今の貴方には作れないと思うよ
261 :
253 :2012/02/18(土) 13:51:56.14
って俺が長々説教かいてる間に
>>258 さんがコード作ってくれちゃったね。
>>257 良かったな。
でもこういうのただ丸投げするより
動作原理を理解して自分でいじれるようになった方が良いから
自分でもがんばってね
>>258 一部修正必要だけど、257には無理かもね
Application.Caller ってボタン名というかオブジェクト名しか取れないのが使いにくいけど、 あらかじめ Dictionary 使ってオブジェクト名をキーにして情報格納しておけば、 ボタンクリックでオブジェクト名から数字だけを切り出すまでもなく、 座標やチェック/クリアの属性なんかも関連付けできるようになるのでいろいろ応用は効く
264 :
253 :2012/02/18(土) 14:34:40.85
今更だけど
>>260 に間違いがあったので修正
>作るボタンの名前は"chkbtn_"に何番目のボタンかを示す数字1~10が付いたもので、
は1~10じゃなくてそのボタンの行が入ってる。最初のボタンがD5だから5~14になるね
>>262 あ、ほんとだ塗りつぶしボタンと取り消しボタンに同じ名前指定してるね
とりあえず
btn.Name = "chkbtn_" & cell.Row
の部分も
If check Then
の中に入れて条件分岐で名前変えるのが早いかな
取り消しは"clrbtn"とかだね
>>264 いやオブジェクト名は、どのみち影響しないけど
修正したいと言うと予想されるのはキャプションのほうね
こんにつわ alt+F11押したらVBAProjectパスワード、要求されたんだけど、へるぷみー
事故解決下
268 :
デフォルトの名無しさん :2012/02/18(土) 23:05:13.47
Excelで「平成1年」を「平成元年」と表示させるための一番簡単な方法はなんですか? ちなみに昭和や平成の他の年もいっぱいまざっています。
Replace(s, "平成1年", "平成元年")
> 昭和や平成の他の年 の考慮が漏れてるではないか。
[^0-9]1年
272 :
268 :2012/02/19(日) 00:58:11.82
風邪で寝込んでて暇だからやってみた。バグがあるかもしれんから取扱注意。 年だけの場合 Public Function 元年変換From年(paramValue As String) As String Dim i As Integer, yearValue As String 元年変換From年 = paramValue For i = 1 To Len(paramValue) If Mid(paramValue, i, 1) Like "#" Then yearValue = Mid(paramValue, i): Exit For Next i If Val(yearValue) = 1 Then 元年変換From年 = Replace(元年変換From年, Val(yearValue), "元") End Function 年月日の場合 Public Function 元年変換From年月日(paramValue As String) As String Dim paramDateValue As Date paramDateValue = DateValue(paramValue) 元年変換From年月日 = Format(paramDateValue, "ggg") & IIf(Format(paramDateValue, "e") = 1, "元", Format(paramDateValue, "e")) & Format(paramDateValue, "年m月d日") End Function ※ 年月日の方であり得ない日付(平成1年1月1日など)を入れると本来の日付(昭和64年1月1日など)に変換される。
Excel上での表示の話なんだから… 「Excel 1年 元年」でググってみ。いろいろやり方があって面白いよ。 第1位に出てる、セルの表示形式を [<32516]ggge"年"m"月"d"日";[>32873]ggge"年"m"月"d"日";"平成元年"m"月"d"日" にしろってヤツ、いかにもExcel臭いがCool…なのかなw 自分的には、文字列にしてから置換する方が好きだ。
元号使わなきゃ無問題
今特別養護老人ホームに勤めていて、頭を使って手書きで勤務表を作っています ExcelのVBAで自動で勤務を割り振ってくれる勤務表は作れますか?
特定のファイルの追加、削除の監視をDO〜LOOPで行おうと思うのですが、 監視を任意のタイミングで終了させるにはどうしたらいいでしょうか?
>>278 作れる。簡単ではないけど。
コツコツやって具体的にわかんない部分が出たらまた来ればいい。
>>279 終了フラグを用意して、DO〜LOOP前でクリアDO〜LOOP内でチェック。
終了ボタンなどで終了フラグを書き換える。
282 :
279 :2012/02/19(日) 11:30:53.47
早速のレス、ありがとうございます。 ループ中に終了ボタンって押せるんでしょうか? UserFormにスタートボタン、終了ボタンを置いてテストしてるんですが、 ループ中は終了ボタンが押せません。 フォーカスを終了ボタンに移すこととかってできるんでしょうか? ループ中でもボタンを押すにはどうすればいいんでしょうか? よろしくお願いします。
>>282 DO〜LOOP内、各行前後にDoEvents入れて見。
足りなそうなら増やして見。
284 :
279 :2012/02/19(日) 11:38:53.91
>>283 できました。
ありがとうございました。
285 :
デフォルトの名無しさん :2012/02/19(日) 16:29:31.34
Do〜LOOP使うならWhile使えよ
286 :
デフォルトの名無しさん :2012/02/19(日) 18:01:02.40
そーいえばどっかで平成が何年までか求めるコードがあったな
>>286 > 平成が何年までか求める
宮内庁から怒られるんじゃないのか…
今年で,,,, ゲフンゲン
289 :
278 :2012/02/19(日) 19:36:06.20
>>280 ありがとうございます、コツコツやってすぐ分からなくなってまた来ます
その時は教えて頂けたらありがたいです
290 :
デフォルトの名無しさん :2012/02/19(日) 19:52:21.66
こちらでも質問させてください。 会社では2010、家では2003を使用して「終了」ボタンを押すと「終了」する VBAを作成しています。Webページとして保存した場合、ボタンを押しても 起動しません。Webページとしてボタンを押せるようにするには Sub () Dim rc As Long rc = MsgBox("○○を終了しますか?", vbYesNo + vbQuestion) If rc = vbYes Then Application.Quit Windows("ファイル名.xls").Close True Else MsgBox "いいえが選択されました。", vbExclamation End If End Sub としてどこを変更すれば良いでしょうか?
堂々とマルチ宣言 時代変わった? w
こんにつわ、質問です。 With ActiveSheet.QueryTables.Add(Connection:=で、Web上のテーブルを取り込んだのですが、このテーブルの指定セルだけを取り込むにはどうすれば良いですか?
>>289 勤務表作成なら興味があるので手伝ってもいいですよ
ただプロバイダが2ちゃんで書き込み禁止になることがよくあるので
書けるときだけですが
とりあえずググって見ましたか?
自分の業務で自分だけが使うのなら作りやすいのですが
自分の異動など他の人に業務を任せることも考えると
画面デザインが重要になりますね
すいません、多分超簡単なんでしょうけど質問させて下さい 最近VBAを勉強し始めましたのですが、あるセルを基点(仮にA5)としてそこから左端にアクティブセルを移動した後、 仮にAA,AAAと言う文字が来たら、そのセルから右に5列の場所にaa、 BB,BBBと言う文字の場合はbbと言う文字を、それ以外の場合はメッセージボックスにccとでるようにして、 その後一行下に移動して、上記の作業を仮に10回繰り返していき、最後はA1にアクティブセルを移動させると言う問題があったのです。 それを変数を使って解くというようなことがあったのですが、 sub () Dim z As String , i As Integer Range("A5").Select For i = 1 To 10 Step 1 z = ActiveCell.Value Select Case z Case = "AA","AAA" ActiveCell.Value="aa" ActiveCell.Offset(0,5) Case ="BB","BBB" ActiveCell.Value="aa" ActiveCell.Offset(0,5) Case else MsgBox"cc" End Select ActiveCell.Offset(1,0) Next i Range("A1").Select End sub としたのですが、うまくいきませんでした。どこが間違ってるのか自分ではわからなかったので教えて下さい こんな初歩的な質問でスイマセン・・・
>>294 OffsetはRangeオブジェクトを返すプロパティ…
とか言う以前に論理的に変だよ
プログラム知らない人でもこんなコードは書かない
ActiveCell.Offset(0,5).Value="aa"
とか
ActiveCell.Offset(0,5).Value="bb"
とか
ActiveCell.Offset(1,0).Select
として見れば?
296 :
278 :2012/02/20(月) 00:25:03.13
>>293 ホントですか!?
ありがとうございます
色々ググって見て、とりあえずデザインから作り始めてます
自分が使うだけなので特に問題ないです
複雑だから結構難しそうですね・・・
>>296 >自分が使うだけなので特に問題ないです
仕事に使うならこの考え方はないです
エンドユーザコンピューティングの典型的な悪いところ
業務にVBAを使う以上、他の人が使えることが最低条件です
298 :
278 :2012/02/20(月) 00:42:20.32
>>297 そうですよね・・・
異動になったりしたとき他の人が使えないと困りますしね
気をつけて作っていきたいと思います
>>298 エンドユーザーコンピューティングでやりがちなミス
・ 変数等の名づけが行き当たりばったり
・ 変数等の用途が途中で変わっても名前を放置
→ 名づけのルールを決めて、それに従う。もしずれたら補正する。
変数やSub、Functionの名前がバラバラだとソースを見る時、一々定義を確認しなきゃならない。
自前のルールで決めて、それに従ってればわりと見やすくなる。
・ 設計の時に考慮した事・あえて無視した事を書き残さない
→ メモ書きの内容も含めてあとで読んでもわかるように資料化する
資料がないと、バグが発生した時に考え方のバグなのかプログラム化する段階でのバグなのか切り分けが大変。
・ 資料を作っても読み返さない
→ 資料化したものは月に1回ぐらいは読み返してみよう。
慣れていないと、必要な事が抜け落ちた資料になったりする。
・ 必須機能や各種条件などを決める前にプログラミングを始める
→ 少なくとも基本方針、前提条件、などはプログラミング前に資料にまとめよう。
固定で必須な条件と、人数の増減などで変更が発生する条件ぐらいは切り分けてからプログラミングした方が楽。
・ 同じことの繰り返しを何か所にもコピペ
→ 同じことはFunctionやSubにまとめてそれを呼び出す。
ミスがあった場合それもコピペで増えるので、ソース内でのコピペは可能な限り避ける。
方針メモ出来たらうpしてみ。
300 :
278 :2012/02/20(月) 07:57:10.04
>>299 そんなに色々あるのですか・・・
これ教えてもらってないと大変なことになってました;
とりあえず基本方針?と前提条件をまとめてみます
301 :
294 :2012/02/20(月) 08:01:46.57
>>295 ありがとうございます
やっぱり独学じゃダメなのかな・・・
もっと勉強します
302 :
278 :2012/02/20(月) 09:49:16.54
とりあえず思いついたメモを羅列 ・人によってできる勤務が異なる(夜勤1は出切るが夜勤2は出来ない等) ・夜勤はなるべく連続しないようにする(夜勤、明け、休み、夜勤・・・) ・早番がすぐに来ないようにする(早番、日勤、休み、早番) ・前月の夜勤の明け、明け休みも考慮する。早番も ・希望休、希望勤務を入力できるようにする ・同じ番号の勤務はなるべく続かないように ・休みも偏らないようにする ・勤務は各回数入力できるように(休みも9回の時などあるので入力) もっとある気がしますが、この時点で凄く難しそう…
>>302 ナーススケジューリング問題(ググれ)に匹敵するような要件の場合、勤務表を作成するのはすごく困難。
>>302 最初から自動割振りするシステムは難しいから、
割振り入力してボタンを押すと問題がある割振りに色を付けるシステム
(夜勤連続だと赤、休み集中だと青など)
を作ってみたら?
>>302 落ち着け。
勤務表作成を新人に引き継ぐ感覚でまとめてみ。
それもおまいさんが急用でどうしても質問受けれない場合にどう引き継ぐか。
その感覚でまとめれば要件資料としてはそれなりになるはず。
「すごく困難」って言ってる人がいるけど、正攻法で1からやろうとすると困難かもね。
単純ロジックで乱数うまく使って種表作って、
補正が手詰まりになったら最初からやり直すプログラムにすれば、
表が完成するまでの時間はかかるけどなんとかなる。
>>306 > 補正が手詰まりになったら最初からやり直すプログラムにすれば、
> 表が完成するまでの時間はかかるけどなんとかなる。
それ、いつ終わるの?
組み合わせ爆発、半端ないよ?
>>306 仮に要件が固まったとしても、それを実現できるコードを書けるとは限らない。
汎用的なシフト勤務ソフトがそれほど出回ってないのは、それぞれの職場の都合が大きく異なるのということより、
やはりシフト勤務作成そのものが難しいからだと思う。
実際ナーススケジューリング問題でググればわかると思うが、正攻法では無理なのでGAによる解法がかなり
研究されてる。
309 :
278 :2012/02/20(月) 16:18:27.47
ナーススケジューリングは気をつけないといけないんですよね・・・ やっぱりそこが難点ですか困難なほどに; 引継ぎ感覚でもう少し具体的にまとめてみます コード書くのはほとんど初心者で何から手をつけたらいいのか全然分からないですが… 少しずつでも頑張っていきます
勤務表に関しては入力支援を強化してアナログ入力した方が早いんだよな
ボタンひとつで終われば楽っちゃ楽なんだけど
継続的に使えるプログラムを作成する労力と、1ヶ月のうち勤務表作成にかける労力を考えると
どうしてもアナログ入力になる。
>>309 つーか、この件に関しては引継ぎなんて考えるなよw
できる人ができる形でやればいいんだよ
どうせ素人が扱えば余計な動作やエラーで詰むし
そこそこ使える人ならそれなりのモノ作るんだから
つーかさ、
>>278 はNSPの一般解求めるのが目的じゃなくて
職場の勤務表を作るのが目的なんだから
とりあえず作成に必要な要件をもっときちんと書き出してみたらどうよ。
>>302 の情報だけじゃ結局
>>278 にしか分からんじゃん。
たとえば勤務シフトには何種類あるのか、(明、早、日、夜1、夜2、休の6種類なのか?)
スタッフ何人いて各シフトにはそれぞれ何人割り振るのか、
そのうち何人がシフトに制約があるのか、etc.
具体的に書き出したらそこそこ何とかなるかも知れんのと違う?
まぁ現状で(手書きの状態で)どの程度満足できるシフトを作れてるのか
もわからんから、あんまり厳しい条件だと自動化は無理だろうけど。
実際の勤務表に近いものをどこかにUploadしてください 他業界の人に勤務表作成を依頼するつもりで説明してください
313 :
278 :2012/02/20(月) 20:49:48.30
そうですね、それでは確実なところから ・勤務は 早番、日勤、夜勤1、夜勤2、明け、休み、有給、研修 日勤は2番、3番・・・とあり多いときで(行事などの日)10番とかも 土曜、日曜日は4番、5番までなど少ないことが多い 平日は大体6番、7番以上まで欲しい(希望休が重なるなどで5番までのこともあり) 正職、パート、嘱託?や人により可能な勤務が違う パートには休みを全部自分で指定する人もいたり。 一日の勤務で最低 早番、2番、夜勤1、夜勤2、明け*2、明け休み*2が正職か嘱託でいる 夜勤ではこの人とこの人は一緒にできない、がある 早番はやったら次の早番まで5日は間が欲しい 夜勤は基本連続しないように(夜勤、明け、休み、夜勤…無理ならOK) 先に勤務を希望している場合あり(早番、夜勤なども) 前の月の夜勤の明け、明け休みも考慮する 休み、同じ番号の勤務はなるべく連続しないように。偏りのないように 休みは基本月10回。月により前後することあり、又多い人もいる とりあえずシフトに関することはこれくらいかな・・・
連続したセルに値を書き込むのに簡単な方法は無いでしょうか? セルに値を書き込むと、自動的に隣のセルにフォーカスが移動するみたいな
看護士の勤務表は、準夜・深夜・休みを縦横計算しとけばいいと思う。 あとは、希望勤務の登録かな・・・
>>314 それをVBAでやりたいって事?
エンター押すと横移動はオプションで設定できる。
>>313 だ・か・ら・他業種の人相手にその説明で理解できると思う?
何番ってのは人数なのか?だったらなんで
>早番、2番、夜勤1、夜勤2、明け*2、明け休み*2
って一番が居なくて2番が居るんだ?
これだと1日8人が必要ってことだが
>日勤は平日6番、7番以上欲しい
ってのはこの8人には含まれてないのか?
そもそもこのシフトを全部で何人で回してるんだ?
(これ一番重要かもしれない)
>>314 それ普通にエンター押せば次のセルに行くじゃん。
エンター押下で上下左右のどちらに行くかは
ツール=>オプション=>編集から
"入力後にセルを移動する" の "方向"で変えられる。
>>314 VBAと関係なく、普通に移動するんじゃないの。
下方向か横方向かは設定次第だが。
319 :
314 :2012/02/20(月) 22:25:10.40
自己解決しました、レス有難うございます Private Sub Puts(s As String) Dim r As Long, c As Long r = ActiveCell.row c = ActiveCell.Column Cells(r, c) = s Cells(r, c + 1).Select End Sub
320 :
278 :2012/02/20(月) 22:29:35.78
そんなもん必要になる状況がよくわからん。
>>320 質問。
明けについて。夜勤明けの勤務なの?それとも明け休み?
それは夜勤と確実にペアなものなの?夜勤だけで明けがない場合もあるの?
>>320 現状のままだと3月以降に条件を満たすのは無理
NSPがどうこう言う以前に延べ人数で考えたらすぐ分かる
まず一個目の画像から1日平均10人が勤務する必要があることがわかる。
つまり1ヶ月で延べ300人必要
対してスタッフは3月以降14人(16-2=14)、
この人たちが月平均10日休むってことは20日働くってことで
20*14=280人ってことで、300-280=20人 => ちょうど1人分足りない
ってことで、15人以上居ないとあなたの施設は回らない
>>321 帳票付けるときに重宝する
TABキー使わずにテンキーとエンターだけで表の端まで行ったら先頭列の1行下に移動できるし
325 :
278 :2012/02/20(月) 22:49:31.98
>>322 夜勤は(夜勤、明け、休み)で1セットは確実です
明けが無いとかはないです
>>323 一応来年度に新しい職員が2人入るのと異動で何とかなるとは思いますが…
それでも厳しいのには変わりないんですよね
>>278 資料をまとめなおしてみたよ。読んでみて違う所の指摘と、研修について月何回とか決まってるかとか、教えてプリーズ。
278番様向け 勤務シフト表入力支援システム要件書 (ドラフト)
1.職員の種類
正職、パート、嘱託などがあり。
人によって可能な「勤務」に違いがある。(パートは日勤3番以降のみ。)
2.勤務の種類
早番、日勤(2番〜10番)、夜勤1、夜勤2、明け、休み、有給、研修などがある。
同じ種類・番号の勤務(および休み)はなるべく連続しないように。偏りのないように。
最低限必要な1日の勤務人数は
早番、日勤(2番〜5番)、夜勤1、夜勤2、明け、明け、休み、休み
の11名。(休み2名は前々日の夜勤1、夜勤2。強制。)
3.早番
別名1番。
4.日勤
2番、3番・・・と(行事などの日)10番ぐらいまである
平日は大体6番、7番以上まで欲しい(希望休が重なるなどで5番までのこともあり)
土曜、日曜日は4番、5番までなど少ないことが多い
つづく・・・
つづき 5.夜勤 夜勤ではペアを組ませられない組み合わせがある。 夜勤は基本連続しないように(夜勤、明け、休み、夜勤…可能な限りにならないよう…) 前の月の夜勤の明け、明け休みも考慮する 6.明け 夜勤の翌日は自動的に入る。 7.休み 休みは基本月10回。月により前後することあり、又多い人もいる パートには休みを全部自分で指定する人もいたり。 夜勤の翌々日は自動的に入る。 8.研修 − 未稿 − 9.有給 有給休暇。 -以上-
328 :
278 :2012/02/20(月) 23:18:59.70
とても綺麗にまとめていただいてありがとうございます >人によって可能な「勤務」に違いがある。(パートは日勤3番以降のみ。) パートで3番ができない人もいます(一応) 休みは年間を通して計算しているので(年度始めには回数は決まっていますが) 9回だったり11回だったりします 休みが多い人というのはパートの人で、配偶者の給料から計算して入れているようです 研修は出張みたいな感じで、休みではないけど職場にはいないとなります 月に一度あるかないか(無いことのほうが多い)であっても一人だけです
278番様向け 勤務シフト表入力支援システム要件書 (ドラフト2) 1.職員の種類 正職、パート、嘱託などがあり。 人によって可能な「勤務」に違いがある。(パートは日勤3番以降※のみ。) ※ 人によっては日勤4番や5番しかできない。 2.勤務の種類 早番、日勤(2番〜10番)、夜勤1、夜勤2、明け、休み、有給、研修などがある。 同じ種類・番号の勤務(および休み)はなるべく連続しないように。偏りのないように。 最低限必要な1日の勤務人数は 早番、日勤(2番〜5番)、夜勤1、夜勤2、明け、明け、休み、休み の11名。(休み2名は前々日の夜勤1、夜勤2。強制。) 3.早番 別名1番。 4.日勤 2番、3番・・・と(行事などの日)10番ぐらいまである 平日は大体6番、7番以上まで欲しい(希望休が重なるなどで5番までのこともあり) 土曜、日曜日は4番、5番までなど少ないことが多い つづく
つづき 5.夜勤 夜勤ではペアを組ませられない組み合わせがある。 夜勤は基本連続しないように(夜勤、明け、休み、夜勤…可能な限りにならないよう…) 前の月の夜勤の明け、明け休みも考慮する 6.明け 夜勤の翌日は自動的に入る。 7.休み 正職、嘱託の休みは基本月10回。 月により前後することがある。(1年間の回数は決まっており、兼ね合いで調整。) パートは人によって回数が違う。 パートには休みを全部自分で指定する人もいたり。 夜勤の翌々日は自動的に入る。 8.研修 出張による研修。多くても月1回1名程度。 9.有給 有給休暇。
>>278 提案。
当面の目標は入力支援とし、下記の機能を実現。
1.条件に合わないモノを検出する機能
2.一意で決まるモノを自動入力する機能(夜勤→明け→休み)
3.コンボボックスによる候補での入力(条件によってソートする。)
この辺りが出来ればかなり楽になるんじゃね?
332 :
278 :2012/02/21(火) 00:26:44.73
>>329 まとめなおしていただいてありがとうございます
改めてまとめると自分でも分かりやすいですね
>>331 それくらいのほうがいいのでしょうか
やっぱり自動で作成はかなり困難ですかね…
333 :
331 :2012/02/21(火) 00:45:10.26
>>332 順番の問題だよ。
自動生成を作っても調整は必要になるんだろ?
まずは調整と入力を支援する機能を作る。
↓
休みの事前入力とかを作る。入力部分に連動させる。
↓
手動部分を少しづつ自動化。
こうすれば、途中段階のものでも活用できる。
最初から大風呂敷やると時間が無くなる一方で何も出来上がらないと思う。
>>332 331ではないけど、
自動化は総当たりとかで頑張れば不可能ではないと思うけど融通がきかないと思う
ある人が骨折して2週間以上抜けてしまうとか
この二人組は両方新人なのでばらばらにしたいとか
都合で休みを振り返る人が結構いるとか
そういう例外までも自動化で対応するのはかなり困難
その点入力支援はそういった例外にも強い
自動化しても融通がきかないとまったく使えないシステムになりかねない
最初に入力支援を作って様子をみて、いけそうなら最初のシフト表を自動作成することを考えればいい
人員マスターテーブル作って、各人可能なシフトパターンを網羅 表に希望の休みを入力して空いてるセルに人員マスターテーブルからランダムで勤務パターン取得 そしてアナログで手直しするのが一番早いんじゃね? 入力支援に関してはchangeイベントとVlookup使えばテンキーだけで行ける。
そろそろ別の所でやってくれないかな
>>278 当番表の構造が分からないので説明お願いします
338 :
278 :2012/02/21(火) 07:22:49.41
なるほど、それなら入力支援も使えるしいいですね
とりあえずはそちらから取り掛かろうと思います
>>336 すみません;こう長くお話しちゃお邪魔でしたね…
>>337 当番表の構造・・?
>>338 わかりました
当番表は勤務表の縦横を入れ替えて
番号順に並べ替えたものなのですね
いつまでVBAと関係無い話してんだよ
Excel2002を使っています。 あるテキストファイルの最終行から4行目(4行目だけ)の値を取りたいと考えております。 最終行取得はヤフー知恵袋にありましたのでこれを使おうと思います。 Do While Not EOF(1) Input #1, MyString cnt = cnt + 1 ’cnt=行数 Loop Line Input では何行目とか言う指定はできないようで どのように指定行を取るかが分かりません。 ググッたら「Line Input で空読み」という事までは分かりましたが 空読みの意味が分かりません・・・ ここから指定行を取得するにはどのようにすればいいのでしょうか?
行番号を指定して読むことは出来ない。 処理時間をあまり気にしないなら、配列 MyString(3) as string を作って、ファイルの先頭から行を読むたびに0->1->2->3->0->1->...と保存していけば、 最も古いデータが最終行から4行目。 dim index as long index = 0 Do While Not EOF(1) Input #1, MyString(index) index = index + 1 if index = 4 then index = 0 end if Loop
>>342 ありがとうございます。
配列に入れるとは全く思いつきませんでした。
目から鱗が落ちる回答勉強になりました。
希望通りの結果が得られました。
ありがとうございました。
345 :
278 :2012/02/21(火) 19:21:52.87
>>343 本当にありがとうございます
本来自分がやるべきことなのに・・・
これからはそちらに書き込むようにいたします
すいません、VBAでスレタイ検索したらここに流れ着いたのですが、初心者用の質問スレってありますか? 表内で、ある列の書かれている文字ごとにその行の背景色を変えていくと言うマクロを VBEでモジュールに書きたいのですが、イマイチイメージが浮かばなくどうしていいかわからない状況です 足の骨折で入院してて勉強が遅れてしまったので急いで追いつきたいのですが、 おそらく簡単であろうこんな問題もわからなくなってきた次第です・・・ 変数を使用して、繰り返しの処理をし、RangeとCellsを使って解けと言われたのですが???と言う状況です そこで初心者用のスレがあったら誘導願います スレ違いでスイマセン
>>346 スレはここでも良いと思うけど、Cellsを使ってループ処理をする、その方法は知ってるの?
For i = 1 to 100
If Cells(i,1)= "xxxx" Then
Cells(i,1)= 〜
End If
Next
みたいなさ
>>344 もう解決してるので今更感が強いけど、
テキストファイルをエクセルで開いて下から4行目を取得する、
というやり方もできるよ
Test.txtを開くと仮定したらこんな感じ
Sub test()
Dim WB As Workbook
Dim I&
Dim Txt$
Set WB = Workbooks.Open("test.txt")
With WB.Sheets(1)
I = .Cells(.Rows.Count, 1).End(xlUp).Row
If I > 3 Then
I = I - 3
Else
I = 1
End If
Txt = .Cells(I, 1).Value
WB.Close
MsgBox Txt
End With
End Sub
>>347 文字は何パターンあるのかな。
パターン数分の背景色が必要になるけど、何色でも良いの。
>>346 このあたりを調べて使えるようになればできるよ。
最終行取得
繰り返し(for each〜next)
colorindex
entirerow
dictionary
352 :
346 :2012/02/21(火) 21:26:45.65
>>347 For〜Nextは勉強しましたので、その文はナントカわかります
>>349-350 大元が2種類あって、更にその片方が何種類か条件があるような感じです
ですので、背景色は6〜7色前後になりますが、色については指定がありましたので、
ColorIndexの後にその数字を入れていけば対応できます
>>351 残念ながらまだ基礎の方なのでColorIndex以外は習ってないですね・・・
今習ってる構文?といえば
思い出せるのは、If〜Then〜Else、For〜Next、Do〜Loop位ですね
347さんのでなんとなくなイメージは浮かびました
答えてくださった方々、ありがとうございました
とりあえずはもうちょっとネットで調べてみます
OS:XP SP3 Excel:2003 SP3 --- (略) graph_name = ActiveChart.Name graph_index = ActiveChart.Index (略) ActiveSheet.ChartObjects(graph_index).Activate 'エラーが発生する (略) --- 例えば、graph_nameがGraph 3だったら、 ActiveSheet.ChartObjects("グラフ 3").Activate とする事で、エラーが発生しなくなります。 解決策をご存知の方はぜひご教授願います。
>>353 graph_index =ActiveChart.Parent.Index
355 :
デフォルトの名無しさん :2012/02/22(水) 10:41:53.09
>>215 なんですが、
>>217 さんのやり方で成功したかと思ったんですが、
欄が全部埋まってる場合にも空白のメッセージボックスが出てきてしまうんですよね。。。
全て記入されている場合はメッセージボックスを出さない処理にするにはどうすれば良いのでしょうか?
>>355 最後のmsgboxのところを
ifでよける。
>>355 if len(str)>0 then msgbox str
then end if を { } で書くのに慣れると、BASICはどうも読みにくくて仕方ない。。 まあ慣れの問題なんだけどさ
360 :
デフォルトの名無しさん :2012/02/22(水) 22:51:46.44
おう、お前ら 初心者で悪いけど質問な ユーザーフォームっての作ったんだけど そこに入力された値ってのはどうやって得るんだ? 初心者なんだから丁寧に教えろよ
つまんない
ユーザーフォームの値を得たり、値を入れたりは Applicationオブジェクトから辿ると何となく分かるけど、 Msgboxのボタンを押すとか謎。
>>360 オブジェクト名.Valueでよろし。。。。。
364 :
デフォルトの名無しさん :2012/02/23(木) 00:03:42.57
便乗するわけじゃないけどユーザーフォームについての質問です。 ユーザーフォームの右上の×をクリックしたときって どういう動作をしているのでしょうか? ×でフォームを閉じたことを標準モジュールのプロシージャ (そのユーザーフォームをShowしたプロシージャ)から知る方法ってありますか? 現在はPublicで宣言したBoolean変数とフォーム上のコマンドボタンを用いて コマンドボタンをクリックしたら変数をTrueにしてからHideするようにしてます。 (×で閉じたらFalseだからそれで判断してます) パブリック変数を使わないで×で閉じたことを知る方法があったら教えてください。
>>365 標準で用意されているイベントハンドラでは知ることはできない
プロセスの終了方法を区別するには、×ボタンのクリックイベントをフックするぐらいしかないんじゃない?
ただしアプリケーションの作法としては終了方法を区別するような設計にするのはあまり良くないと思うけど
>>365 ユーザフォーム内だと
UserForm_QueryClose
で処理できるんだけど
いっそのこと Xで終了出来なくしたら? だめかな?やっぱ
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then Cancel = 1
End Sub
368 :
365 :2012/02/23(木) 03:32:51.89
>>366 無理なのですか、残念です。
終了方法を知りたいというか、
ユーザーフォームと標準モジュール間でパブリック変数を介さないで
情報のやり取りがしたかったのです。
標準モジュール同士ならローカル変数でも引数で受け渡し可能ですけど、
ユーザーフォームには引数渡せませんよね?
標準モジュール側からLoadだけしておいて
フォームのオブジェクトに値を入れてShow
とか、
フォーム側からHideして標準モジュールに戻ってから
オブジェクトの値を取得とかは出来ますけど、
Hideしたときにどういう風にHideしたかの情報を
パブリック変数を使わずに取得できないかな?
ということが知りたかったのです。
(ぶっちゃけていうと「実行」と「キャンセル」の判別に使いたいのです。)
パブリック変数の使用以外に
フォーム上に不可視のオブジェクト(チェックボックスなど)を作っておいて
それをフラグに使うっていう手もありますが、
なんかスマートじゃないな、という気がしまして。
>>367 上に述べたとおり、×をキャンセルボタン扱いで使いたかったわけです。
残念ながら私の思うような方向では出来ないっぽいですけど。
ともあれ、お二方にお答えをいただけてとてもうれしかったです。
どうもありがとうございました。
369 :
365 :2012/02/23(木) 03:49:06.68
一応、私の知っている範囲でフォームから標準モジュールへ 何らかの値を渡す方法っていうのは以下の3種類しかないです。 1.パブリック変数の使用 2.フォーム上のオブジェクトの値をHide後に取得する 3.フォーム内のプロシージャからワークシートのセルや 外部のテキストファイルなどに書き出しておく これ以外に何か方法をご存知の方、教えていただけたら幸いです。
>>369 普通標準モジュール側に通知用の関数用意しとかない?
ボタン押したときに呼んでやるの
>フォーム上に不可視のオブジェクト(チェックボックスなど)を作っておいて >それをフラグに使うっていう手もありますが >フォーム上のオブジェクトの値をHide後に取得する オブジェクト=コントロールだと思ってる? 普通は、フォームにパブリックな変数定義するんじゃないかな まあ、パブリック変数を介してるのには違いないけど
372 :
365 :2012/02/23(木) 05:58:09.38
>>370 すごい!おっしゃるとおり出来ました。
今までフォームモジュールの中から標準モジュールのプロシージャをCallしたことがなかった
(引数も渡せないから、そんなことが出来ると思ってなくて試してもいなかった)ので、
やってみて目から鱗です。
これからはこの手でいきます。
ご指導どうもありがとうございました。
こんな感じで試しました。
[Module1]
Sub Test
Userform1.show
End Sub
Sub BtnClick
Stop '<=ここで止まった(つまりここにキャンセルの処理を書いておけばOK)
End Sub
[UserForm1]
Private Sub CommandButton1_Click
Call BtnClick
End Sub
>>371 どうもありがとうございます。
370さんにバッチリなお答えを教えていただいたので今後はそちらを使うことにします。
一応、オブジェクト=コントロールというか、
フォーム内のコントロールはオブジェクト(に含まれる)という程度の認識です。
コントロール以外で、フォーム内にオブジェクトがあるのかどうかは分かってないです。
派遣のお姉さんが毎日6時間かけて色んなCSVファイルから必要なデータを取り出して集計してExcelに整形する処理、 私がVBAで2時間位で完全自動化した時は泣いて喜ばれたし、作業無くなったお姉さんはキャビネの掃除とかして 時間潰そうとしてたけど2ヶ月後退職迫られた、プログラママジ害悪
人力でも6時間足らずで終わる仕事を2時間程度にしか短縮できないオマエさんがヘボなのか、 VBAでも2時間かかる作業を6時間で終わらせてしまう派遣のオネエさんが凄いのか、 どっちだかよくわからん話だな。
どう読んだらそうなるんだ コーディングが2時間だろ
は? 仕様のヒアリング1時間、コーディング30分、テスト30分だろ
どう読んだらも何も本来の文脈からいったら おネエさんの作業時間と対比するには VBAのほうも処理に必要な時間を書くべきだろ。 もちろん、いくらなんでも人力の3倍前後にしか短縮できないってのは ちょっとあり得ない話だから コーディングにかかった時間なのだろうと推測はできるが はっきりと明記されていない以上、 日本語としては前述のような解釈も十分可能だぞ。
> 私がVBAで2時間位で完全自動化した これを、作業時間2時間で完全自動化したと読めないのは、日本人じゃ無いか、IQ70以下くらいだと思うぞ。 日本人だしIQも高いというなら、それは単なる誤読、勘違いなんだから騒ぐな。
どうでもいい事ではスレのびるのな
日本語っていうのは語順の入れ替えや語句の省略によるあいまい表現に寛容で 柔軟な構造の言語だから省略された部分に何を補完するかでどうにでも取れるよ。 >私がVBAで2時間ぐらいで(作業が終わるように)完全自動化した。 という読み方だって、 その前段で述べられている人力での作業時間と対比をなすことから考えたら自然な解釈なんだよ。 っていうことがわからないなら それこそ日本語を勉強し直した方が良いと思う
>>380 余分な単語をそぎ落とすと「私が二時間位で自動化した」になるが、これでもまだ六時間かかる処理を
二時間位で終わらせるような自動化をしたと読むのか?
ちょっと、日本人とは思えない解釈だわ
>>377 >VBAのほうも処理に必要な時間を書くべきだろ。
はぁ?
お前のべき論なんか聞きたくもないよ。
完全自動化されるなら、別に実行に二時間かかってもいいと思うが。 (と、話を変な方向に広げてみる)
すでに述べている通り省略の仕方でどうにでもなる話だよ。 自説に都合の良い省略の仕方をされても困る。 作業時間云々のものからそういう省略の仕方ができないってことと、 元の文章がどういう省略の仕方をした結果なのかは別次元の話だからね。 で、俺は単なるべき論で言ってるわけじゃない。 前後の文脈を合わせるという方向で考えたらそうなると言ってるだけで そうでない解釈が間違いだとは言ってない。 むしろその論理を否定されているからそうでない解釈もありだと言ってるだけ、 先に持論を押し付けたのはどちらか、冷静に判断してほしいし、 そういう論法なら日本語能力云々とかIQ がどうとかも一個人の見解にすぎない話で だれも聞きたいと思ってないのは御同様。
よっぽど悔しいんだろうなぁ
> すでに述べている通り省略の仕方でどうにでもなる話だよ。 そもそも省略なんかしてないし。 100人読んだら、お前以外の99人は作業時間が、と取るわ。
僕の解釈論はそろそろ終わりにしてもらえませんかね。
こんな普通の文章でも、個人の解釈でどうとでもなるとか言う奴が書いた仕様書見たいわ
自分の読解力のなさをわざわざ指摘してくれる人がいたというのに 逆ギレする馬鹿
往生際悪すぎ
393 :
デフォルトの名無しさん :2012/02/23(木) 19:02:53.08
傍目で見てたら論拠に基づいて発言してる人と 言葉の勢いだけで無根拠に強気なこと言ってる人の議論なんだが、 無根拠の方はそれに気づいてないってのが哀しいな。
スレが伸びてると思ってみてみたら何だこいつら いつぞやのDB馬鹿がまた暴れてんのか?
どう解釈するのが普通か、なんて、多人数の意見を集約してみないとはっきりしない ま、俺の主観ならあの文章なら作業時間2時間だな。俺があの文章かいて 実行時間が2時間だととられたなら書き方がわるかったと反省する
スイマセン、助けてください
職業訓練学校に通ってるんだけど、諸事情で1週間ほど休んで一昨日からまた通い始めたんです、
その間に溜まったプリントを消化してて最後の一枚で訳わかんなくなってしまったんです
For〜Nextのネストってのはなんとなく解ったんだけど、どう組み立てていけばいいのかわからなくなって先に進めなくなりました。
http://imepic.jp/20120223/735690 これなんですが、VBAに慣れた人には簡単すぎるかもしれませんがどなたか助けて下さい
>>397 Sub TEST()
Dim i as 整数, j as 整数, k as 整数
For i = 1 to ワークシート数
For j = 6 To 12
For k = 2 To 8
With Cells(j, k)
If .valueが5000以上 Then
.フォント.色=青
ElseIf .valueが2000未満 Then
.フォント.色=赤
End If
End With
Next k
Next j
Next i
End sub
>>398 訂正
With worksheets(i).Cells(j, k)
>>398-399 ありがとうございます!
そうか・・・Nextの終了順番が間違ってたのもあったのか
これでナントカ追いつけそうです
今、訓練所でvba教えでるのか。田舎だと、使う場面が少ないが
XP-2002環境です。 シートAに、2行ペア組のデータで、5万行まで埋まっています。 Dim strData(15) As String に2行のセルの値を配列に放り込んで、 シートBにパコパコ張り付けるのを全行ループしています。 だけど、必ずシートAのある行数のところで、オーバーフローとなって止まります。 別にその行のデータの型などが、特におかしいわけでは無いです。 (成功したデータをその行に貼り付けてもオーバーフロー) もしかして、VBAで処理する行数の上限等の何か制約があるのでしょうか? 上限があるなら何か他の対策はあるのでしょうか。 それとも何か他の原因が考えられるのでしょうか? よろしくお願いします。
>>402 IntegerをLongにしてみたらどうでしょうか
>>402 VBAじゃなくてExcel自体の行数の上限が65535行だけどそれは理解してるの?
Excel2007で100万行に拡張されたけど
>>404 5万行ってことだから問題ないんじゃないの?
>>402 5万行×8列を2万5千行×16列にしてるのかな?
Range("A1:A3").Offset(0,2) ってやったら、 Range("C1:C3") なオブジェクトが取れると期待してたけど、 Range("C1") の単一のセルなオブジェクトになった。 そう言うもの?何かへんなのか? "A1:A3"は、結合してるセルなのだけど、何か関係ある?
>>407 Offsetは左上の単一セルしか見ない
範囲を広げるにはResize
>>403 ありがとうございました。intカウンターをLongで解決。
なんで32000行あたりの特定の数字でオーバーフローしちまうのかなぁ
411 :
デフォルトの名無しさん :2012/02/24(金) 08:28:36.17
>>407 実際にRange("C1:C3")になるぞ。
そっちのPCは呪われてるのか?
>>411 >>407 も
>"A1:A3"は、結合してるセルなのだけど、何か関係ある?
って書いてるけど、うちの環境で試しても
A1:A3が普通のセルならC1:C3を返すけど、
A1:A3を結合してるとC1だけしか返されなかったよ。
>>412 ちょっと気になっていろいろ試してみた
ヘルプには
>指定された範囲からのオフセットの範囲を表す Range オブジェクトを返します。
とある
ここでの指定された範囲ってのは指定したRangeじゃないし、オフセットの範囲ってのもそのRangeの範囲じゃないってことらしい
問題は、結合セルに対してOffsetをとった場合
指定された範囲=結合セルという一つの範囲
オフセット基準=指定範囲の終了地点(右下)
だとみなされるようだ
A1:A3が一つの結合セルだった場合、Range("A1").OffsetもRange("A2").OffsetもRange("A3").Offsetも同じ動作をする
普通にOffset実装したらそういう動作しそうもないから、
わざわざ結合セルに対するOFFset動作は特別な動作するように実装されてるんじゃないかな
ということで、
>>407 そう言うものだと思われます
だれかこの動作の公式なドキュメントしってる?
414 :
デフォルトの名無しさん :2012/02/27(月) 00:59:22.80
Excelファイルが読み取り専用の場合、入力できなくする方法 Excelファイルを読み取り専用で開いてるのを忘れて、 いざ保存しようとした時に読み取り専用だった事を思い出すって事ありませんか? だったらセルのロックみたいに入力自体できなくすればいいじゃないかと 思ってはみたもののどうすればいいかわかりません。 読み取り専用推奨で保存したファイルを開いて 読み取り専用にするか訊いてきた時に"はい"の場合はセルのロック、 "いいえ"の場合はセルのロックを解除というマクロを組んでAuto_Openで動かしてみましたが、 どうも訊いてくるより先にAuto_Openが実行されているようでうまくいきませんでした。 読み取り専用で開くかどうかもマクロで組めれば解決するのかなと思いますが、やり方がわかりません。 どうにかならないでしょうか?
Workbook_Openイベントプロシージャ
416 :
デフォルトの名無しさん :2012/02/27(月) 07:37:36.89
マクロの記述で質問です。 B列のセルに"日本"を入力すると、 その該当するC列とD列のセルの値や文字列をクリアして斜線を入れたいのです。 例えば B2へ"日本"を入力すると、C2〜D2のセルに入っている値・文字をクリアして 自動的に斜線を入れる、 同じく B3へ"日本"を入力すると、C3〜D3のセルに入っている値・文字をクリアして 自動的に斜線を入れる、 といった感じです。 ここで B2に対してはそれらの動作が上手くいくのですが B3やB4以降の行に関しては上手くいきません。 例えばB3へ"日本"を入力するとC3〜D3のセル内容はクリアされずC2〜D2の値がクリアされてしまいます。 B4やB5以降に関しても同じくC2〜D2の値がクリアされてしまいます。
417 :
デフォルトの名無しさん :2012/02/27(月) 07:39:07.10
上の続きです。 一応マクロの文です。 おそらく相対参照の問題だと思います。 調べて試行錯誤しましたが上手いやり方がわかりません。 Excel2003です。 どなたかご教授お願いします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r, trg As Range Set trg = Intersect(Target, Range("B2:B14")) If Not trg Is Nothing Then For Each r In trg If r.Value = "日本" Then r.Offset(0, 1).Resize(1, 2).Borders(xlDiagonalDown) _ .LineStyle = xlContinuous Range("C2:D2").ClearContents Else r.Offset(0, 1).Resize(1, 2).Borders(xlDiagonalDown) _ .LineStyle = xlNone End If Next r End If End Sub
> Range("C2:D2").ClearContents それはそうだろ、としか。
Range(Cells(i,j),Cells(i+?,j+?)) でこのi,j,?を操作すれば
Range("C2:D2").ClearContents を r.Offset(0, 1).Resize(1, 2).ClearContents で、いけたわ こういうのわかりにくいから、 r.offset(0.1).clearcontents r.offset(0,2).clearcontents ってやってるわ。
>>418-420 ありがとうございます。
削除する対象のセルを結合したセルにすると
「結合された一部のセルを〜」のエラーが出てダメになりましたが
r.Offset(0, 1).Resize(1, 2) = "" にすると大丈夫でした。
お世話になりました
range(“a1“).numberformat=“@“ range(“b3“).numberformat=“hh:mm“ if range(“a1“)<>range(“b3“) then としても差異は検出されないけれど、セルの内容全てを比較したい場合は、全プロパティ分のifを書いてやらんとあきまへんのどすか。
.text
range("a1").numberformat="#,##0" range("b3").numberformat="#,##0;-#,##0" 値は両方とも100 この場合も違うと判定させたい?
させたいどす。 .value でも .width でも罫線でも、違いを検出したいんどすえ。
rangeのプロパティカウントさせることができないっぽい 自分で関数作るか、if文書くかしかなさげ というか、プロパティカウントできないの初めて知ったわ これ地味に不便ね
VISTA Excel2007 です ライブラリの参照設定をコード内で実行したいのですが、 同じ文を標準モジュールに書くとエラーが出ないのに クラスのイニシャライズに書くと「中断モードでは実行できません」と エラーメッセージが出ます(ただ参照設定の処理がなされます) クラスのイニシャライズでエラーが出る原因など分かる方がいましたらご教授ください 以下コード: Const DAOFileFPath As String = "C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll" ActiveWorkbook.VBProject.References.AddFromFile DAOFileFPath
>>427 べつに普通に実行できるが
そのエラーメッセージの通り、中断モードのままやるからエラーになってるだけだろ
429 :
427 :2012/02/29(水) 01:03:02.92
すみません もっと早く書き込みたかったのですが仕事で抜けられませんでした イニシャライズでなくメソッドにしても同じエラーになったので もしやと思い、クラスを新規作成して一からコードを手打ちしていったら 今度はうまく行きました モジュールが壊れていたんだと思います 必ず通るはずのStopをスルーして、その先のMsgBoxが動いている時点で気づくべきでした 前にもこんなことがあって、別のモジュールに一から書き直したらやっぱり普通に動いた そんな無茶な使い方してるわけじゃないのにな… どうも失礼しました
いやだから、Stopで止まったら中断モード... まあいいか
忙しすぎて日本語読む余裕がないんだろうな
すみません、どうも詰まってしまったので質問させてください 商品名の入っているシートから、数学で言う所の和集合を取りたいと考えています 例えば、 A列 B列 1 CC TT 2 HH CC 3 TT E3 となっているようであれば、(CC、TT、HH、E3)を取り出して、できれば1セルに一つの名前という形で長く並べたいと考えています Sub Test() Range("F8").Value = Union(Range("A1:A3"), Range("B1:B3")).Value End Sub おそらくUnionを使うのかなと考えて、とりあえず1セルに一つの名前ということを考えずに書いてみたのが上のコードなんですが、 実行するとF8にはCCしか入力されません。これはどこが間違っているのでしょうか? どなたかよろしくお願いいたします。
すいません、色々試してみたら半分くらい自己解決できました。 Sub MultipleRange() Dim rng1 As Range, rng2 As Range, myMultiRanges As Range Worksheets("Sheet1").Activate Set rng1 = Range("A1:A3") Set rng2 = Range("B1:B3") Set myMultiRanges = Union(rng1, rng2) Dim i As Integer For i = 1 To 6 Cells(10, i).Value = myMultiRanges(i).Value Next i End Sub これだと重複ができるようなので、これやった後に重複チェックのコードを別にかければなんとかいけそうです。お騒がせしました
Excel2010 (win7 home) Worksheets("test")の Private Sub Worksheet_Activate() UserForm1.Show End Sub と入れて Worksheets("test")のタブをクリックして表示させた時に Userform1が立ち上がるのは確認したんですが、 ThisWorkbookのシートモジュールの Private Sub Workbook_Open() Worksheets("test").Activate End Sub としてブックの起動時にWorksheets("test")をアクティブにしても Userform1が出てこないんですが、これはなぜ? 明示的に UserForm1.ShowをWorkbook_Open()に入れればもちろんフォームが 出てくるんですけど、これではあまり意味がないような気がする んですけど。
九分九厘、そのワークシートtestがブックを開く時点からアクティブなんだろうな。 ワークシートのActivateイベントは「他のシートから移動してきたとき」しかトラップされないから、 ブックを閉じるときにtestがアクティブな状態で保存されて、開くときに最初からアクティブだとトラップできてない。 試しにワークシートtest2を作って、それをアクティブにした状態で保存して開いてみ?
おおっ、即レスかつその通りでした! ありがとうございますm(__)m
VBAで あ 1 あ 1 を行を文字と数字に列を整えることは可能?
ちゃんとした日本語の説明か、結果のプレビューを頼むwwwwwwwwwwwwwwww
エスパーの訓練が捗るな
Excel2010(vaista)ですが 家計簿を作成してまして収入と支出の差額を表の一番右下の セルに表示させているのですがそのセルの数字が黒字(0以上)ならセルの背景を青 赤字(0未満)ならセルの背景を赤にしたいのですが上手くできません そもそもVBAでは不可能なので素直に条件式書式設定を毎回 使用したほうが良いのでしょうか?
条件式書式設定でできることを態々VBAでやろうとする意味が分からないんだが
Excel 2010です。開発タブをリボンに表示させる方法を教えて下さい。 2007では、「ファイル」→「オプション」で「開発タブをリボンに表示する」が 出て来るのですが。
イベントプロシージャに親プロシージャの引数をわたすことは 可能でしょうか?
今日は妙に>2すら読まない奴が多いな…
>>442 ファイル→オプション→リボンのユーザー設定→開発にチェック
ユーザーフォーム上のコマンドボタンの色を変更する目的でカラーパレットを表示させたいのですが、 どうすればいいでしょうか? マクロに記録してから中身を見ようと思ったのですがVBAにはマクロの記録がなくて、ググっても RGBの値を直接代入する例ばかりでよくわかりませんでした。 よろしくお願いします。
カレーパレットダイアログは搭載されてない。 自分でユーザーフォームで1から作るか、WinAPIを使って自分で実装するしかない。 お好きな方で。
>>448 ありがとうございます。
自作することにします。
450 :
デフォルトの名無しさん :2012/03/02(金) 13:54:58.28
パッチあてるのどうやるの? sed -i s/hello/こにゃにゃちわ/g *.[ch] cc *.[ch] 相当。export、import手作業は嫌です。
そんな便利なものはない。 自分でやるなら、VBComponent.CodeModule.ReplaceLine使え。
アドインにしとけ
witheventsを使うときに、コマンドボタンの1〜5個めはイベントを共有して、 6〜10個めはそれぞれ独自のイベントにしたい場合はwitheventのプロシージャーの 中で判断するしかないですか?
454 :
デフォルトの名無しさん :2012/03/02(金) 18:41:09.43
>>451 ありがとう。
var=VBComponent....Lines(...)
replace(var,“hello“,“こにゃにゃちわ“)
VBComponent....Lines=var
みたいにして絶望していた。
>>452 もう一歩教えてくだsあ。
アドインにReplaceLine()なりを書けという意味? アドインにサブルーチンの置換プラグイン相当の機能があるという意味?
455 :
デフォルトの名無しさん :2012/03/03(土) 16:16:57.97
シートがなくなるまで、2シートずつ選択してプリント。 Sub pare_print() Dim i As Integer For i = 2 To Sheets.Count Worksheets(Array(i, i + 1)).PrintOut i = i + 2 Next i End Sub できません・・・なんででしょう??(´Д⊂ヽ プリントアウト始めのシートは2番目からです。。
複数枚のグラフをユーザーフォーム上に重ねて表示させることはできるでしょうか? 今はシート上に重ねて表示させているのですが表示場所をずらしたい時とか、全体に 拡大縮小したい時にどうすればいいかわからず、ユーザーフォーム上ならユーザーフォームを 移動、拡大縮小することによって簡単にできるかなと思ったのですが、ググっても情報がないみたいで。 よろしくお願いします。
457 :
455 :2012/03/03(土) 16:26:48.45
どうもすみません。 最初のシート名は、0だったようです。できました。
459 :
456 :2012/03/03(土) 20:56:39.14
すみません。OSとバージョンを書き忘れました。 OS:BeOS Release4 (intel版です。PowerPC版ではありません ) バージョン:Gobe Productive 1.1 引き続きよろしくおねがいしますm(_ _)m
こんにつわ、質問です。 A1-A50にランダムで指定の文字列もしくは空白が入ります。例えばリンゴ、ミカン、etcで、それぞれリンゴ...001、ミカン...050のようにあらかじめ対応する数字が割り振られています。 この文字列、つまり数字を条件に処理したいのですが、この場合A1から順に判定するよりも、A列から抽出して重複と空白を除外し、その結果を例えばB列に貼り付けて、B1からB?の空白まで処理をくり返すのが良いと思うのですが、どうでしょうか。具体的にどう書けば良いですか?
>>460 B列に貼り付ける処理が無駄
FOR EACH でA列のRANGEを処理しながら回せばよろし
thx. RANGEが固定ではない場合の上手い方法ありますか?適当に下まで引っ張ればいいですか?
分からねえ分からねえよぉ A列に指定の文字列ランダムに配置 B1-B50に指定の文字列 C1-C50に指定の文字列に対応する数字 があるとして、A1から順番に対応する数字をMsgboxで表示していくコード誰か書いてくれぉ
VLOOKUP使えよ
thx. A1からセル内の数字だけ取り出すにはどうすればいいですか? 漢字/12345\/ という形式から 12345 を取り出したいです 漢字は1-5文字のランダムなので、LEFTは使えないです 数字は5桁固定で必ず\の前です
for i = 1 to 最終行 最終行の取得はお好きにどうぞ
>>465 正規表現でもLikeでもお好きにどうぞ
Dim c As Object For Each c In Worksheets(imacat).Range("A1:A100") If c.value Like "*##*" Then Msg: MsgBox "cである" End If Next c ここまで出来た…
Msg:要らないな MsgBoxにマッチした数字を表示したいのですけどできません
MsgBox c & "である"
そもそもLikeでマッチした数字返せるのけ?
473 :
デフォルトの名無しさん :2012/03/04(日) 13:12:38.41
>>465 instrで/と\の位置を探してmid関数を使えば?
>>463 コード書いたのでどうぞ使ってください。
>>464 のいうとおりVLOOKUPを使用して組んでみました。
Sub Test()
Const s = vbKeyLButton: Const e = vbKey2: Dim vlookup: Set vlookup = Application
Dim i: For i = s To e:
Dim v: v = Evaluate(Chr(vbKeyF7) & Chr(vbKeySeparator) & Chr(vbKeyDivide) & Chr(vbKeyDivide) & _
Chr(vbKeyAdd) & Chr(vbKeyF6) & Chr(vbKeyF1) & Chr(vbKeyDown) & Chr(vbKeyNumpad1) & i & _
Chr(vbKeySnapshot) & Chr(vbKeyNumpad2) & s & Chr(vbKey9 + 1) & Chr(vbKeyNumpad3) & e & _
Chr(vbKeySnapshot) & Chr(vbKey2) & Chr(vbKeySnapshot) & Chr(vbKeyNumpad6) & Chr(vbKeyNumpad1) & _
Chr(vbKeySeparator) & Chr(vbKeyF4) & Chr(vbKeyNumpad5) & Chr(vbKeySelect))
' VLOOKUPで数字をMsgBoxで表示する
vlookup.OnTime Now() + TimeValue(Chr(vbKey0) & Chr(vbKey9 + 1) & Chr(vbKey0) & Chr(vbKey9 + 1) & i), _
Chr(vbKeyRight) & Chr(vbKeySubtract) & Chr(vbKeyNumpad2) & Chr(vbKeyDown) & IIf(IsError(v), String( _
vbKeyRButton, Chr(vbKeyPageDown)), v) & Chr(vbKeySelect) & Chr(vbKeyRight)
Next
End Sub
Sub MB(v): MsgBox (v): End Sub
>>472 かえせるべ
正規表現のほうが楽だけど
str= "あいうえお12345"
strlen= len(str)
for i =1 to strlen
cha= mid(str,i,1)
if cha lile "[0-9]" then
c= c &cha
end if
next
すげー。自力じゃ無理だったので有難く使いますthx!!!
477 :
デフォルトの名無しさん :2012/03/04(日) 13:48:13.13
数字だけ取り出すなら dim a a=instrr(cells(1,1),"\") msgbox mid(cells(1,1),a-5,5) が簡単だと思うけど。
478 :
デフォルトの名無しさん :2012/03/04(日) 13:54:17.43
VBAで可視セルを扱うにはどういう機能またはプロパティまたはメソッドを使いますか?
480 :
デフォルトの名無しさん :2012/03/04(日) 14:04:24.13
連続じゃないセル、たとえば、range("A1:A3")とrange("C1:C3")を3*2の配列に格納するには どうすればよいのでしょうか?
>>481 For〜Nextで順番に代入
作業列を使ってもいいんなら一ヶ所に固まるようにセル範囲をコピーしてからVariant型に代入
B列を削除して配列にコピーしてからアンドゥ
>>481 dictionary使うとか
set dic = createobject("scripting.dictionary")
for i = 1 to 3
dic add cells(i,1)value, cells(i,3).value
next
for i =1 to 3
cells(i,5).value=dicitem(cells(i,4).value)
next
set dic=nothing
こんばんばーん、質問です。 連結されているセルにデータがあるものとして判定するにはどうすれば良い? 例えば、文字列がE1とF1をまたいでいる。セルが結合されているとき、F1にValueしても空だが、データがあるものと判定したいです。セルの結合数はランダムです。
MergeCellsで事故解決です
こんにちあ、質問です。 A1-A100に、空白セルもしくは"abc"のセルがあるとき、その行を削除したいのですが、 Dim c As Range For Each c In Range("A1:A100") If c.Value ="" Or c.Value = "abc" Then c.Rows.EntireRow.Delete Next c とすると、1度目の処理で空白行が消えて、もう一度処理するとabc行が消えます。なぜこの記述はダメなのか?一度の処理で済ますにはどう書けば良いですか?
If c.Value ="" Or c.Value = "abc" Then c.Rows.EntireRow.Delete ↓ If c.Value ="" Or If c.Value = "abc" Then c.Rows.EntireRow.Delete
エラーでますぉ
>>488 ごめんアホなこと書いた
セルを消去してるので、セルが上に繰り上がってる
A2のセルを消去したらA3のセルがA2に繰り上がるので、そのセルは評価されない。
for each じゃなくて
for i =100 to 1 step - 1
A100から 減算させて評価させればいい。
つかstepとか忘れてて ぐぐったわ・・
出来たthx! 質問です、 for i 1 to 100 文字列&i next とするときiが一桁のとき01のようにして&したいのですが、書き方ありますか?
Right関数使え
>>492 For i = 1 To 100
str = str & Format(i, "00")
Next
かんぺきthx!
496 :
デフォルトの名無しさん :2012/03/05(月) 17:41:04.96
どなたか教えてください。 Access2000からExcelファイルを生成しています。 参照設定を Excel9.0 Objectlibrary へ設定しています。 生成先のExcelは2000だったり2003だったり、を想定しています。 以下のソースは動作します。 Function EXCEL_TEST1() '事前バインディング 必ずEXCELへの参照設定が必要 Dim appWorld As Excel.Application Dim wbWorld As Excel.Workbook Dim Wksheet As Excel.Worksheet Set appWorld = CreateObject("Excel.Application") Set wbWorld = appWorld.Workbooks.Add Set Wksheet = wbWorld.Sheets(1) Wksheet.Cells(5, 5) = "カキコ" LAST_CELL = Wksheet.Cells.SpecialCells(xlLastCell).Address MsgBox LAST_CELL wbWorld.SaveAs "C:\hoge.xls", FileFormat:=xlWorkbookNormal appWorld.Quit 開放処理 End Function
497 :
496 :2012/03/05(月) 17:41:43.26
これを以下のように、参照設定せずに実行時バインディングで行ないたいのですが、 LAST_CELL(最終セルアドレス)の取得と、 SaveAsの部分が動作しません。定数の記述が異なるのか、そもそも実行時バインディング では記述できないのかも分かりません。どなたか御教授お願いします。 Function EXCEL_TEST2() '実行時バインディング EXCELへの参照設定が不要 ---------- Dim appWorld As Object 'Excel.Application Dim wbWorld As Object 'Excel.Workbook Dim Wksheet As Object 'Excel.WorkSheet Set appWorld = CreateObject("Excel.Application") '生成 Set wbWorld = appWorld.Workbooks.Add 'ブック追加 Set Wksheet = wbWorld.Worksheets(1) Wksheet.Cells(5, 5) = "カキコ" LAST_CELL = Wksheet.Cells.SpecialCells(xlLastCell).Address MsgBox LAST_CELL wbWorld.SaveAs "C:\hoge.xls", FileFormat:=xlWorkbookNormal appWorld.Quit 開放処理 End Function
>>496 参照設定しないと
定数 xlLastCell や xlWorkbookNormal は
参照先で定義されているから使えないと思うぞ
自前で Const定義するか 定数値を指定するかどっちかしないと
499 :
496 :2012/03/05(月) 19:26:17.24
>>498 様
有難うございます。あまり参照設定とかは経験がないものですから、
何から手を着けてよいのか分からない状態です。
constする値を調べる方法があればよいのですが。
検索が下手なせいか、なかなか参考になるサイトが見つかりません。
500 :
496 :2012/03/05(月) 19:34:55.74
こんにつわ、質問です。 With ActiveSheet.QueryTables.Add 使ってるときに、存在しないURL,空白のURLを打ち込んだときにExcelがフリーズしてしまいます。 どうするのがよいですか?
訂正 空白のurl→空白ページのurl
win7 64bit office2010 32bitです 画像を複数枚選択して、なおかつそれらを40%の大きさにリサイズして取り込みたいのですが、どうしても上手くいきません。どなたかご教授お願いします。
教えてください。 If A then with B Else with C End if って動かないみたいなんだけど、他に方法ありますか?
>>506 下にEnd With が続くとエスパーして
Dim target As Withで使う型、またはVariant
If A then
Set tartget = B
Else
Set tartget = C
End If
With target
処理
End With
>>507 こんなに早く
どうもありがとうございます。
スレートPCについてるWebカメラで撮った画像を直接EXCELに貼り付けたいんですが、どんな方法があるでしょうか? 望ましいのは、ボタンクリック等のイベントで撮影モードに移行し、撮影完了でEXCELに戻ってくるような操作方法です。
フォームモジュールをインポートすると コードの先頭行に空白行が1行追加されてるのは仕様ですか? 空白行を削除して保存しなおしても、また追加されてしまいます。 標準モジュールではそうなりません。
>>509 shellかなんかで立ち上げてsendkeyで操作するとか
イミディエイトウィンドウのバッファ容量って、もっと広げることはできないんでしょうか 途中経過を1000行ぐらい出力したら流れて消えてしまいました
>>512 そんなこと考えてないで
さっさとテキストファイルに出力して
プログラムを進めてくれ
イミディエイトって、どういう意味でいえいと?
>>514 完成したVBAマクロを試しに動かしたら、
何故かExcel巻き添えで落ちる呪いをお前にプレゼントしよう。
辞書で引いてみたら immediate は、 広大な、恒久的な という意味らしいな
>>517 何だったかな
ロブスターとかだったかな
513に借りたんだけど
519 :
デフォルトの名無しさん :2012/03/06(火) 22:39:09.48
フィルタ結果の件数の取得は、どうすればいいんでしょうか?
イミディエイトウィンドウって 一度に100行まで表示じゃなかったけか。 ちがってたらゴメン。
イミディエイトウィンドウは200行がMAXで不可変らしいね。
>>519 「オートフィルタ カウント」 でぐぐればいろいろ出てくる
>>516 それimmediateの意味とはちがくね?
immenselyとかimmensityの意味じゃね?
>>523 直接の〜、とか 即時の〜 という意味だね。
形容詞だね。
ホントどうでもいいけど
>>516 immediateはどうかんがえたって即って意味だろ
526 :
デフォルトの名無しさん :2012/03/07(水) 21:21:07.31
ユーザーフォームを使おうと思ったのですが、 閉じるボタンを押した時、必ずフリーズします。 何故でしょうか。
>>526 ボタンを押した時に実行されるコードを何故貼らない
529 :
526 :2012/03/07(水) 21:42:22.61
すみません。526です。 セルをダブルクリックで呼び出すことにしていまして、 閉じるボタン押した時、セルが編集可能状態である為エラーが出るみたいです。 (ボタンで呼び出した場合は普通に閉じれました。) コードの中身はなく、ひとまずフォームを作った感じです。 ダブルクリックでフォーム呼び出しはやるべきではないのでしょうか。
Cancel = False
教えてください。 まず変数aに1を代入し DO LOOPの中でaを5にしました。 その後aを使うと元の1に戻っているのですが、 これは仕様ですよね? この5という数値を使う方法はありませんか?
532 :
デフォルトの名無しさん :2012/03/07(水) 23:41:52.46
VBAの変数にループ内のスコープなんてなかったよな?
>>531 とりあえずコード貼れ
>>531 a = 1
Do
a = 5
Loop Until True
MsgBox a
>>533 すみません。質問した者です。
変数に追加していくのではなく、
毎回上書きしていただけでした・・・
初心者でごめんなさい。
' Do
' If r = 1 Then
' Exit Do
' End If
' total = Cells(r, 4)
' r = r - 1
' Loop
for系でないループで 中をIfとExitで制御している形はけっこう危険なんだよね。 思わぬ条件で抜けたり 一度も通らない経路ができたりする。
538 :
デフォルトの名無しさん :2012/03/08(木) 01:02:17.51
=LEN(A1) =LEN(A2) =LEN(A3) みたいな値をB列にA列の終わりまで入れていくにはどうしたらいいですか? For文で回すんでしょうか・・・? データの最終位置を取得するのに、「End(xlDown).Row」と、「(Rows.Count, 1).End(xlUp).Row」 ってどう違うんでしょうか? MsgBox "End(xlDown).Row : " & Cells(1, 1).End(xlDown).Row MsgBox "(Rows.Count, 1).End(xlUp).Row :" & Cells(Rows.Count, 1).End(xlUp).Row ↑ を、マクロ開始前のセルの位置をズラして色々やってみても結果は同じでした・・・。
>>538 Cells(1, 1).End(xlDown).Row は上から順番に見ていく
途中に空白があると、それより下のデータは無視される
Cells(Rows.Count, 1).End(xlUp).Row は下から順番に見ていく
最終行までびっちりデータが入っている場合を除いて、本当の一番下がわかる
540 :
デフォルトの名無しさん :2012/03/08(木) 01:45:52.43
>>539 分かりやすい説明をありがとうございました。
で、
=LEN(A1)
=LEN(A2)
=LEN(A3)
みたいのを入れてくには、やはりFor文で回すのでしょうか?
>>540 数十行程度ならForでもいいと思う
もっと大量にある場合はオートフィルの方がプログラムがすっきりするし処理スピードも速いはず
542 :
540 :2012/03/08(木) 02:21:23.52
>>541 ありがとうございます!
ググってみたところ、
Range("B1").AutoFill Destination:=Range("B1", Range("A65536").End(xlUp).Offset(, 1))
でいけるみたいです!この方が頭よさそうだし、スッキリ見やすいし、これでいきます!
おかげさまで安眠できます。
夜分遅くにお付き合いいただき、ありがとうございました!
P列に区分として1又は9を入れた時、Q列に当日の日付を入れたい で、その行位置は範囲は 2行目からlastrow = Cells(Rows.Count, "A").End(xlUp).Row までとしてこういう時 どういう風に Worksheet_Changeに書けばいいんでしょ?
>>543 何も考えずにやれば、こう
lastrow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To lastrow
If Cells(i, "P").Value = 1 Or Cells(i, "P").Value = 9 Then
Cells(i, 17).Value = Now
End If
Next
ただし、Worksheet_Changeでこれやっちゃうとループするので
違う所でやるか、変更箇所のチェックしてQ列なら変更しないとかの工夫が必要
だからP列に1又は9を入れた時、その横に当日日付を入れたい で、どう書けば良いのか?って聞いてんですけど
リロードしてなかった。。。
>>545 ありがとうございます。
それを元にまた勉強してみます
548 :
デフォルトの名無しさん :2012/03/09(金) 00:27:00.69
結構ggったのですが解決しないのでどなたかご教授ください!! if 以下の3セルの内容が数字(全角・半角)でないとき 処理Aを行う Sheet1.Cells(y, x) Sheet1.Cells(y, x+1) Sheet1.Cells(y, x+2) else if Sheet1.Cells(y, x)のみが数値(全角・半角)でないとき処理Bを行う という処理を掛けたいです。 別の言い方をすると、セルが文字・全半角スペース・空の時に処理を掛けたいです。 If not と IsNumberで出来ると思いきや上手くいってません。 お願いいたします。
>>545 cells(i,16)で書くよりCells(i,"P")で書いたほう
列が非表示だったら時便利ね!とか、関係ないことをオモタ
With Sheet1 a = StrConv(.Cells(y, x), vbNarrow) b = StrConv(.Cells(1, x + 1), vbNarrow) c = StrConv(.Cells(1, x + 2), vbNarrow) End With If IsNumeric(a) = "False" And IsNumeric(b) = "False" And IsNumeric(c) = "False" Then 処理A End If If IsNumeric(a) = "False" And IsNumeric(b) = "true" And IsNumeric(c) = "true" Then 処理B End If ベッタベタでよければ どうぞ。
551 :
デフォルトの名無しさん :2012/03/09(金) 01:15:04.82
>>550 ありがとうございます試してみます!!
IsNumeric IsNumberの使い方もあまりわかっていなかったので助かりました。
>>550 IsNumericはBooleanなんだが、なぜ文字列で判定する?
ちなみにIsNumericは、全角の数字でもTrueの判定するから、StrConvする必要はなかったりする
指数表記も認めたりするから、数字の定義によっては注意が必要
>>552 ””いらないね。あっても動くけど。
If not IsNumeric(a) And not IsNumeric(b) And not IsNumeric(c)
で書いてたんだけど、解りにくいかと思ってやった。
今は反省している。
全角の数字判定は知らんかったわ。便利ね。
ありがとう
VBAは、無くなるの?
それは目出度い
556 :
デフォルトの名無しさん :2012/03/10(土) 00:40:01.35
JSサポートするという噂話だけ
VBAにJavaScript???
558 :
デフォルトの名無しさん :2012/03/10(土) 16:17:05.72
1行につき2シートずつ追加するマクロ(簡単に言うと)があります。 これが、72行ぐらいになって、シート数が159を超えたあたりから、シート追加の 「Copyメソッドが失敗しました」とエラーになります。 実際、そのブックでそれ以上シートを追加しようとしてもできません。 ググってみたところ、シート数に上限などはないようですが、メモリに依存するようです。 1枚1枚のシートは、それほど情報量はないのですが、Vlookup関数を多用してますので、 それもメモリを食っているかもしれません。 シート名も、平均22文字ぐらいあって、とても長いです。 一連のマクロは、一度も保存せずに、メモリ内だけで行っています。 データは、60行〜80行ぐらいまである時もあり、一括管理できるようにするため、 やはり1つのファイルに収めるのが理想的ではあります。。 どうすれば、このエラーを回避できるでしょうか?
559 :
デフォルトの名無しさん :2012/03/10(土) 17:53:10.37
それってあるデータを見栄えのいいように整形するためにシートを作ってるって解釈でいいの?
試したけど、空白シートをただ追加するだけなら5000シートでも問題なかった Excel2007 on Win7 シート毎の有効行やvlookupなど、少しずつ条件を変えて状況が変わるか試してみたら? 原因が特定できれば対処も考えやすいと思う
まず数百もシート作るっていう設計を考え直した方がいいんじゃないかと
ここは64bit版の出番だな。
Range("A1").Characters(Start, Length).TextのLengthに256を超える数値は指定できないんでしょうか? 257以上を指定したらCharactersクラスのTextプロパティを取得できませんってエラーが出るんです…
>>563 うちの2007ではちゃんと動いてる
環境かけ
>>564 Windows7 64bit版、Excel2010 32bit版です。。
ntの頃は、鯖と普通のやつの違いがレジストリのどっかが違うだけだったネタがあったな
今試したらRange("A1").Characters(Start, 257).Font.Bold = Trueとかは動くのに Textプロパティだとエラーが出てしまいます。。 やりたいことはTextプロパティを使わなくてもできるので別の方法考えてみます。
>>568 Length=256なら本当にOKなの?
>>569 MsgBox Range("A1").Characters(1, 256).Text
MsgBox Range("A1").Characters(1, 257).Text
の両方を試して256はOKでした
>>571 ですよねぇ・・・
今までもRange("A1").Characters(Start, Length).Textという書き方は何度もしてきたと思うし
こんなエラーに出会ったことがないので、たぶん私が何か見落としてるんだと思います。
もうちょっと調べてみます。ありがとうございました。
質問です。 今、ウインドウ枠の固定を使って、上から3行だけを固定で表示させるようにしています。 この固定部分にボタンを配置して、マクロを登録しようと考えています。 それで、ホイールを回せば4行目から下が上下にスクロールするわけですが、ホイールを 回して下に適当にスクロールさせて、固定部分のボタンを押す。 そうすると「画面に表示されている」上から4行目のセル番地を取得する。 そういうマクロを作成したいんですが、これは可能でしょうか? すみませんがよろしくお願いします。
>>573 MsgBox ActiveWindow.ScrollRow + 3
>>574 おお!できた!
多分できないかなーと思ってたんで嬉しいです。
ありがとうございました。
>>572 うちの2007でも、TextやCaptionを取得しようとするとエラーになるな
でも設定してもエラーにならずに正常に動く
Dim c As Characters
Set c = Range("A1").Characters(0, 260)
MsgBox c.Text 'ここでエラー
おかしいのはRange.Charactersメソッドじゃなくて
CharactersクラスのTextメソッドだな
エラーのMsgBoxの行を変えてテストした
c.Text = String(25, "W") 'これは正常に動作
c.Text = String(250, "W") 'これはエラーは出ないが動作してない
c.Text = String(256, "W") 'これはエラー
どうも怪しげな動作してるな
577 :
デフォルトの名無しさん :2012/03/11(日) 02:56:35.77
Excelってなんでもできるんだなー Excelで
それは無理
579 :
510 :2012/03/11(日) 09:10:27.01
誰か
>>510 知ってる人いませんかね。
OSはXPでエクセル2002です。
フォームの場合、エクスポートしたファイルには フォームやそこに配置したコントロールのプロパティと プログラムコードが1つのファイルに書かれているわけだが インポートしたときにプロパティ領域とコード領域を分ける空行部分が コードエディタ側に読み込まれるってだけの話だろ
>>580 分かりやすい回答ありがとうございました。
え、formってimportできるんすか?!! この前 outportしてそのままimportしたら、class moduleになったので、もうてっきり無理なんだと。。。
583 :
558 :2012/03/11(日) 14:30:33.27
>>559 ええと、業務用です。
取引先ごとに、表紙と帳票をセットにして、FAXするのですが、今までは帳票だけを
ガーッと保存もせずに、シート追加して作成するマクロがあって、別にFAXの表紙だけを
まとめたExcelファイル(取引先300件分のシートがあって、3,3Mくらいのファイル)
の中から、該当の取引先宛の表紙を探して、総FAX枚数や、帳票内の集計数なんかをちょちょっと
直して、印刷して、帳票とマッチングしてFAXしてたんですが、データ(取引先)が
72件もあると、結構2時間ぐらいかかる作業なんです。
この仕事を引き継いだ、元ヘタレPGの私としましては、なんとしてもマクロ化
しちゃいたい衝動にかられまして、FAX表紙は、ざっと3パターンしかなかったので、
取引先を一覧にして、表紙のテンプレに、Vlookup()で引っ張ってきて、
表紙と帳票とセットでシート追加するようにマクロを組んだんです。
そうしたらこのエラーです。
まあ、限界に挑戦するマクロだとは思うんですが、、元々の量の倍になってる
訳だし、、やっぱりファイルを分けるしかないのかな・・。
メモリを食ってる部分が、VlookUPなのか、シート名なのか、それともファイルを
保存してないせいなのか、ある程度でも分かれば、そこを対処してから、ファイルを
分ける方向で行こうかと思って質問させて頂いた次第です。
ひょっとしたらスレチかもしれませんが・・・。
584 :
558続き :2012/03/11(日) 14:31:55.26
計算式より、値が入ってた方がExcelのメモリは食わないんでしょうか・・・?
ちなみにファイルサイズは、2.3Mくらいです。
ここ↓
http://oshiete.goo.ne.jp/qa/3047947.html で、詳しく説明して下さってる方がいるんですが、ここでいう、「配列数式」や
「揮発性(volatile)関数」ってのが何のことなのか、いまいち分かりません。。
VlookUPのことなのか?だとしたら、VlookUPをマクロでやってしまった方がいいんだろうか・・・
長々とすみません。お知恵をお貸しくださいますと幸いですm(_ _)m
vlookupでもシートでも話聞く限り、そこまでメモリ食う感じがしない 顧客名全部仮の名前にして、FAX表紙も適当なものに差し替えてファイルアップすれば もっと具体的なアドバイスもらえるんじゃないかな
586 :
558 :2012/03/11(日) 14:51:48.85
>>585 ありがとうございます。
ファイルは会社にあるので、アップするとしたら明日以降になりますが・・・。
最初のシートに、全ファイルの目次を作って、目次から、各シートに飛べるように
ハイパーリンクを組んだんですが、ひょっとしたらそれがいけなかった・・・?
VBA初めてなので、ソース見ていただいた方がいいかもしれませんね。。
あと、エラーがでた環境も詳しく OS、Excel、メモリ
588 :
558 :2012/03/11(日) 15:16:02.07
>>587 了解しました!(OSはXP、Excelは多分2003・・・)
589 :
デフォルトの名無しさん :2012/03/11(日) 15:56:09.31
Vista.sp2,Excel2000 新しいExcelで,Excel2000のソートコードが動くでしょうか 使っているコードです sh2.Range("e9").Select Rows("11:45").Select Selection.Sort Key1:=Range("A11"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin sh2.Range("e9").Select
591 :
デフォルトの名無しさん :2012/03/11(日) 16:38:44.83
VISTA Excel2007 微妙にスレチっぽくて恐縮なのですが… ExcelからADOでAccess2010ファイルに接続したいのですが udlファイルを作成して、ダイアログでProviderとData Sourceを指定、接続テストも通るのに、 いざ次のコードでそのudlファイルを指定するとエラーになります ([ODBC Driver Manager]データソース名および指定された既定のドライバが見つかりません) 原因分かる方いますでしょうか ADODBCon.Open UDL01_fPath またExcelVBAでudlファイルのProviderの値の取得方法ってあるのでしょうか? Data Sourceの値は以下のコードで取得できたのですが、Provider値の取得方法が分かりません 以下のコードでData Sourceの部分をProviderに置き換えてもエラーに With CreateObject("ADODB.Connection") .ConnectionString = "FILE NAME=" & UDL01_fPath DB_FPath = .Properties.Item("Data Source").Value End With 以下、udlファイルの中身です [oledb] ; Everything after this line is an OLE DB initstring Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\test\DB\Database1.accdb;Persist Security Info=False
補足 UDL01_fPath ’udlファイルのフルパス udlファイルにアクセスする前に、udlのData Sourceに格納されたDBファイルの 存在チェックを入れており、その部分ではエラーがないので、 Providerの指定でエラーが起きてると思うんですが分かりません 最初はudlファイルのProviderとData Sourceの値をコード内で指定していたのですが、 その時はエラーはありませんでした その時の値とをテキスト上にコピーして文字列を比較しても差異はありませんでした
>>592 なんか良くわからんが、たぶん
ADODBCon.Open "FILE NAME=" & UDL01_fPath
MsgBox ADODBCon.Provider
>>594 ありがとうございます!!
うまくいきました
こんな見落としで何時間も浪費していたなんて自分が情けない
以前、
>>447 でカラーパレットについて質問したものです。
ユーザーフォームにボタン表面の色を変えたものを複数並べる
ことによって色を選ぶようにしました。
ボタン一つ一つのクリックイベントにコードを書いたのですが、
イベントの共有やどのボタンが押されたかを識別することによって
コードを簡素化したいのですが、VBAでそういったことは可能でしょうか?
ググったのですが、ブックの共有などの情報ばかりで検索しきれなかったので、
どなたか教えてください。
よろしくお願いします。
application.caller で出来たっけ?
598 :
デフォルトの名無しさん :2012/03/12(月) 19:51:06.54
オートフィルタをかけた抽出結果のタイトル行を除いた最初の行の、二番目の列から、 データの入っている有効セル全てをコピーするにはどうすればいいでしょうか?
こんばんあ!しつもんだお! for nextの後にcallでquerytable.addすると処理固まってしまうのですが、どうすれば良いですか?メモリとかバッファとかよくわかりません
すいません。 VBAで32bit符号無し演算をしたいんですが、型がlongじゃダメです。(当然) どんな技を使えば良いですか?
>>596 Part17で似た質問をして、カラーパレットをクラスモジュールを使って作成したことがあります。
できてはみたものの、クラスモジュールはよく分かりませんでした。
VBやC#なら、どのイベントにどのプロシージャを結びつけるかをプロパティウィンドウで
簡単に設定できるようになっています。
VBAではそういう使い方は向いていないのではないか、と思います。
602 :
596 :2012/03/12(月) 21:49:46.96
>599 Long型でユーザー定義変数を作成し、 LSetステートメントで強制的に2つのLong型に分割。 2つのLong型を下位32bitと上位32bitで別々に計算し、 計算後に改めてCurrent型にLsetステートメントで合体。 という方法がある。 「VBA currency型のビット演算」でググるとよろし。
Excel2010 bookname = "D:\data\backup\data_xxxxxxxx.xlsx" xxxxxxxxxx は作業日付 Worksheets("data").Copy With ActiveWorkbook .SaveAs Filename:=bookname .Close End With としてdataシートを別ブックに保存しようとすると、このシートには Activateになった時に作業をするモジュールがついていて xlsxでは 保存出来ないとExcelに言われてしまうんですが。。。 保存する際にモジュールは要らなくデータだけで良いんですけど どうすればモジュールを切り離して保存出来るんでしょうか?
>>605 今、手元にExcel2010が無いんで自信ないけど、
.SaveAs Filename:=bookname, FileFormat:=xlOpenXMLWorkbook
とかでどうだろ?
明日会社行けば試せるんだけど・・・
607 :
605 :2012/03/13(火) 19:59:10.22
すごい! 出来ました。 そのFileFormat指定は初めてです。 ありがとうございます。m(__)m
はろー。ループするとき処理待ちするにはどうすればいいですか?
「こんばんわ、処理町隆史です」という。
おれがずっと探し求めていたのはジャーマンスープレックスもといドゥーイベントカンスーだったようだ…
OS:XP Home 32bit Excel:2003 条件を満たした場合、ソースコード自体を書き換える事は可能でしょうか?
>>605-607 Application.DisplayAlerts = False
でいいんじゃないのか
>612 できるけど、OSやExcelのバージョン違いに対する対応なら #If〜#Then〜#EndIfや#Constの条件付きコンパイルを使うほうがよい。 どうしても書き換えしたいなら、参照設定で 「Visual Basic for Applications」に参照設定をすれば VBEのコードそのものを直接VBAで動かせるようになる。
>>613 Application.DisplayAlerts = False
↑
これは単にメッセージ出すのを抑制するだけですよ?
>>615 xlsxで保存したらマクロは保存されない
警告なしで保存できるんだからそれでいいだろ
>>613 ,616
なるほど。そういう手もあったんですね
>>615 ↑
お前がずれてますよ
605もアホだがエスパーすると…
…
…
…
警告なしに保存したいということだろ
だからDisplayAlerts=Falseが合っている
FileFormat指定が的外れ
警告はxlsxで保存するとマクロは保存されませんよ
ってことだからな
619 :
586 :2012/03/14(水) 01:29:08.85
とりあえず、「Copyメソッドが失敗しました」のエラーが起こる簡易版のファイルを
作成しました。
http://www.vivi-loda.mydns.jp/index.php?m=dp&n=file1526 DLkey:asd
test1の方で実行しても、test2で実行しても、
こちらの環境(Win7 HomePreminum SP1(32ビット版)、Excel2003 SP3、メモリ3G)
だと、44シート追加したあたりで、当該エラーが出ます。
このファイルだと、マクロではエラーが出るものの、手作業でシート
追加はできますが、とりあえずこのエラーを回避したいです。(できるものなら)
ちなみにこのマクロを実行すると、一時的にPCが重くなったりするので、お気をつけください。
よろしくお願いいたします。
>>619 自分の環境ではエラーにならない
Win7 Ultimate SP1 (64bit) メモリ8GB、Excel 2007 SP2
>>619 Vista Ultimate SP2 32bit Excel2007 SP3もエラーなし
ちなみにシート500まで追加させても問題なし
2003の問題か、PCの問題だな
昔ディスプレイドライバー辺りのバグでExcelでメモリ不足出たことあったが
つかWin7でExcel2003とか動作保障あるのか
>>619 流れ読んでないけど、ワークシートのコピーは複数回実行するとマクロでなぜかエラーになる現象がある。
標準のワークシートをコピーする関数を使うのはやめて、「ワークシートを追加→セル全体をコピー→ペースト」
という関数を作っておくと楽。
623 :
622 :2012/03/14(水) 04:19:36.65
ちなみに
>>619 のファイルを実行したらうちの環境
・Win7 Ultimate XP SP3 / Excel 2003 SP3 / メモリ3G
・Win7 Ultimate SP1 x86 / Excel 2003 SP3 / メモリ3G
・Win7 Ultimate SP1 x64 / Excel 2003 SP3 / メモリ8G
でも「実行時エラー '1004':
Worksheet クラスの Copy メソッドが失敗しました。」は出ます。
(エラーが発生する回数はランダム)
念のため確認ですが、手作業で「シートの追加」はできても「シートのコピー」はできないですよね?
で、ファイルを開き直すといったん復活して、再度実行すると同じ感じでエラーになる(毎回エラーに
なる回数は違う)ってやつですよね?
というよりか、マクロを使わないでも手動で何十回もシートをコピーすると、シートがコピーできないが
シートの追加はできるという現象は発生します。標準のシートコピーは使わないのがよいと思われます。
でも、この現象ってExcel 2007だと発生しないのか。知らなかった。
624 :
622 :2012/03/14(水) 04:22:25.46
Win7 Ultimate XP SP3ってなんだ?そんなOSネーヨ(^_^;) Win XP SP3の間違いです・・・。
外部音源やMIDIデバイスを使わずにbeep音をディストーションギターの16和音にするにはどうすればいいでしょうか
縦のrangeを横のrangeにコピーするにはどうすれば良いですか
範囲指定して数値のセルのみ抽出するにはどうすれば良いですか
do loop 内の処理で繰り返した回数を得るにはどうすれば良いですか
googleでdo loopって打ち込んだら画面が回ったwww
どう書けばよいでしょかお?
Dim count as Integer Do While true count++ Loop
++は使えなかったかも Dim count As Integer: count = 0 Do While True count = count + 1 Loop
あ、成る程ですthx
639 :
612 :2012/03/14(水) 22:30:17.63
>>614 ありがとうございます
レスを参考に調べてみます
640 :
デフォルトの名無しさん :2012/03/14(水) 22:55:04.43
VBAだけで就職先はあるのでしょうか? Javaなどは募集をよく見ますが… あとVBAとJavaは皆さんどのくらいでできるようになりましたか? 専門学校で学んだのですか?
>>640 VBAだけで就職は無理
Excelが使えるって条件の事務職員の募集なら見たことあるけど
グラフの縦軸の値の最大、最小、目盛の間隔は自由に決めることはできますが、横軸もできますか? Excel2003、2010どちらでもいいので、できるならばやり方を教えてください。 よろしくお願いします。
>>643 縦でも横でもやり方は同じ
軸を右クリックすれば設定画面が出る
__
, ‐' ´ ``‐、 / ̄:三}
. /,. -─‐- 、. ヽ / ,.=j
_,.:_'______ヽ、 .! ./ _,ノ
`‐、{ へ '゙⌒ `!~ヽ. ! /{. /
`! し゚ ( ゚j `v‐冫 , '::::::::ヽ、/ そんなことよりネコ投げようぜ!
. {.l '⌒ ゙ 6',! / :::::::::::::::/ __
. 〈 < ´ ̄,フ .ノー'_ , ‐'´::::::::::::::;/ (_ノ)‐-、
. ヽ.、 ` ‐", ‐´‐:ラ ':::::::::::::::: ;∠. ヽ_} ゙ヽ
,.r` "´ /:::::::::::::::::::ィ´ `ゝ !、 /
/ / :::::::::::::::: ;な /´\ / r'\
. i ! ::::::::::::::/ る | .!::::::::/ヽ、.._!ヽ. ヽ、
{ {:::::::::::;:イ / し ‖i:::::::/:::::::::::::/ \
. ヽ ヽ,.ァ‐'´ /ヽ ま ,/`ヽ、::::::::: /
http://i.imgur.com/iMDi4.jpg
>>644 こんな時間にレスありがとうございます。
今2010でやってるのですが、右クリックすると軸の書式設定というメニューが
出るのですが、縦軸と横軸では項目内容が違っています。
横軸では、最大、最小、値の間隔はないです。
見てるところが違うのでしょうか?
>>646 グラフの種類によっては変更できない
たとえば散布図だとどっちの軸も同じように設定が変えられる
>>642 そのExcelが使えるってどの程度のレベルの使えるなの?
男でもある?
>>647 ありがとうございます。
散布図で何とかできました。
VBAが使えるといえば普通は Oracle SQLが使えるというのも含む
VBAが正しく使えれば DelphiだろうがJavaScriptだろうがJavaだろうがCだろうが そんなに難しくない筈 むしろVBAのほうが難しいくらいかも ただSQLはちょっと毛色が違うからVBAが使えることとSQL が使えるということは同じだとは思わないほうがいいかも
vbaで使うデータベースはなにが良いのですか?いまはシートにデータ並べてますけれど
ググってきたら
>>625 波形を気合いで計算してWAVの頭の構造体を気合いでくっつけてdirectsound8
>>653 一番相性がいいのはもちろんAccess
こんにちあ! コード書き終えたの ですけど12時間以上処理してるの でアドバイスくれし
コードを載せろよ
>>657 ScreenUpdatingとか、よくある高速化テクニックは使ってる?
XP/Excel2000 csvファイルを出力させたいのですが、見よう見まねで固定のファイル名が出せるところまでは辿り着きました。 次にファイル名をセル参照なり変数でつけたいのですが、どうしたらいいでしょうか? Private Sub CommandButton1_Click() Const cnsFILENAME = "\test.CSV" Dim FSO As New FileSystemObject Dim TS As TextStream Dim GYO As Long Dim GYOMAX As Long GYOMAX = Range("C65536").End(xlUp).Row Set TS = FSO.CreateTextFile( _ Filename:=ThisWorkbook.Path & cnsFILENAME, _ Overwrite:=False) GYO = 3 Do Until GYO > GYOMAX TS.WriteLine FP_EDIT_CSVREC(GYO, 2, 3) GYO = GYO + 1 Loop TS.Close MsgBox "OK" Set TS = Nothing Set FSO = Nothing End Sub
>>660 Dim cnsFILENAME As String
cnsFILENAME = "\test.CSV"
とか
cnsFILENAME = Range("C5").Text
とか
とりあえずscreenupdating使って見たんだけど、最小化してまた大きくしたら画面真っ黒になっちゃったよ 進行状況だけ表示しとけばよかったかなあ
関数をワークシートにたくさん埋め込んでいるんだったら、作業中はOffにして作業後にOnに戻す これはかなり効く(たくさん埋め込んでいたらの話だけど)
どうやってoffにするのですかお
もしかしてワークシート最小化にしてたらマクロ処理しないのですかお
まずモニターのスイッチを切れ
>>665 マクロの記録やってみれ
Excel2010では↓のようになった
Application.Calculation = xlManual
↓もとに戻す
Application.Calculation = xlAutomatic
画面更新ができないような処理してるからだと
>>640 VBA初心者レベル、Excelは基本操作もおぼつかない
当然ながらブラインドタイプとかはできないし、
ほかの言語などもまったく分からない。
というレベルで
週5日*1日8時間*時給1800円の仕事してます。
作業内容は一日分ずつのCSVファイルを一か月分にまとめたり
それをグラフにしたりするだけです。
チョー楽だけど退屈です。
そういうことを出来るようにしてくれた人がいたってだけでしょ
どういうこと?
金で時間を買われてるな
初心者っていう人がVBAでそういうことを出来るようにすることが出来るのかなって感じなんだけど
>>672 時間を売って金を得て
金を使って時間を買うということ?
ノルマこなして、お金もらってるだけでしょ
676 :
669 :2012/03/15(木) 21:56:00.37
>>673 会ったこともない誰かが作ったマクロを使ってます。
ところどころパラメータ(セルの行とか列とかの指定)を書き換えて実行するだけです。
>>675 ノルマは特に無いです
というかむしろ早く終わりすぎたらマズイらしくて
一年かけてダラダラやってます。
VBA使って効率化出来るのを目の当たりに見ると怒る人がいる、世の中だからね コンピュータで処理できるようにしたのに、 コンピュータが勝手に作ってる とか、言われたときは...
結局669はVBAを使ってはいるけれど プログラミングの仕事ではないってこと?
681 :
676 :2012/03/15(木) 22:09:47.46
>>678 一応、仕事の名目は
エクセルでのデータ整理です
>>679 公務員じゃないけど似たようなもんです。
業務の成果は求められてなくて、
ただ単に労働時間分の拘束をされてるだけって感じです。
>>680 ちゃいまっせ、ホンマにちゃいまっせw
マクロの記録てこういうときにつかえるんだなあみつを
ちょこっとわからない程度なら、部分的にマクロ記録のコードコピペしてます。 スピードも全く問題ないことがほとんど、使えなかった頃より実質こなせる業務がかなり増えた。
684 :
586 :2012/03/16(金) 05:51:54.44
忙殺されて、、、レス遅くなってすみません。
>>620-
>>624 皆さん、ありがとうございます。
会社のPC(WinXP Pro SP3/Excel 2003 SP3/メモリ2G)
でもやはり44シート目で実行時エラーでした。
手持ちのもう一つのネットブック(Win7 32bit版/Excel2010/メモリ1G)
で試したら、エラーは出ず、なんと、500シートでも動きました。
2003のバグですかね。。
ありました・・・これですね。
http://support.microsoft.com/kb/210684/ja -------
ブックに定義済みの名前を付けて保存したり、次のサンプル コードのように、ブックを閉じることがなく複数回ワークシートをコピーするとこの問題が発生することができます。
-------
発生することができます・・って・・・・
685 :
586 :2012/03/16(金) 05:52:55.59
>>623 ええと、マクロ実行して、1004が出たての未保存のブックは、シートの追加はできても、シートのコピーはできません。
(エラーも出ず、一瞬画面がブレたようになって無反応)
いったん、保存して開きなおしたファイルだと、シートのコピーはできますが、再び、マクロを実行すると、
実行時エラー'1004':
シートの名前をほかのシート、Visual Basic で参照されるオブジェクト ライブラリまたはワークシートと同じ名前に変更することはできません。
となって止まり、
ブックをみると、test1を押した場合は、「テンプレ(2)」を、test2を押した場合は、「テンプレ2 (2)」のシートを追加しようとしてるところで、また同じ名前で追加しようとして、止まってる感じ・・・
ActiveSheet.Name =
がうまくいってないような感じです。
しかもエラーの回数はなんか毎回、44です。。PCに他にどんな重い処理をさせていても44。。会社のPCもそうでした・・。
なんだコレ・・私のやり方が何かおかしいのか・・・
686 :
586 :2012/03/16(金) 05:55:19.72
687 :
586 :2012/03/16(金) 05:56:10.36
そろそろ眠い・・・
しかもこの仕事を引き継ぐ人がマクロとか難しくて嫌だから、手作業でやりたいと言い出して、
このマクロは使われない可能性が高くなってきた・・・
中身なんて知らなくていいから、黙ってボタン押せっつーの!くそ・・・!
でも自己満で作るけどさ。
事務の世界っていつもこうなる・・・やっぱり私に事務は向かないのか・・かと言って、バケモンだらけのPGの世界ではこれ以上やってく自信がない・・・
>>677 あるあるあるあるあるある
=Exact() で簡単に同じかどうかのチェックなんて出来るのに、「目視確認でやった方が確実だから、目視でやって」、とか ┐(´д`)┌
チラ裏すみません。眠いです・・・
689 :
デフォルトの名無しさん :2012/03/16(金) 09:49:02.14
Valueエラーが出るけどどこが悪いか分かる方いますか? Function sealtime(A As Range, B As Range) 'Application.Volatile '自作関数を自動再計算させます。 Dim time As Double time = Application.WorksheetFunction.ATAN((B - A) / 1) If time < 0.005 Then sealtime = "OK" Else sealtime = "" End If End Function
とりあえず Application.WorksheetFunction.ATAN より Atn のほうがいんじゃね
691 :
デフォルトの名無しさん :2012/03/16(金) 10:30:21.14
>>689 ワークシート関数が全部VBAで使えるわけじゃない
692 :
デフォルトの名無しさん :2012/03/16(金) 11:13:02.48
ダブルクリックで画像を挿入したくてネットで調べて色々コピペして作ったんですけどたまにエラーが出ます あと画像を開こうとしてキャンセルすると『1004 指定したファイルが見つかりませんでした』って出ます どこを直せばいいでしょうか お願いします Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim myRange As Range Set myRange = Range("C2:G10,C312:G21,C24:G32") If Application.Intersect(Target, myRange) Is Nothing Then Exit Sub End If Dim objFileName As String Dim objShape As Shape objFileName = Application.GetOpenFilename _ Set objShape = ActiveSheet.Shapes.AddPicture( _ Filename:=objFileName, _ LinkToFile:=False, _ SaveWithDocument:=True, _ Left:=Selection.Left, _ Top:=Selection.Top, _ Width:=242#, _ Height:=120#) Cancel = True End Sub
693 :
デフォルトの名無しさん :2012/03/16(金) 11:32:07.34
あ なんかいけたっぽい こうしたらスムーズになった sFile = Application.GetOpenFilename(FileFilter:="gif,.gif") If sFile = "False" Then Exit Sub
エクセル2003のグラフのことで教えてください。 グラフ上のマーカーの上にマウスカーソルを乗せるとデータが表示できますが、 その表示されたデータを取得することはできないでしょうか? もしくは、そのマーカーに対応するセルをアクティブにする方法でもいいです。 どなたか、よろしくお願いします。
>>694 マーカーに透明なラベルを被せたら余裕で何でもできる
for each でレンジ範囲の文字列数え上げるとき、数え残すことある?
count = 0 for each a in range("a1:e5) if("あほ"=a.value) then count =count +1 end if next a で、 for b =1 to a にしてるんだけど、bがバグる
さいごにnext bは入れてる
>>699 ○ For b = 1 To count
× For b = 1 To a
ああcountにしてるけどバグる
>>699 699がかなりあほってことでよろしいか?
bに同じ数続くことがあるのでする
マクロ記録をそのまま使ってる人いますか? やはり自分で全部書くのが普通でしょうか。
>>707 状況によるけど
そのままでは使い物にならないことが多い
ていうか、記録した方が早い部分と、自分で書いた方が早い部分とがあるので
うまく組み合わせた方が結果的に早くプログラムが完成する
>>696 >
>>694 > マーカーに透明なラベルを被せたら余裕で何でもできる
やり方教えてクレクレ
DOSのコマンドライン引数を取得できないの? Sub Workbook_Open For I = 0 To ARGC -1 Debug.Print ARGV(I) とか。
うっはwwwwwwいま気づいたんだけどもしかして時間かかる作業させるときってさいごにシート保存するコードとか入れたりするの当たり前だったりするわけですよねですよねえええ
713 :
デフォルトの名無しさん :2012/03/17(土) 00:11:35.15
あたりまえだ
ああもしかして指定時刻にセーブする処理とか入れてリスク管理してみたりするのかあああ
716 :
デフォルトの名無しさん :2012/03/17(土) 10:26:53.14
>>710 > DOSのコマンドライン引数を取得できないの?
>
GetCommandLine関数
719 :
デフォルトの名無しさん :2012/03/17(土) 14:02:53.16
Private Declare Function GetCommandLine Lib \\\"kernel32\\\" Alias \\\"GetCommandLineA\\\" () As Long Private Declare Function lstrcpy Lib \\\"kernel32\\\" Alias \\\"lstrcpyA\\\" (ByVal lpString1 As String, ByVal lpString2 As Any) As Long Sub Workbook_Open Dim sBuf As String strBuf = Space$(255) Call lstrcpy(strBuf, GetCommandLine()) Debug.Print strBuf end Sub
720 :
デフォルトの名無しさん :2012/03/17(土) 14:05:29.66
ごめん、p2で書いたら変な「\」がついちゃった Private Declare Function GetCommandLine Lib "kernel32 " Alias "GetCommandLineA" () As Long Private Declare Function lstrcpy Lib "kernel32 " Alias "lstrcpyA " (ByVal lpString1 As String, ByVal lpString2 As Any) As Long こうね
721 :
694 :2012/03/17(土) 22:07:32.08
グーグル先生ってすごい! クリックで値が取れた!
腐るからやめろよ
こんにつあ質問ですお A1-E1に1,2,3,4,5値が振ってあって A2-E2,A3-E3,....,A100-E100まで数値がランダムに入っています。 このとき各行を、それぞれ列の昇順で並べかえたい。つまりA2-E2,A3-E3,....,A100-E100とそれぞれ昇順に並べかえたいのですが、 そのとき1-5の値の対応を残したいのです。どうすればよいでしょうか!!
725 :
669 :2012/03/18(日) 17:09:54.42
>>722 私は正社員ですがパートさんも居ます。
ただ、求人かけてないので・・・
あと、あまり詳しく書くと特定されそうなので
もうこれ以上書かないことにします。
とりあえず大阪府も大阪市も一切関係ない民間企業です。
次の国会で青少年ネット規制法通すことにするわ 子どもたちを守るためには必要だよな
>>724 おりあえず、A2:E2 をソートしたいらしい。
>>724 とりあえずこれで皆の様子見てみて。
Sub Macro1()
' Version : Excel 2002 VB6.0
Range("A2:E2").Select
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight, SortMethod _
:=xlPinYin, DataOption1:=xlSortNormal
End Sub
たぶん要点は >そのとき1-5の値の対応を残したい だと思うんだが 具体的に何をどうしたいのかがさっぱり解らんな
え…わたしの説明…ヘタすぎ!?
んーとですねー 数値が入ってるセルを行毎に昇順で並び変えたときの、順番を取得しまして、 次にその順番を基準に、最初にセルがあった列番号を並べ変えてですね、 さらにそれにセルに入ってた数値を対応させたいのですけど、具体的にすればいいのかはわからなくて行を2行にするくらいしか思いつかないのですのでなにかよい方方法を教えてみて下さいマシマロ
何言ってんだかさっぱりワカンネ
ちゃんと説明しようとしない人間の質問に答える必要なし
下記の様に作成したテキストボックスのShape objectを変数shSelに代入し て、そこに文字列や書式設定をやりたい。 Sub mkTextBTest02() Dim shSel As Shape Set shSel = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _ 48#, 20 + 16 * lC, 10#, 16#) shSel.Characters.Text = lC '←$文字列を書く With shSel.Font '←$フォントの設定 .Name = "MS ゴシック" .Size = 9 End With shSel.ShapeRange.Line.ForeColor.SchemeColor = 1 '←$フォントの設定 End Sub ←$印の所でエラーが起きる。 .Characters .Font .ShapeRange は、class Shapeのpropertyでないから。 "ActiveSheet.Shapes.AddTextbox(〜).Select"として変数shSelの代わりに、 Selectionと書くとエラーが起きない。 class Shapeのproperty Characters,Font,ShapeRangeを指定するにはどうす ればいいでしょうか。
736 :
729 :2012/03/18(日) 21:59:27.07
こんな感じ? F-J は順列番号 BEFORE: A1 B1 C1 D1 E1 +-------+-------+-------+-------+------- 1 2 3 4 5 21 20 19 18 17 31 32 33 34 35 45 44 43 42 41 56 52 53 54 55 61 65 63 62 60 +-------+-------+-------+-------+------- AFTER: A1 B1 C1 D1 E1 F1 G1 H1 I1 J1 +-------+-------+-------+-------+-------+-------+-------+-------+-------+------- 1 2 3 4 5 1 2 3 4 5 17 18 19 20 21 5 4 3 2 1 31 32 33 34 35 1 2 3 4 5 41 42 43 44 45 5 4 3 2 1 52 53 54 55 56 5 1 2 3 4 60 61 62 63 65 2 5 4 3 1 +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
説明が分からないから答えようがないのかそれとも説明は分かるけれども態度が気に食わないから答えないのかもし仮に後者なら貴方こそレスする必要は無いし説明が分からないならば分からない箇所を指摘してくれれば返答できるのだが!!!
736まさにそれですそれを2行にするか1行に続けて書くか以外になにか案はありますかないのならば1行に続けて書いた方がスマートなんでそうしますが
元データの末尾に列番号を加える 元のデータ 12 54 . 8 23 36 これを 121.542 83 234 365 にしてから並べ替えれば、下1桁をチェックすれば元の位置がわかる
>>737 ちゃんと例を上げて処理をひとつずつ説明しろ
変な言葉遣い止めろ
なるほどおおおお0.0001とかにすれば誤差も出ないしいい感じですなあ
>>741 どんだけ低脳なんだよ
いいわけないだろ
ただ複数の値を保持したいだけなんじゃないのかよ
データ用と表示用で表を分けるとか
Idプロパティ使うとかすればいいだろ
Idなら、
A.Idを降るプロシージャ(1〜5)
B.それぞれの行を並べ替えるプロシージャ
C.IdとValueを入れ替えるプロシージャ
を作って、ABで並べ替えた後、
CBCで元の並びに戻る
あっはあidプロパティねthx!
真性か・・・
' ↑これを エクセルのシート上で ="'"&A1 と書くとセルA1の文字列の前に ' が 連結されるのですが VBAで dot = "'" Cells(A, 5) = dot & Cells(A, 1) と書いてもA5セルの文字列(A1の中身)の前に ' が 表示されずA5セルをクリックすると 上部のセルの中身が見れるバーには ' が文字列の前に 表示されています。 A5セルを他のセルにコピーしても 文字列だけコピーされて ' はコピーされません。 VBAを使って、文字列の前に ' を連結させたいのですが 良い方法ありませんか?
>>745 まず自分で調べろ
俺も知らなかったけど
ググったら載ってたぞ
いい加減にしろ!!
>>746 VBAのプログラムがおかしいかと
何時間も考えたけど
ぐぐったら1分で解決しました
ありがとう
>>735 以下の様に、変更するとテキストボックスをかけるようになった。
Sub mkTextBTest02()
Dim shSel As Shape
Set shSel = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _
48#, 20 + 16 * lC, 10#, 16#)
shSel.TextFrame.Characters.Text = lC '←$文字列を書く
With shSel.TextFrame.Characters.Font '←$フォントの設定
.Name = "MS ゴシック"
.Size = 9
End With
shSel.Line.ForeColor.SchemeColor = 8 '←$フォントの設定
End Sub
VB Editorのヘルプを調べてわかった。
各くオブジェクトのpropertyと、propertyのobjectを定義するclassの区別
がついていなかった。
C3に 11582.43、C4に11722.98という数字が入っています ワークシートで= =C4-C3とすれば、140.55という数字が入ります んで、VBAで同じように引き算で Cells(4, 5) = Cells(4, 3) - Cells(3, 3) とすると見かけ上は同じく140.55という数字が入っていますが、 上の関数入力するとこを見ると140.54999999 という数字になっています なぜ? この場合小数点以下三桁のとこで四捨五入しないとだめ?
>>745 "'"は、セルが文字列型であることを示す接頭辞だから消えてしまう。
Cells(5, 1) = "''" & Cells(1, 1)
と書くか。
しかし、Cells(6, 1) = Cells(5, 1) 頭に"'"あるCells(5, 1)をCells(6, 1)
にコピーすると、Cells(6,1)では頭の"'"は消えてしまう。
しかし、Cells(A,5)と言う書き方、間違っているのでは。
>>749 コンピュータで小数点以下を扱う場合は誤差がでることを考慮に入れる必要があるんだよ
ちなみにその計算式のセルを小数点以下20桁とかの表示にしてみ
>>750 >しかし、Cells(A,5)と言う書き方、間違っているのでは。
文法的にはAという変数でRowIndexを指定してる。間違ってはいない
まあ、意図したものと違うだろうって意味では間違ってるがw
>>751 とりあえず、数字を100倍して引き算をし、その後また100で割るようにしておきました。
sheetとsheetの結合ってどうやるの
しーとと しーとの けつごう
あのぉ…大量のデータをコピーしようとすると…リソース不足とでるんですが…
型が一致しません、というエラーをスルーして処理を続けさせるにはどうすればよいですか?
>>756 On Error Resume Next
758 :
デフォルトの名無しさん :2012/03/20(火) 19:43:41.75
BookB の全部をコピーして、BookA に貼り付けて BookB を保存しないで、コピーしたデータも 他に使わないで、ただ閉じたいんですが、どう書けばいいでしょうか? マクロの記録だと、ブックを閉じてしまうため、記録が残りません。
全部をコピーって具体的には? ぶっちゃけファイルコピーで済むようにも見える。
Workbooks("BookB").Close False
BBとか多い列数はどうやって数えますか?
762 :
デフォルトの名無しさん :2012/03/20(火) 21:50:35.25
column関数
if small (範囲,1)とするとエラーが出ます どう書けばよいですか
Application.Small
出来ねええ
>>761 かぞえなくても Cells(5, "BB") みたいに書けるからあんまり困らない
application.smallが上手くいかない件
多分それデータが悪い
オブジェクトが必要ですとでてくる
範囲って変数の型がRangeじゃないんじゃない? これで動いたぞ Dim 範囲 As Range Set 範囲 = Range("A1") Debug.Print Application.Small(範囲, 1)
set c = worksheets("a").range(cells(1,1),cells(1,2)) これどこちがう
>>771 エスパー能力を最大限に発揮すると思いつくのはこんなとこ
・シート名が"a"ではない
・セルの範囲が実は間違っている
・変数名がcではない
今日のエスパー養成所はここかっ!
アプリケーションの定義またはオブジェクトの定義のエラーですがでます
>>771 Set c = Worksheets("a").Range(Worksheets("a").Cells(1, 1), Worksheets("a").Cells(1, 2))
又は
Set ws = Worksheets("a")
Set c = ws.Range(ws.Cells(1, 1), ws.Cells(1, 2))
できますたwwwwありがとお
右クリックの動作を処理に応じて変えることはできませんかね? 例えば最初は通常の動作(ショートカットメニューを表示)、あるコマンドボタンを押してから右クリックすると条件付き書式設定のダイアログボックスを表示、また別のコマンドボタンを押すと通常のショートカットメニューに戻す
できます
779 :
デフォルトの名無しさん :2012/03/21(水) 11:58:38.03
activecell.address で"$"つきの番地が得られます。 $なしの番地はどうすれば取得できるのですか? そもそもなぜ$サインがつくのでしょうか?
>>779 replace関数で"$"を""に置き換えるといいです
>>779 ActiveCell.Address(False, False)
ヘルプを読めよ
式.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo)
782 :
デフォルトの名無しさん :2012/03/21(水) 14:58:10.99
ちょっと教えてほしいのだが 引数明示して書くとき、例えば下のケースだが Range(Cells(1, 1), Cells(1, 2)).Replace what:="111", replacement:="", MatchCase:=False これはすべて小文字で入力したんだがmatchcaseだけ修正されるのはなぜなんだ?
Microsoftだもの
MatchCaseにカーソル置いてF1押すと、Sort.MatchCase プロパティ が表示できる whatやreplacementだとキーワードが見つかりません。になる MatchCaseってプロパティと勘違いして補正されてると思われ
>>788 あーなるほど
理解した、ありがとう
しかしこれ気になるよな
ただ、直すのも面倒なんだよな
>>778 遅くなりましたが出来ました。
もう一つ質問なのですがCtrlキーを押しながら任意のセルを選択した時、そのアドレスを全て取得するにはどうすればよいのでしょうか
例えば、A1、A3、A7、B1、B2、B4、C3、C4、C5を選択した時にこの9個のアドレスを取得したいのです
>>792 Application.Selection
794 :
792 :2012/03/23(金) 16:17:34.92
debug.print application.selection.address
条件付き書式を設定したセルをアクティブにして これ以外のシートの内容を下のマクロで消すと表示がおかしくなるんだけど なぜなんだ?? sub test worksheets(2).cells.delete end sub 条件書式以外にもindirectを使ったセルでもおかしくなる
worksheets(2)を参照してたからじゃないの?
798 :
792 :2012/03/23(金) 18:16:57.46
Dim Sel_Addr As String Sel_Addr = Application.Selection.Address としたら取得できました。
いちいちそんな報告いらん
>>797 参照って
=Sheet2!A1みたいに使ってるかってことか?
なら使ってない
表示がおかしいって書いたが、アクティブセルの囲い線が残るような感じ
>>800 単なるバグじゃないの?
ScreenUpdatingをFalseにしてからworksheets(2).cells.deleteしたらいい
formの表示中に自由にセルを選べるように したいのですが・・・
vbModeless
>>804 Thnx
モードレスで、表示すればよいのでは?
UserForm1.Show vbModeless
とか
UserForm1.Show 0
807 :
デフォルトの名無しさん :2012/03/24(土) 16:38:43.39
A1とかセルの座量をべた書きするんじゃねーよ セルに名前を付けて名前経由で座標を指定しろよ ソース解析&改造しててやりにくくてしかたない
複数のCSVファイルを1つにしたくて
調べたら
以下のサイトが参考になったので
ttp://ziddy.japan.zdnet.com/qa3168255.html?order=DESC&by=datetime Sub CSV結合()
Const CRFILE As String = "C:\My Documents\test2"
Dim obj As Object
Dim arg As String
Set obj = CreateObject("Shell.Application") _
.BrowseForFolder(0, "SelectFolder", 0)
If obj Is Nothing Then Exit Sub
arg = obj.self.Path & "\*.csv "
Set obj = Nothing
Call Shell(Environ("ComSpec") & " /c copy /b " & arg & CRFILE)
End Sub
とやっているのですがうまくいきません。
フォルダ選択の画面はでてくるのですが
C:\My Documents\test2
に結合されたCSVファイルができるはずですが、できなくて。
ソース間違ってますか?
エクセル2007です。
書き出すファイル指定が間違ってるかと思い Const CRFILE As String = "C:\test2" Cドライブ直下にtest2フォルダ作ってみてもだめでした
Shell関数に渡しているコマンドライン文字列を確認したら? とりあえず、空白を含むパスはダブルクォートで囲まないと駄目だ。
>>808 Const CRFILE As String = "C:\My Documents\test2.csv"
で出来たけど?
>>807 こめんなさい。心当たりが沢山ありすぎてもう…
>>810 コマンドライン文字列とはなんですか?
他にCSVファイルを2個作ってみたけどだめでした。
>>811 拡張子つけたけどだめでした。
>>812 XPでエクセル2007です
ソースをステップ実行させても
全部の行を実行してるのに
なんだろうこれは・・・
Const CRFILE As String = """C:\My Documents\test2.csv"""
> XPでエクセル2007です そう来るかw
>>775 これで指定したレンジ範囲の数値を、小さい順に並べた場合の各々の差が、x以上であるとかx以下であるといった判定をするにはどう書けばよいですか!
>>818 IsNumeric関数とIfステートメントを使う
詳細はヘルプを読めばわかる
isnumericじゃできなくね?
数値かどうかの判定に必要だと思ったんだけど、不必要だと思ったなら使わなくても何ら問題ない 強制力なんかないからね
if a1>a2+x>a3+x thenが上手く動かないのだが、なぜか?
>>822 if a1>a2+x and a2+x>a3+x then
これがa3までじゃなくa100まである場合、どうすればいい?
誤り if a1>a2+x>a3+x then 訂正 if a1>a2+x>a3+2x then
そうか全組み合わせの差の絶対値の最小値がx以上ならいいわけか しかしx以下の場合を求めたいときはどうすればいい?
何だVBA力のおっさんか
>>824 アンダースコアを使えばステートメントを複数行に分けて記述することができる
例えばこんな感じ
If 条件式1 And _
条件式2 And _
条件式3 And _
条件式4 And _
既にスレチなので
>>2 をよく読んでくれ
例えば処理したい「実行1」というプロシージャがありあまして。 call 実行1 で普通に処理されるのですが。 Dim moji As string moji = "実行1" call moji は当然ですが実行されません。ですが、何かプロシージャそのものを変数化させて 状況に応じて呼び出せるようにする方法があるでしょうか? ユーザーフォームのリストボックスに何十種類ものプロシージャがあるのですが、それらを 効率的に場合わけして処理するのに、それが出来ると便利なのですが。 方法はないのでしょうか?
>>830 Application.Run ThisWorkbook.Name & "!" & moji
普通は Call ほにゃらら(moji) ってやって、ほにゃららの中でmojiによって分岐するようなプログラムを書くもんだけど
ifとかselectでそれらを場分けしてcallする処理を1個用意すりゃ良いじゃん つか普通そうする プログラミングの手法とかそういう話だから後はそういうスレで聞いてくれ
あ、リロードしないのが自分の悪いクセだな…
>>831 ありがとうございます。
>>832 実はそのように、select で、分岐していたんですが、数が多くなりすぎて。
ただ、selectの分岐がいくら多くなっても、速度とかに影響するという
わけでもないので、良いといえば、良いのですが、スマートにできないかと
気になってしまいまして。
for i=1 to n if a(i-1) - a(i) <= x then y= false next I
a列とb列の相関を調べたい
VBA使う必要ないけど
複数のCSVファイルをひとつのXLSファイルへまとめるにはどのようにしたら効率がよいですか? 20120201.csv 20120202.csv ・・・ 20120228.csv というファイルを201202.xlsファイルにまとめたいと考えています。 (シート名を01,02,・・・,28にして、1bookに28シートが出来上がるイメージ)
>>838 ご自身のコーディング速度と手作業での速度を比較してみればどちらが効率がよいか一目瞭然です
1回限りの作業であれば手作業でやるのが一番効率がよいでしょう
ExcelVBAに関係がない話題なのでこのへんで終了
配布物にExcelを利用したいのですが
配布物の中の別のファイルの情報を取得する場合
ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_140.html で相対パスだと危険があるとあったのですが
ThisWorkbook.Path & "\..\date\ファイル名"
のようなやり方だと階層をまたいでも中をいじられない限り
どんな環境の人が使っても問題ないと思っていいのでしょうか
それと、相対パスで一つ上の階層に行くやり方で
Dim mPath As String
mPath = ThisWorkbook.Path
i = Len(mPath) - Len(Replace(mPath, "\", ""))
If i > 1 Then
mPath = Mid(mPath, 1, InStrRev(mPath, "\") - 1)
End If
というやり方が紹介されていたのですが
これは..に対して上に階層があるのか調べる機能が付いただけ
という認識でいいのでしょうか
>>840 お前の認識間違えてるぞ
アホ
ちゃんと読め
>>840 すべてにおいて見当違い
手始めに「相対パス」がなんなのか理解してきた方がいい
>>839 一回限りの作業ではなく、毎月発生する作業です。
現在は
新しいブックに開く→シートの移動
を繰り返すコードにしてるのですが、
見るからに効率が悪くなっています。
>>842 相対パスって基準から見た位置ですよね
URLのは基準を指定しないとカレントフォルダからになるから危なくて
ThisWorkbook.Pathで基準をブックのある位置を指定すれば問題ないのかなと思ったんですが
>>843 検索すれば、参考になるコードいくらでも出てくるだろ。
Dir 関数使えばいいんじゃない。
>>843 見るからに効率が悪いことに気づいてるんだったら改善すればいい
>>844 「危ない」とか「問題」ってのは具体的にどういうことなの?
具体的に説明してくれないと誰もわからないよ
>>847 「絶対的基準に基づいてないから危ない」とか言い出すぞw
>>844 もう一回お前のリンク先読み直してから来いよ
音読な
>>838 ,840
Excelどうこうよりも、まず日本語の読み書きを勉強した方がいいと思う
社会人になってから苦労するよ?
EXCEL VBAは基本的にはオブジェクト指向言語。
だからJAVA, C++と同様にクラス間の継承もあるが、EXCELで予め定義された
既存のクラスのみでその関係があり、↓ここを見るとプログラマが定義する
マクロのクラスで、継承関係にあるものを作ることはできないみたい。
http://members3.jcom.home.ne.jp/daruma_kyo/aboutooa/vba_limit.html 既存のクラスの継承関係。例えば、collection WorkSheets,Chartsは、
collection Sheetsを継承している。
ActiveWorksheetでその時にカーソル(focus)を当てているものを示す、
property Selection。
その時にカーソルを何に当てているかによって、Selectionのクラスが、
Range, Shape, ChartAreaなどに変化しているみたい。
このproperty Selectionを定義しているクラスは、多分、あらゆるクラス
の継承元になっているclass "Object"でないかと思っていますが、
どうなんでしょうか。
複数の行の挿入が面倒くさかったのでVBAを学んでみようと思ったのですが試しに作ったマクロが Sub 行の挿入() Dim i As Integer i = 1 Rows("i:2").Insert Shift:=xlDown End Sub 型が違うと出てきます iの定義が間違ってるのかと思うのですが LongやVariantなども試したもののだめで、整数値で型が違うといわれるのもなぜかわかりません 初歩的で申し訳ないですが教えてください
>>854 “Rows”の上にカーソルを置いて[F1]キーでヘルプを開いて読め
>>852 >EXCEL VBAは基本的にはオブジェクト指向言語。
VBAはもともとオブジェクト指向ではない言語をオブジェクト指向に拡張した言語(の派生)
オブジェクト指向言語だと言いきるには不備が多い
>既存のクラスの継承関係
基本的に継承関係は保障されているわけではない(と思う。保障されてるならソース教えてくれ)
つまり(Setによる代入で)キャスト出来るかどうかは実行してみないと解らない
>ActiveWorksheetでその時にカーソル(focus)を当てているものを示す、property Selection。
ActiveWorksheetなんてクラス(型)はない。WorksheetにはSelectionなんてプロパティはない
>Selectionのクラスが、(略)変化しているみたい。
Selectionなんていうクラスも無いのは理解できてるのか?
(Windowクラスの)Selectionの戻り値の型について、Object型で実際はいろんな型が戻されるんだぞ
>このproperty Selectionを定義しているクラスは、
Selectionなんてクラスはないし、Selectionプロパティを実装(定義)してるクラスはどんな型だろうと関係ない
問題はSelectionプロパティ(の戻り値)の型
>あらゆるクラスの継承元になっているclass "Object"でないかと思っています
VBAにはObjectという型はあるが、Objectクラスというクラスはない(はず)
Object型にはあらゆるクラスが格納できるが、それは全てのクラスがObjectから派生してることを意味しない
なぜならVBAは純粋なオブジェクト指向言語ではないから
>>857 > 基本的に継承関係は保障されているわけではない(と思う。保障されてるならソース教えてくれ)
> つまり(Setによる代入で)キャスト出来るかどうかは実行してみないと解らない
できない例は?
>
>>857 class, object, collection, propertyの概念の区別がきっちりできていな
いです。
>>Selectionなんてクラスはないし、Selectionプロパティを実装(定義)してるクラスはどんな型だろうと関係ない
object browserで見ると、Selectionはobject Applicationとobject Windows
のmember(property)になっているみたいです。
これのヘルプを見る。
>>Property Selection As Object 読み取り専用
>>Selection プロパティ
>>Application オブジェクトでは、アクティブウィンドウで現在選択されて
>>いるオブジェクトを返します。
>>Windows オブジェクトでは、指定されたウィンドウで現在選択されている
>>オブジェクトを返します。
>>オブジェクト指向言語だと言いきるには不備が多い
↓参考
http://sites.google.com/site/compositiosystemae/home/vbaworld/upper/exp3/polymorphi VBAのclass moduleでクラスを定義するとき
クラスの構築子(constructor)に当たるもの Class_Initialize()
クラスの消滅子(destructor)に当たるもの Class_Terminate()
構築子の引数はサポートされていない。
>>859 > class, object, collection, propertyの概念の区別がきっちりできていな
> いです。
できてないのはお前だけじゃないの?
なんかVBAがオブジェクト指向的に駄目だ駄目だって言う奴多いけど、 適切なところでclassモジュールを使って、VBAで使える範囲の機能を 使えばいいのにっていつも思う。 とか言うと、VBAじゃ適切なところなんてない的な話になりがちな気がするが。
この手の話を質問スレでしないで欲しい 自分の中で答え持っててそれを主張するだけなんだから
VBAスレはここだけしかないんだから、ここでいいだろ
864 :
862 :2012/03/28(水) 17:07:48.32
あ、これ質問だったのか ごめんよく読んでなかったは
ガキはすっこんでろ。
>861 はげどう。 継承だって工夫すればできるし、 コンストラクタの引数がないのも特別不便ではない。
オブジェクト指向厨は市ね。 VBAごときの小規模アプリに オブジェクト指向など無用だ。
工夫した継承はコード量が多く、結局オブジェクト不志向(データ志向っての?)に落ちついてしまう って事があったなーと、ふと思い出したっす。
ツールバー追加のマクロを組んだのですが、ブックを閉じるときに ツールバーを削除しようとするとエラーが出ます。 原因をご教示下さい。 コードは長くなるので分けて書き込みます。
Private Sub Auto_Open() Dim xlAPP As Application Dim objBar As CommandBar Dim objCont As CommandBarControl Dim objBtn As CommandBarButton Dim vntCaption As Variant , vntTipText As Variant , vntOnAction As Variant Dim IX As Integer Dim blnTRUE As Boolean Set xlAPP = Application vntCaption = Array("登録(&A)", "更新(&U)", "削除(&X)") vntTipText = Array("登録を行ないます", "更新を行ないます", "削除を行ないます") vntOnAction = Array("BTN_TOUROKU", "BTN_KOUSHIN", "BTN_SAKUJO") Set objBar = xlAPP.CommandBars.Add(Name:=g_cnsTITLE, Position:=msoBarTop) blnTRUE = False For IX = 0 To 2 Set objCont = objBar.Controls.Add(Type:=msoControlButton) objCont.BeginGroup = blnTRUE ' CommandBarButtonオブジェクトの参照を取得 Set objBtn = objCont objBtn.Style = msoButtonCaption objBtn.Caption = vntCaption(IX) objBtn.TooltipText = vntTipText(IX) objBtn.OnAction = vntOnAction(IX) blnTRUE = True Next IX objBar.Visible = True objBar.Protection = msoBarNoChangeVisible ActiveWindow.ScrollRow = 1 Set objBtn = Nothing Set objCont = Nothing Set objBar = Nothing End Sub
' 閉じる時の自動実行処理 Private Sub Auto_Close() Dim xlAPP As Application Dim objBar As CommandBar Set xlAPP = Application ★Set objBar = xlAPP.CommandBars(g_cnsTITLE) objBar.Delete Set objBar = Nothing End Sub ★の部分で 実行時エラー'5': プロシージャの呼び出し、または引数が不正です。 となります。原因と対策をご教示下さい。
>>871 g_cnsTITLEに該当するツールバーがないんじゃない?
>872 直接ツールバー名を指定したら無事動きました。 ありがとうございました。
>>868 Strategy Patternとか超便利なんですけど。
875 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/02(月) 20:03:26.77
動的に作成したCommandButtonにクリックイベントを 登録するにはどうすればいいの?
876 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/02(月) 20:29:50.48
Outlookで仕事で毎日送ってるメールがあるんだけど 本文で日付以外は全部一緒。 Templateで、日付もその日のが自動入力、って設定する方法はどうやりますか? マクロでもokです。
>>876 OutlookのバージョンとExeclのバージョンを教えて
879 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/02(月) 21:14:12.72
>>876 EXCELまったく関係ないのはスレ違いなんだが
outlook テンプレート 日付 でググって最初のページでも見てろ
どう考えてもこのスレに辿り着くより解法が載ってるサイトに辿り着く方が早いと思うんだけど 検索サイトを一体どんな風に利用しているんだろう?
>>875 WithEventsで宣言した変数に参照代入する
883 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/04(水) 17:49:54.34
A3の範囲に入っている数字が読めるように 列幅を大きくするとOKで 列幅を小さくして数字が##のようにすると Set C がNothing になってしまう、いい方法ありますか A2 = "gg50": A3 = "gg11:gg45" n = sh4.Range(A2) Set C = sh4.Range(A3).Find(Val(n), LookIn:=xlValues)
>>883 検索するときに列幅を広げて
検索が終わったら列幅を元に戻す
885 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/04(水) 18:14:12.91
わかりました、そーします ありがとう
だれかSQLでdecodeに当たるような関数をVBAで教えてくれ 調べてもreplaceしか出てこないんだ 内部処理で文字列を違う文字列として扱ったりしたいんだ
>>886 IIf関数かIf...Then...Else ステートメント
ちなみに標準SQLにはDECODE関数なんて無い
888 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/05(木) 11:11:06.09
889 :
886 :2012/04/05(木) 23:16:08.15
>>887 >>888 さんくす!iPhoneからだと規制されてて書き込めなかった
今日、現場の作業で活用させて頂きました
オフィス田中はNGにしてほしい
>>891 そんな有名なところだれでも知ってるから
すでに読んでる
↑ 自分が知ってることは他人も全部知ってるべきだと思ってる池沼
まぁ
>>888 みたいにリファレンスとして貼るならMSのサイトを貼れよとは思う
>>892 何が「誰でも知っている」だ。
俺はそんなサイト知らねえぞ。
お前のためにあるスレじゃねえから
自己厨レスはやめとけ。
>>894 マイクロソフトみたいな有名なところだれでも知ってるから
すでに読んでる
セル範囲を飛び越えて選択したいのですが Range("A1,B3")をRange(cells(1,1),cells(2,3))でやることってできますか? 試しにコンマ入れてみたけどできませんでした
>>897 Application.Union(Cells(1, 1), Cells(2, 3))
899 :
897 :2012/04/07(土) 00:47:26.65
できました ありがとうございます
オフィス田中は何ググッても出てくるよな
オフィス田中は数年前に行き着いたが間違い記事があり それを2,3年経っても放置している上に、自分と大差ないレベルらしく 読んでても新たな発見とか嬉しい驚きとか全然無いんで全く行かなくなった
MSDN一日中眺めてればいいよ
20年くらい前はそれでも全体見廻せたが いまそれやると一生無駄にすると思う
>>892 >
>>891 >そんな有名なところだれでも知ってるから
google検索なんか利用できないじゃん。有名なところしかヒットしない仕組みなんだもの。
シート2のA1:A30のデータをシート1の B2:B12,D2:D12、F2:F12 の用に3行に分けて張り付けたいときは FOR ....next で繰り返しするしかないのでしょうか? 何か一発で行けるようなスマートなやり方はないでしょうか?
>>905 B2:B12、D2:D12、F2:F12は3行じゃなくて11行だと思うけど?
一発じゃないけどループ使いたくないならこんなのとか
With Range("A1:A30")
Dim v As Variant
v = .Offset(0)
Range("B2:B12") = v
v = .Offset(10)
Range("D2:D12") = v
v = .Offset(20)
Range("F2:F12") = v
End With
>>906 >>B2:B12、D2:D12、F2:F12は3行じゃなくて11行だと思うけど?
確かに・・・
B2:K2、B4:K4、B6:K6の間違いでした。
シート2のA1:A30には不連続のデータが入っていて、
それのA1:A10をB2:K2に
A11:A20をB4:K4に
A21:A30をB6:K6にコピーしたいのです。
>906を試してみると一行に全ておなじデータが入ってしまいました。
>>907 コピペしたら?
Range("A1:A10").Copy
Range("B2").PasteSpecial Transpose:=True
Range("A11:A20").Copy
Range("B4").PasteSpecial Transpose:=True
Range("A21:A30").Copy
Range("B6").PasteSpecial Transpose:=True
>>908 やはりそうするのが無難ですよね。
別件なのですが、Findで検索してヒットしたせるから
10行目までの範囲を指定したい場合はどうしたら
いいですかね?
Offsetを使って色々しているのですが上手くいきません。
912 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/08(日) 13:54:16.86
教えてください。 OS:XP EXCEL:2007 ユーザーフォームを起動させると、言語バーの輝度が落ちてしまい日本語入力ができなくなります。 F8ポチポチでは再現せず…適当なポイントで止めても再現せず… 一旦エクセル落として開き直せば復帰します。 ユーザーフォームはクラスを使ったカレンダーフォームです
913 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/08(日) 18:30:01.65
Excel VBAは基本的なところ(セル・シート・ブック)は完ぺきにマスターしたのですが 苦手なのがサブルーチンをいっぱい作ってそれらを効果的に使う方法や、どうやって全体像を把握するのかや、 フォームを駆使して、それをどうやって標準モジュールと連携させるかとか、 変数についてローカル変数やグローバル変数をどう概念的に理解して使いこなすとか そのへんでつまづいています。 基本的なところ(セル・シート・ブック)は、入門書やすこしレベルが上のものでも、本やサイトでいいのがいっぱいありますが、 「サブルーチン」「フォーム」「変数」とかについてに特化した入門向けから上級者向けの本やサイトがあれば教えてもらえますか?
914 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/08(日) 18:48:40.75
個人用マクロ(PERSONAL.XLSB)を作っているのですが [X]で閉じるときもう一回押さないと閉じないんです。 これを回避する方法ありますか?
>>913 難しく考えすぎ。
「使いこなそう」などと考えるのがおかしい。
VBAはシートと関数で実現が難しい機能が
ある場合の補助手段。
フォームとか面倒くさい機能は使うな。
シートという立派なGUIがあるんだから。
あとルーチンも変数も全部Publicでいいから。
「完ぺきにマスターした」なんて書いてる時点で釣りなんだからスルーしとけ
919 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/08(日) 22:57:28.08
>913 えっと、そういうのはVB(VB6まで)の入門書を卒業するレベルならいいんだろうけど、 いまさらVB6の本はないからねぇ >914 アドインにすれば?
>>913 VBAの基本的な文法からきちんと勉強してみれば?
日経BP社の
Microsoft Excel VBA セミナーテキスト [2010/2007/2003対応]
なんてなかなか良い内容だと思ったけど。
>>912 自己解決したので報告
原因はfalseのままでメソッド終了させてたからだったみたい。最後にtrueで戻したら解決した。
お騒がせしました。
922 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/09(月) 01:09:31.32
質問があるのですが。 複数のエクセルファイルを開いている状態で。 ショートカットキーを使ってマクロを実行しているのですが。 アクティブじゃないエクセルファイルのマクロと競合すると言いますか、 他のも実行してしまう状況にあります。 ショートカットキーのキーを変えると作業の円滑さがなくなってしまうので 出来れば同じショートカットキーを使いながら、アクティブなエクセルに 入っているマクロのみを実行したいのですが。何か方法はあるのでしょうか?
924 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/09(月) 04:18:55.01
誰かわかる人いましたらよろしくお願いします。
エクセル2003なんですが、条件書式の色つきが3つまでしかできません。
10色ほどしたくて、ぐぐったらここに辿り着いて元となるVBAを見つけました。
ただ、これはシート1のA列が指定になっています。
これを指定の範囲ないにするにはどこをいじればいいのでしょうか。
例えばシート1のC1〜C10を範囲にするにはどうすればいいでしょうか・
http://qanda.rakuten.ne.jp/qa7116283.html
>>924 あんまり綺麗なコードじゃないけど、めんどくさいから最小限の修正で
Sub W()
Dim j As Long
Dim ws2 As Worksheet
Dim r As Range
Dim c As Object
Set ws2 = Worksheets("Sheet2")
Set r = Range("A1:A10") 'ここに色を付けたいセル範囲を書く
If Intersect(r, Columns(1)) Is Nothing Then Exit Sub
Application.ScreenUpdating = False
r.Interior.ColorIndex = xlNone
For Each c In r
If WorksheetFunction.CountIf(ws2.Columns(1), c) Then
j = WorksheetFunction.Match(c, ws2.Columns(1), False)
c.Interior.ColorIndex = ws2.Cells(j, 2).Interior.ColorIndex
End If
Next
Application.ScreenUpdating = True
End Sub
ちょっと訂正 1つ目のIfは削除しないと、A列にしか色が付かない 2つ目のIfもよく見たら不要だな Sub W() Dim j As Long Dim ws2 As Worksheet Dim r As Range Dim c As Object Set ws2 = Worksheets("Sheet2") Set r = Range("A1:A10") 'ここに色を付けたいセル範囲を書く Application.ScreenUpdating = False r.Interior.ColorIndex = xlNone For Each c In r j = WorksheetFunction.Match(c, ws2.Columns(1), False) c.Interior.ColorIndex = ws2.Cells(j, 2).Interior.ColorIndex Next Application.ScreenUpdating = True End Sub
まだVBAを扱って日が浅く、すみませんが教えて下さい。 390行目を超えると、 実行時エラー1004 WorkseetFunctionクラスのmmultプロパティを取得出来ません。 とエラーが出てしまいますが、最終行まで計算させる方法をご教示下さい。 Dim myA As Range Dim myB As Range Dim myC As Range Dim l As Long Dim m As Long Dim n As Long Dim lLoopTimes Dim i As Long Set myA = Range("Sheet1!D3") Set myB = Range("Sheet2!C2") Set myC = Range("Sheet1!DN3") l = 1 m = 111 n = 14 lLoopTimes = 1194 For i = 1 To lLoopTimes myGetMatrix(myC, l, n).FormulaArray _ = WorksheetFunction.MMult( _ myGetMatrix(myA, l, m), _ myGetMatrix(myB, m, n)) l = l + 1 Next End Sub
>>927 Sheet1かSheet2のどこかに数値の入ってないセルがあるんじゃない?
>>927 そのプログラムだと、Sheet1!D3:DJ1196とSheet2!C2:P112が計算に使われる
この範囲内に数値の入っていないセルとか結合されたセルがあるとエラーになる
>928 >929 チェックしてみましたが空白は無い様です。 また試しに、ループを外し、 l = 300、l = 600とマクロを300行分ずつ書き換え、順次実行していくと問題無く最終行まで行きました。 出来れば1つのマクロで終わりにしたいのですが、 何か良い方法はありませんでしょうか・・・。
931 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/09(月) 09:50:47.36
フォームモジュールのところにちゃんしグローバル変数を Public inTest As Integer と宣言してるのに 標準モジュールではその変数を使えないのはどういうこと? 別の標準モジュールにならPublic inTest As Integerと宣言してたら使えるのに。
932 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/09(月) 09:56:43.94
逆に標準モジュールでPublic inTest As Integerと宣言してれば フォームモジュールではinTestの変数は使えるんですよ。 おかしくね?
933 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/09(月) 09:57:37.34
さらにThisworkbookモジュールでも上記と同様のことが。 ということは標準モジュールが一番えらいの?
カンマ区切りのCSVファイルの読み込みで、セルG2を先頭にして読み込むとか する方法ってありますでしょうか? 普通に読み込んで行列を挿入しているのですが、スマートな方法があれば教えて下さい。 環境はwinxp+Excel2003です。 宜しく御願いします。
935 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/09(月) 10:20:15.49
個人用マクロにFunctionを書いても 普通のWorksheet関数として使おうとしても使えないんですけど。 どうやれば使えるようになりますの? (普通にシートにFunctionを書けばそのシートではWorksheet関数として使えるけど) ヤバくない?
>>934 行列を挿入するよりカトペの方が手間は少ないのでは
「テキストファイルの読み込み」を使えば好きな場所に読み込めるけど、位置を決めるまでに何度も「次へ」ボタンを
押さなきゃいけないからあんまりスマートとは言えないような気がする
一発で処理したいならマクロ
938 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/09(月) 11:35:10.56
>>973 さっきから出ている「アドイン」とは何でござるっすの?
>>938 Excelのヘルプで「アドイン」で検索するか、各種検索エンジンで「Excel アドイン」で検索したらいいと思うよ
>>924 ここで条件によってExit Subしてるから、C1〜C10の範囲じゃなければExit Subするようにすればいい
If Intersect(Target, Columns(1)) Is Nothing Then Exit Sub
グラフとかのオブジェクトを削除した時に、マクロを走らせたいのですが どのイベントを使えばいいのでしょうか? どなたか教えて下さい。
>>942 残念ながらありません
監視する仕組みを自作するしかありません
944 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/09(月) 15:04:28.95
>>931 フォームでPublic宣言したものは
フォーム.変数名
で使える。
標準モジュールのは
標準モジュール.変数名でアクセスできるが
省略できるだけ
ユーザー定義変数って、入れ子にできるんだね。 かなり便利だ。
946 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/09(月) 23:07:19.96
エンターキーが押されたらマクロが走るようにしたいのですが、 ブック全体?でキーを受け付ける方法はないでしょうか? マクロ実行後、オペレーターが画面を確認して、エンターを押したら、 再度マクロが走るようにしたいのです。 ググってもTextboxに対してだったり、セルへの入力時の例ばかりで 目的の物とは違うので教えて下さい。 宜しく御願いします。
948 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/09(月) 23:11:16.53
VBAで作ったExcelのファイルを、 Outlookのメールに添付して しかもそのメールの差出人・件名・本文(数行以上に渡る文章)もVBAで書いて 送信ボタンを押す直前の状態までExcelのVBAで作ることは可能ですか? Yなら、どうやりますか?
949 :
948 :2012/04/09(月) 23:12:45.90
VBAで作ったExcelのファイル = あるマクロでいろんな処理をした結果作ったExcelのブックのこと
>>947 Application.OnKeyメソッド
>>948 >送信ボタンを押す直前の状態までExcelのVBAで作ることは可能ですか?
可能
>Yなら、どうやりますか?
>>2
952 :
945 :2012/04/09(月) 23:51:26.07
>>946 たとえば、宣言部で
Private Type AAA
BBB As String
CCC As String
End Type
Private Type ZZZ
DDD As AAA
EEE As String
End Type
としてやる。
で、プロシージャ内でユーザー定義変数を宣言。
すると、あまり意識せずに多次元配列状態を作り出せる。
Dim A As ZZZ
A.EEE= "文字列"
A.DDD.BBB="入れ子になってる"
A.DDD.CCC="これも"
With A
Debug.Print .EEE
With .DDD
Debug.Print .BBB
Debug.Pring .CCC
End With
End With
この例だとしょぼいけど、似たような内容の変数が
10個も20個も出てくるときにものすごく整理しやすい。
>>950 出来ました。
ありがとうございました。
954 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/10(火) 10:47:52.39
End(xlUp)は、プロパティですかメソッドですか? トマトは、野菜ですか果物ですか? バナナはおやつに入りますか?
>>954 おやつやデザートとして食べるのが果物。
おかずとして食べるのが野菜。
酢豚にパイナップルを入れるのは最近聞いたが 実際に見たことは無い
End()はメソッドxlUpは定数
960 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/11(水) 16:53:30.86
ある特定のフォルダ(例えば、デスクトップ\Test\A01\)にあるExcelファイルだけを開くにはどうすればいいですか? また、そのフォルダにあるExcelファイルを開かずにその中のセルにある値をいくつか取り出すことは可能ですか?
>>960 > ある特定のフォルダ(例えば、デスクトップ\Test\A01\)にあるExcelファイルだけを開くにはどうすればいいですか?
Workbooks.Open filename:="c:\foo\bar.xls"
で特定のフォルダの特定のブックが開ける
> また、そのフォルダにあるExcelファイルを開かずにその中のセルにある値をいくつか取り出すことは可能ですか?
不可能
>>960 「Excelファイルを開かずに」の「開く」の定義をもうちょっと明確にしないと答えられないよ
963 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/11(水) 18:21:46.56
>>961 いや、そのフォルダにあるExcelファイルを全部開くという意味です。
そのときによってファイル名は毎回違う、みたいな。
965 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/11(水) 18:45:17.49
>>964 そのDir関数はなんのための関数?どうやって使うの?
966 :
960 :2012/04/11(水) 18:45:46.25
そんな関数、本に載ってないからわからん
>>965 お前のExcelにはヘルプが無いのか?ネットに接続できるのにgoogleにはアクセス出来んのか?
968 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/11(水) 19:03:23.94
使ったことすらない。グーグルは邪道だ。
こんなとこで見も知らぬ他人にきくほうがよっぽど邪道だろ
970 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/11(水) 19:24:04.95
なんだと、このやろう
Exceは確定申告のために税額を計算するソフト それ以外の使い方は全部邪道
いきなり別のソフトの説明されても
確定申告はそれ用のソフトがあるだろ エクセでやってる奴ってその程度のお金も出せない貧乏人なの?
エクセルのほうが高いだろ
エクセルはそれ以外の用途で買ってて入れてる奴が多い
ExcelVBAのスキルの前に、スルースキルを身につけろ
もともと表計算ソフトが税金の計算のために発明されたってのは本当の話
MS12-027を入れてコモンコントロールを使ったVBAマクロが動かなくなったら
exdファイルを削除してね!
ttp://support.microsoft.com/kb/2664258/ To resolve this issue, you must delete the cached versions of the control type libraries (extender files) on the client computer.
To do this, you must search your hard disk for files that have the ".exd" file name extension and delete all the .exd files that you find.
These .exd files will be re-created automatically when you use the new controls the next time that you use VBA.
These extender files will be under the user's profile and may also be in other locations, such as the following:
C:\documents and settings\username\Application Data\Microsoft\Forms
C:\documents and settings\username\AppData\Local\Temp\VBE
別々のブックでマクロを共有することって出来ますか? 別々のブックで同じマクロ処理をしたいので、現在はコピーしながら 使っているのですが、マクロの内容が変更になりそうなので 今のうちに共有出来るなら作っておこうと思いまして。 宜しく御願いします。
いやいや、アドインにしろよ
写真帳を作成してます。(XP,Excel2003) 選択写真の縮小と圧縮をワンボタンで実行したいのですが、圧縮の方が機能しないのでヒントください。 マクロの記録(図の書式設定から圧縮)でできたコードで、 図のトリミング部分を削除するのチェックを外してマクロ記録したけど、それが実行されてない。 手動でするとデータサイズが900KB→150KBになるが、マクロ実行では900KBのまま。 Sub 写真圧縮() On Error GoTo ErrorCheck Selection.ShapeRange.PictureFormat.Brightness = 0.5 Selection.ShapeRange.PictureFormat.Contrast = 0.5 Selection.ShapeRange.PictureFormat.ColorType = msoPictureAutomatic Selection.ShapeRange.PictureFormat.CropLeft = 0# Selection.ShapeRange.PictureFormat.CropRight = 0# Selection.ShapeRange.PictureFormat.CropTop = 0# Selection.ShapeRange.PictureFormat.CropBottom = 0# ErrorCheck: MsgBox "写真を選択" End Sub トリミング部分削除のチェックを外した方がサイズが小さくなるのも疑問だけど、よろしくお願いします。
>>983 excel vba 図 圧縮
でググる
985 :
983 :2012/04/12(木) 13:18:54.90
>>984 レスありがとうございます。
書く前に一応検索して、いろいろ試してみたのですが、自分の思うようにいかず(理解できず)、
結局シンプルな組み合わせが理想だったので
>>983 の方法を選びました。
縮小の方↓はうまくいき、最終的にこれら二つを組み合わせようと考えてます。
Sub 写真縮小()
On Error GoTo ErrorCheck
Selection.ShapeRange.LockAspectRatio = msoTrue
Selection.ShapeRange.Height = 232.5
Selection.ShapeRange.Width = 309.75
Exit Sub
ErrorCheck:
MsgBox "先に写真の選択"
End Sub
986 :
デフォルトの名無しさん :2012/04/12(木) 19:22:48.64
ある特定のフォルダ(例えば、デスクトップ\Test\A01\)にあるExcelファイル(ファイル名は不定)だけをすべて開くにはどうすればいいですか? また、そのフォルダにあるExcelファイルを開かずにその中のセルにある値をいくつか取り出すことは可能ですか?
我々はスルースキルを身につけたのでもう釣られません
つまらない大人になっちゃったんだね
989 :
986 :2012/04/12(木) 19:43:58.23
アホが一匹釣れた(ワラ
990 :
デフォルトの名無しさん :2012/04/12(木) 19:53:25.65
Win7Ultimate Excel2010 連想配列使いたくて Set dic = CreateObject("Scripting.Dictionary") こうしても「変数が定義されていません」とエラーが出るんだけど、何がいけないの?
変数dicの宣言し忘れか?
あ
デザイン あ
994 :
990 :2012/04/13(金) 10:12:00.33
自己解決しました
原因はOption Explicit宣言してた為に結果
>>991 さんの言うとおりになっていました
標準モジュールにAuto_Openを作って、マクロの自動実行をする時にセキュリティ警告が出るのが嫌で、 下記のようなvbスクリプトをネットで拾って使ったのですが、Auto_Openが実行されません。(ブックは表示されます。) Option Explicit Dim objExcelApp, strPath Const BookName = "hoge.xls"’実行するファイル Set objExcelApp = CreateObject("Excel.Application") With WScript strPath = Replace(.ScriptFullName, .ScriptName, "") End With objExcelApp.Workbooks.Open strPath & BookName, False, False objExcelApp.Visible = True Set objExcelApp = Nothing ファイルをクリック等で開くと実行されるのでマクロ自体は間違いないと思うのですが、 このスクリプトがおかしいのか、何かエクセル側で設定する項目があるのか 教えて下さい。 環境はExcel2003+XP SP3です。 宜しく御願いします。
996 :
995 :2012/04/13(金) 17:00:21.61
自己解決しました。 Auto_Openを実行するには RunAutoMacros の記述が必要でした。 スレ汚し、済みません。
997 :
デフォルトの名無しさん :2012/04/13(金) 17:01:26.67
質問したいけど新スレ立たないのかな *やりたいこと* シート内のセル設定情報をテキストで保存して、読み出し →帳票のテキストデータ化 *必要なこと* セルに設定された各種プロパティの保存 *知りたいこと* プロパティがデフォルト以外に変更されたセルを発見する方法 構造体だかクラスだか設定して該当範囲の一括調査・設定するしかないのだろうか
>>998 もっと具体的に書かないと第三者には伝わらないよ
とりあえず
>>2 を読み返して質問し直した方がいい
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。