Excel VBA質問スレ Part11
at TECH
1:デフォルトの名無しさん
09/05/10 01:05:30
Excelの「VBA」に関する質問スレです
前スレ スレリンク(tech板)
★1 質問をするときはOSとExcelのバージョンを必ず書きましょう
★2 わからなければとりあえず「マクロの記録」をしてみましょう
★3 丸投げのプログラム作成依頼は受け付けていません
★4 VBAを使わない、Excelの使い方に関する質問はスレ違いです
Excel総合相談所 82
スレリンク(bsoft板)
2:デフォルトの名無しさん
09/05/10 01:06:41
過去スレ
01 スレリンク(tech板)
02 スレリンク(tech板)
03 スレリンク(tech板)
04 スレリンク(tech板)
05 スレリンク(tech板)
06 スレリンク(tech板)
07 スレリンク(tech板)
08 スレリンク(tech板)
09 スレリンク(tech板)
10 スレリンク(tech板)
3:デフォルトの名無しさん
09/05/10 02:30:44
卒研でVBAを使用することになったんですがお勧めの初心者向けのテキスト(教科書)教えてくれませんか?
当方一年授業で学んでオセロつくったくらいです
4:デフォルトの名無しさん
09/05/10 05:12:26
★5 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分野の話ではないので、ここでは聞かないでください。
★6 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★7 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
5:デフォルトの名無しさん
09/05/10 05:27:12
>>4は同意されたものではないので、無視してかまいません。
6:デフォルトの名無しさん
09/05/10 07:23:15
>>4に同意する
7:デフォルトの名無しさん
09/05/10 08:46:57
★7は必須だろ
8:デフォルトの名無しさん
09/05/10 09:03:06
>>4
ExcelVBAからADOを使ってmdbのデータを読む、なんてのは含まないんだね
9:デフォルトの名無しさん
09/05/10 09:20:46
APIの話も、Excelから呼び出すなら良いと思うけどな。
具体的なAPI詳細とかなら、専用スレに誘導すりゃ良いし。
10:デフォルトの名無しさん
09/05/10 19:54:55
EXCEL2003とXPを使用しています
デバッグのステップインでF8を押して進めるとすべて問題なく処理が完了するのですが
マクロの実行でやると
実行時エラー424オブジェクトが必要です
という物が表示されてしまいます
何処の変数がオブジェクトにしないといけないとか判断する方法はないでしょうか?
11:デフォルトの名無しさん
09/05/10 22:15:31
「実行時エラー424オブジェクトが必要です」
って表示された時に処理止まっているんじゃないの?
12:デフォルトの名無しさん
09/05/10 23:04:45
デバッグのF8連打のステップインの時は全く問題なく終了(ループ)するんですよ、、、、
実行でもたまに上手くいくんですが大半がエラー424になって
なんでデバックだと上手くいくのに実際だとエラーが出るんだろ、、、、と思いまして
13:デフォルトの名無しさん
09/05/10 23:27:43
ブレイクポイント入れてないのに勝手に止まったりすることあるよ
こまかいことは(ry
14:デフォルトの名無しさん
09/05/10 23:44:49
スクリプトうpれ
15:デフォルトの名無しさん
09/05/11 03:27:13
通信に関係あるプログラムじゃね?WEBとかデータベース鯖とか。
相手の準備が出来たかどうか、データの取得が完了したかどうか
ちゃんとステータスチェックせずに次に進むと成功したり失敗したりするし、
F8連打だとそれだけで時間稼ぎになるから失敗しにくくなる。
16:デフォルトの名無しさん
09/05/11 04:58:31
処理が止まった行の
xxx.Value = yyy
または
yyy = xxx.Value
のxxxに問題あり?
17:デフォルトの名無しさん
09/05/11 07:31:15
>>10
あるねぇ
>>15の通り、相手の準備が出来てないっての。通信に限らずオブジェクトの描画か何かでも起こった気がする
ループ使ってるならloopやnextの上の行辺りに
Sleep 100
とか入れて見ると解決した気がする
ループじゃなければちとわからん
18:デフォルトの名無しさん
09/05/11 10:23:34
初心者丸出しのコードでもいいでしょうか?
19:デフォルトの名無しさん
09/05/11 10:46:03
Sleep 100とか入れちゃう初心者じゃなければいいよw
20:デフォルトの名無しさん
09/05/11 10:46:06
友人の持って来たノートPC、XP,Office2000だと
実行を40回ループさせても実行時エラー424オブジェクトが必要です
って表示されない、、、、
OFFICE2003が何か悪さしてるのかな、、、、
21:デフォルトの名無しさん
09/05/11 10:46:22
>>18 = >>10か?
どんな行で止まったかだけでも分からないと推測で答えるしかない
22:デフォルトの名無しさん
09/05/11 11:13:53
>>21
はい昨日424エラーが出ると言った者です
皆さんの予想通りWEBにアクセスしてデータを持ってくるという物を作ろうとしています
エラーが出るところは行はランダムなのですが
Set IE = CreateObject("InternetExplorer.Application") 'ココ
IE.Visible = False 'ココ
If CODE = "" Then
MsgBox "コードがありません"
Exit Function
Else
TARGETURL = "URLリンク(stocks.finance.yahoo.co.jp)" & CODE
IE.Navigate TARGETURL
While IE.busy = True Or IE.readyState <> 4: DoEvents: Wend 'ココ
Set objTableItem = IE.document.GetElementsByTagName("TABLE")
CLOSEPRICE = objTableItem.Item(0).innertext
AccessYahoo = GetCloseData(CLOSEPRICE)
'Debug.Print CLOSEPRICE
End If
'ココと書いてある IEオブジェクトを触ろうとすると出るということがわかりました
23:デフォルトの名無しさん
09/05/11 11:24:34
あー自分も同じような事をしてるよ!w
うちはXPでOffice2000なんだけど・・・
Officeのバージョンとかは特に関係なくてIEが立ち上がりきっていない場合にそういうエラーでますよ。
自分はエラーハンドラで回避しているけどね。
24:デフォルトの名無しさん
09/05/11 12:40:48
OfficeよりもIEのバージョンのほうが問題か?
IE7だと重くて起動遅いとか
25:デフォルトの名無しさん
09/05/11 16:47:43
IE7というより自マシンの環境によるんじゃないのか?
26:デフォルトの名無しさん
09/05/11 17:02:44
>>23
ありがとうございます
エラーハンドラーっていうのがあるんですね
ちょっと調べてみようと思います
512MBのメモリのとき妙に424エラーとメモリ不足ですというのがでて
友人の2GBでは何もエラーをはかずに処理が終わる
1GB借りて512MB→1GBにしてみるとなぜか424エラーは出なくなった、、、、
気持ち悪いけどメモリ増やすと問題なく動くみたいです
27:デフォルトの名無しさん
09/05/11 17:13:16
>512MBのメモリのとき妙に424エラーとメモリ不足ですというのがでて
424はよく分からんがメモリ不足は後始末がちゃんとできてないと起こりやすいな
Set XXX = ○○と書いたらSet XXX = Nothing で開放しとかないとだめ
同じ変数にSetしなおしても上書きはされずにメモリを掴んだままになるらしい
やってるよな?
28:デフォルトの名無しさん
09/05/11 18:05:50
Set XXX = Nothingって処理が終了すれば自動解放されるからなくても大丈夫だけどね
29:デフォルトの名無しさん
09/05/11 18:10:04
起動時に全シートの固定行数(SpritRowプロパティ)を求めているのですが、
グラフ等がアクティブになっているとプロパティ無しエラーになります。
On Error 以外で シートがアクティブになっているかどうかを判定する方法が
ありますでしょうか?
30:デフォルトの名無しさん
09/05/11 18:14:19
>>28
そう思って書かないことが癖になると危ないと思うんだがw
っていうかあの時はマジでやばかった(謎
31:デフォルトの名無しさん
09/05/11 18:18:25
>>29
TypeName(Selection)
でどうかな?
32:デフォルトの名無しさん
09/05/11 18:28:39
>>31
素早い対応、有難うございます。
33:デフォルトの名無しさん
09/05/11 18:59:21
>>27
確かに
Set IE = CreateObject("InternetExplorer.Application")
のあとに解放せずに
何十回もAccessYahoo(コード番号)で呼びまくってました
よくない癖は早めに直さないといけないですねありがとうございます
34:デフォルトの名無しさん
09/05/11 20:46:02
IEをCreateObjectしてURLを開くのと
Workbook.Open Filename:=URLで開くのは
どこが違うんだろうか
35:デフォルトの名無しさん
09/05/11 21:40:54
IEはQuitしてやらんと、終了しないだろ
非表示のIEがいっぱい残ってるんだろ
URLリンク(www.forest.impress.co.jp)
これで一覧してみな
36:デフォルトの名無しさん
09/05/11 21:52:38
>>35
XP,Office2003で確認してみたのですが
2003はIE.quitをしなくても
自動的に消えてくれるようです
2000でも使う可能性があるのででIE.quitをAccessYahoo(コード番号)の最後に追加しました
ありがとうございます
IE.Quitはvisible をFalseにしたら不必要だと思ってました
37:デフォルトの名無しさん
09/05/11 22:12:19
>>36
ウィンドウを閉じる(終了する)のと見えなくするのは違うぞ。
プロセスはちゃんと終わらせなきゃいけない。
38:デフォルトの名無しさん
09/05/11 22:24:47
>>36
解放で自動的に消えてくれるかどうかは、officeやosのverより、
むしろieのverによると思うけど、うちのie8では消えないみたいよ
消えたかどうか何で確認してるの?
>>37
ieはプロセスに同居するから、インスタンス
39:デフォルトの名無しさん
09/05/11 22:57:57
>>38
>>35さんが教えてくれたMenuBar.HTAで確認してみました
40:デフォルトの名無しさん
09/05/12 12:55:01
VBAでフォームだけ入力することは可能でしょうか?
やりたいと思っていることは
ログイン、画面推移までは自分でIEを立ち上げて手入力でして
チェックボックスやテキストボックスにはVBAの入力ボタンを押すと自動的に
入力されてsubmitし最終確認画面が出るようにしたいと思っています
現在IEで表示している画面の要素をIEオブジェクトに取り込むということはできるものでしょうか?
41:デフォルトの名無しさん
09/05/12 13:30:20
>>40
SendKeysとか使うくらいしか思いつかんな
42:デフォルトの名無しさん
09/05/12 13:30:46
再読込するから無理だった気がする
43:デフォルトの名無しさん
09/05/12 14:07:50
ありがとうございます
なさそうですか、、、
最初からVBAでIE立ち上げて
ログインする際にID、PASSを入力待ちで手入力にして最終確認画面でmsgboxだして投稿するような方法の方が簡単そうですね
44:デフォルトの名無しさん
09/05/12 17:03:24
VBAじゃなくてVBScriptでIDとPWが入力された状態で表示させることもできるけどね
45:デフォルトの名無しさん
09/05/12 17:17:07
IDとパスワードはフォームに入力して、それをSendKeysで送ればいいと思う
46:デフォルトの名無しさん
09/05/12 17:43:25
ごめん 42 です。
できるかも!
参考までにソース挙げます。
Yahooページ立ち上げておいて・・・こんな感じで・・・
Dim objIE As Object 'IEオブジェクト参照用
Dim objShell As Object
Dim strURL As String 'URLの文字列
'IEのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
Set objShell = CreateObject("Shell.Application")
For Each objWindow In objShell.Windows
If objWindow.LocationURL = "URLリンク(www.yahoo.co.jp)" Then
objWindow.document.sf1.p.Value = "VBA"
End If
Next
Set objIE = Nothing
Set objWindow = Nothing
47:デフォルトの名無しさん
09/05/12 17:55:25
もうちょっと推敲しろよ
48:デフォルトの名無しさん
09/05/12 21:28:22
質問です。
shell関数でIEを全画面サイズで開く処理を行うと、
会社のPCだと、どうしても全画面で開けません。
最小化でも開けず、ただ適当なサイズで開いてしまうんですが、
何かサイズ指定が不可能になる条件ってPC側にあるんでしょうか?
OSはXP、MSは2002です。
49:デフォルトの名無しさん
09/05/12 21:57:36
教えてください
Excel2003で、セルを右クリックして出るポップアップメニューに
独自メニューを加えたいのですが、最初のシートには
追加できたのですが(下参照)、2枚目以降のシートのセル+右クリックでは
追加メニューが表示されません
すべてのシートのセルの右クリックポップアップメニューに独自メニューを
追加する方法またはある特定のシートのセルの右クリックポップアップメニューに
追加する方法はありますでしょうか?
よろしくお願いいたします
Public Sub CreatePopUp()
Dim fBar As CommandBar
Dim fBtn As CommandBarButton
Set fBar = CommandBars("Worksheet Menu bar").CommandBars("Cell")
fBar.Reset '初期化
Set fBtn = fBar.Controls.Add(msoControlButton, Temporary:=True)
fBtn.BeginGroup = True '新しいグループにする
fBtn.Caption = "変更"
fBtn.OnAction = "Modify"
Set fBtn = Nothing
Set fBar = Nothing
End Sub
50:デフォルトの名無しさん
09/05/12 22:22:39
適当だけど
標準モジュールの一番上に記述
Public Declare Function GetAsyncKeyState Lib "User32.dll" ( _
ByVal vKey As Long _
) As Long
Public Const VK_RBUTTON = &H2 '[RightClick]
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
適応したいシートに記述
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If GetAsyncKeyState(VK_RBUTTON) Then
Dim fBar As CommandBar
Dim fBtn As CommandBarButton
Set fBar = CommandBars("Worksheet Menu bar").CommandBars("Cell")
fBar.Reset '初期化
Set fBtn = fBar.Controls.Add(msoControlButton, Temporary:=True)
fBtn.BeginGroup = True '新しいグループにする
fBtn.Caption = "変更"
fBtn.OnAction = "Modify"
Set fBtn = Nothing
Set fBar = Nothing
End If
End Sub
51:デフォルトの名無しさん
09/05/12 22:36:02
>>48
ie側の問題だと思う
iexplore -nohome
だと効くみたいだけど
52:デフォルトの名無しさん
09/05/12 22:50:59
>>51
そうなんですか。。。
ありがとうございます。
53:デフォルトの名無しさん
09/05/13 12:54:29
msgboxのYES,NOをすべての最前面に出す方法はないでしょうか?
VbMsgBoxSetForegroundが最前面表示とあるので
MsgBox("確認", vbYesNo, vbMsgBoxSetForeground)
としてみたのですが
VBA実行→IEが立ち上がる→確認がIEの後ろに隠れてしまう
(奥からエクセル、確認msgbox、IEの順になってしまう)
VBA実行→IEが立ち上がる→確認がIEの手前で
奥からエクセル、IE、確認msgboxの順になるようにしたいと思っています
54:デフォルトの名無しさん
09/05/13 15:12:06
+ vbSystemModal
55:デフォルトの名無しさん
09/05/13 15:31:48
>>53
APIでエクセルをアクティブにしてからメッセージボックスを出すとか
56:デフォルトの名無しさん
09/05/13 15:55:24
★5 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分野の話ではないので、ここでは聞かないでください。
57:デフォルトの名無しさん
09/05/13 16:08:53
MsgBoxについての話はスレ違いか?
vbSystemModal使うと「メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。」
だから都合悪いかもしれないと思ってAPI使うってアクティブにする案を出したんだが・・・
APIの使い方がわからないって言ってきたらググレカスとでも言っておくがなw
58:57
09/05/13 16:10:07
訂正
× API使うってアクティブにする
○ API使ってアクティブにする
59:デフォルトの名無しさん
09/05/13 16:36:25
要件満たさんだろ
60:デフォルトの名無しさん
09/05/13 19:39:10
そもそもアクティブにするのと最前面にするのは違うし。
おかげでボタンが押せなくて操作不能になるアプリがたまにある。
61:デフォルトの名無しさん
09/05/13 21:37:14
>50
お返事ありがとう
その方法でもメニューが追加されるのは一枚目のシートだけ見たいです
具具っても見当たらないんですよね
62:デフォルトの名無しさん
09/05/13 23:07:23
>>49
いま手元にExcelが無いのであれだが
' Set fBar = CommandBars("Worksheet Menu bar").CommandBars("Cell")
Set fBar = Application.CommandBars("Cell")
で どうかな?
63:デフォルトの名無しさん
09/05/13 23:13:16
セルに色が設定されていない状態のcolorIndexは何でしょうか?
If Worksheets("Sheet1").Cells(1, 1).Font.ColorIndex <> 2 Then
MsgBox "color"
End If
みたいに書いているんですが、bookを作った最初の状態は、白ではなく、色が未設定の状態だと思うんですが。。。
64:デフォルトの名無しさん
09/05/13 23:16:58
xlColorIndexNone ですかね。
65:デフォルトの名無しさん
09/05/13 23:19:21
Interior.Colorindex= 0
fontではなくInteriorです!
66:デフォルトの名無しさん
09/05/13 23:23:50
ありがとうございます!
0でもxlColorIndexNoneでも同じって事ですか?
fontとInteriorはコピーする箇所を間違えました;
67:デフォルトの名無しさん
09/05/13 23:49:08
例えば、
Range("A1").Activate
Activecell.Interior.Colorindex=0
Msgbox Activecell.Interior.Colorindex
Activecell.Interior.Colorindex=xlNone
Msgbox Activecell.Interior.Colorindex
Activecell.Interior.Colorindex=xlColorIndexNone
Msgbox Activecell.Interior.Colorindex
Activecell.Interior.Colorindex=xlColorIndexAutomatic
Msgbox Activecell.Interior.Colorindex
とかすると面白い?
68:デフォルトの名無しさん
09/05/14 01:13:52
xlNoneは-4142だから0とは違う
69:デフォルトの名無しさん
09/05/14 12:35:39
-4142
-4142
-4142
-4105
になったぞ by Excel97
70:デフォルトの名無しさん
09/05/14 19:53:45
スイマセン、ローカルにコピーしたロータスノーツのファイルにアクセスする方法について教えていただきたいのですが・・・
あと、VBAの設定で参照可能なライブラリファイルにチェックを入れとけばいいんですよね?
71:デフォルトの名無しさん
09/05/16 19:47:16
オブジェクト型変数には、オブジェクト自身ではなく、オブジェクトの情報を呼び出す為の番号(参照)が入る。
って、要するにポインタのことですか?
72:デフォルトの名無しさん
09/05/16 20:27:27
参照です。
73:デフォルトの名無しさん
09/05/16 20:34:09
大まかには合ってるんじゃない?
とりあえず、他の変数に代入してもオブジェクトそのものは
複製されない事だけ把握しとけばOK。
74:デフォルトの名無しさん
09/05/16 20:46:14
実態をコピーせずに何らかの番号で区別するって意味では合ってるかもしれないけど
やっぱり参照とポインタは微妙に違う
狭い意味だとポインタはアドレスのことだったりもするし
あとは実装次第だ
75:71
09/05/16 21:09:11
>>72-74
ありがとうございます。
76: ◆aAB/3SgCFU
09/05/17 13:44:16
自分が使っているテキストでは、下のプログラムを実行すると、
シートの行と列全てがアトランダムに塗りつぶされるはずなのですが、
実際にやってみても、全列の1行目しか塗りつぶされません。
どこかおかしいのか、教えていただけませんか?
Option Explicit
Sub 画面更新()
Dim i As Integer
Application.ScreenUpdating = False
Rows.ColumnWidth = 1.75
For i = 1 To 6000
Cells(i).Interior.ColorIndex = Int(Rnd * 56) + 1
Next i
MsgBox "これから更新します。"
Application.ScreenUpdating = True
MsgBox "更新終わりました。"
End Sub
77:デフォルトの名無しさん
09/05/17 14:13:56
>>76
Office2007で利用可能な桁数が大幅に増えた(16384?)のが理由。
桁数が最大256桁とか決めうちしていると、こういうことになる。
78:デフォルトの名無しさん
09/05/17 14:14:38
Cells(i).
が原因だね。
cells(row,column)
で指定しないと。
79: ◆aAB/3SgCFU
09/05/17 19:32:56
>>77-78
どうもありがとう
80:デフォルトの名無しさん
09/05/18 07:30:50
質問です
VBAで他のアプリケーションを開くまでは色々ググって出来たんですが
そのアプリが閉じられたら、再びVBAに処理を戻したいんです。
今はファイル名のリストがフォーム上に有ってその名前で検索したファイルを開くという作業で一太郎やワード等を
ShellExecuteで開くというの作ったんですが
開いたファイルが閉じられたら更新日時を調べて変化が有れば書類の板番号を更新したいんですが
いつ閉じられたかも解らないし、ファイルを開いて処理が中断し閉じて再開すると言った事は不可能でしょうか?
81:デフォルトの名無しさん
09/05/18 09:09:25
>>80
それはアプリの終了よりもファイルの更新を調べた方がいいのでは。
VBAで1秒間隔のタイマーをセットして、ファィルのタイムスタンプを1秒おきに調べるみたいな方法なら
すぐに思い付くけど。
82:デフォルトの名無しさん
09/05/18 12:00:46
>>81
わかりました
それで行きます
83:デフォルトの名無しさん
09/05/18 13:17:19
えっ、それでいっちゃうの?
84:デフォルトの名無しさん
09/05/18 13:20:12
行くって言ってるだろ
85:デフォルトの名無しさん
09/05/18 14:53:02
だって
思い付かないんだもん
86:デフォルトの名無しさん
09/05/18 16:03:24
OpenProcess()してWaitForSingleObject()するのは駄目なのか?
87:デフォルトの名無しさん
09/05/18 16:06:00
dirname/filea.ext
dirname/fileb.ext
があったときに、".ext"に関連づけられているsomeapp.exeを起動したとき、
fileb.extもsomeapp.exeで更新している可能性があるので、
プロセスの終了を待ち合わせて、dirname/*を全検索して情報を更新するのが一番。
88:デフォルトの名無しさん
09/05/18 17:00:13
ファイルを閉じて、アプリは閉じないかもしれない
89:デフォルトの名無しさん
09/05/18 17:19:47
ROTにファイルがあるかチェックすればよい
90:デフォルトの名無しさん
09/05/18 19:17:48
line input 命令で chr(&h0) の入ったレコードを読み込むと強制的に chr(&h20)に置き換えられるのでしょうか?
もしそうでしたら、何らかの回避方法を教えていただきたいのですが・・・
91:デフォルトの名無しさん
09/05/18 20:21:34
バイナリで読め
92:デフォルトの名無しさん
09/05/19 11:12:20
>>86
試して見ましたが
ファイルが開き終わるとwaitが終了し次の処理に移ってしまうようで上手くいきませんで
filepath="sample.txt"
CreateObject("WScript.Shell").Run FilePath, vbNormalFocus, True
MsgBox FilePath & "が閉じられました。", vbInformation Or vbSystemModal
これで済ませました お騒がせしました
93:デフォルトの名無しさん
09/05/19 12:11:15
ワークシートのmodと異なり、VBAのmodは小数点下が切り捨てられてしまいます。
小数点下を含む剰余を返すようにしたいのですが、ワークシートのmodは演算子だから
application.mod()とは出来ない。
良い方法はありますでしょうか?
94:デフォルトの名無しさん
09/05/19 14:33:35
小数点下は元の数と同じな気がする
95:93
09/05/19 15:32:48
>>94
分母が整数なら・・・。
x mod yの場合、x - Int(x / y) * yで良いのかなぁ。
96:デフォルトの名無しさん
09/05/19 22:18:52
x - (x \ y) * y
だとどうだろう
97:デフォルトの名無しさん
09/05/19 22:45:17
顔文字かと思った
98:デフォルトの名無しさん
09/05/19 22:52:54
>>96
たばこを吸うバルタン星人ですよね???
99:デフォルトの名無しさん
09/05/20 15:37:42
すいません、WindowsXP SP3、Excel2003での質問なんですが、
VBAを使って罫線ツールバーの「罫線を作成」機能(セルの枠線にそってクリック・ドラッグで罫線を引く)
と同じことをするのは可能でしょうか?
100:デフォルトの名無しさん
09/05/20 17:04:50
>>99
罫線を引きたいセルを選んでVBA実行して罫線が引かれるっていうのならできるんじゃね
101:デフォルトの名無しさん
09/05/20 17:29:32
test
102:デフォルトの名無しさん
09/05/20 21:13:05
以下のようなことをやりたいです。
XP、Excel2003です。
Excelファイルが2つある。1つは用語集ファイルと呼び、もう1つは作業ファイルと呼ぶ。
用語集ファイルには英単語とその対訳がリスト形式で保存されている。
作業ファイルには英文が書かれていて、知らない英単語が出てきたら用語集ファイルを検索して
その意味を調べる。
具体的には
1.作業ファイル中の検索したい単語を反転表示させる。
2.右クリックのショートカットメニューから、独自に追加した「単語を検索」をクリックする。
3.用語集ファイルに、1で選択した単語の検索結果が表示される。(Ctrl+Fでの検索と同じ表示結果)
※ただし、作業ファイルにはマクロは記述しない。
作業ファイルにはマクロは記述しないので2が無理かと思うのですが、代替案として
どのような方法を取ればいいでしょうか?(右クリックのショートカットメニューでなくてもいいので
とにかく作業ファイルにはマクロは記述せずに、3と同じ結果を得たいのです)
おおまかな手順でいいので、ヒントをお願いします。
103:デフォルトの名無しさん
09/05/20 21:26:28
personal.xlsに記述するのもだめ?
104:102
09/05/20 21:49:38
>>103
OKです。
personal.xlsが何なのか知らなかったので調べたのですが、どうやら自分の作ったマクロを
まとめておくエクセルファイルのようですね(初心者ですみません)。
つまり、最終的には作業ファイル・用語集ファイル・personal.xlsという3つのファイルで作業する
という認識で正しいですよね?
105:デフォルトの名無しさん
09/05/20 22:00:12
>>102
その程度のユーザビリティなら、そのままCtrl+Fで良いじゃん。
わざわざマクロを組む必要性がわからん。
106:105
09/05/20 22:01:04
>>105
あぁ、別ファイルか。
ごめん。
107:デフォルトの名無しさん
09/05/21 07:37:30
>>95
別に分母が正数じゃなくてもそれでいいんじゃない?
むしろ分母が整数の必要があるのは>>96だな。
108:デフォルトの名無しさん
09/05/21 08:20:20
重複に関してちょっと質問します。
= IF(COUNTIF(B:B,B4) >1, "重複","")
この関数でE4という条件をB列全てに適応できたらと
思っています。この関数ではB4のセルの内容が
他と重複してるかいないかのチェックだけになります。
B4セル エクセル
B5セル ワード
このような場合エクセルとワードという単語がB列で
重複してるかいないかのチェックになります。
109:デフォルトの名無しさん
09/05/21 09:31:14
これはVBAではないですよね?
110:デフォルトの名無しさん
09/05/21 11:00:14
エクセルだなw
111:デフォルトの名無しさん
09/05/21 20:18:50
あるセルにこんなSUMIF関数を入れたいんだけど、
Cells(r + 1, 4).FormulaArray = "=SumIf($O1:$O500,cells(r,3),#K1:$K500)"
エラーになってしまうのは、検索条件がおかしい?
(rはFOR〜Nextさせています)
112:デフォルトの名無しさん
09/05/21 20:32:10
Cells関数なんてあったか?
113:デフォルトの名無しさん
09/05/21 20:43:27
>>111
何で文字列に変数名が入ってるんだ。
” ”で囲まれた中は文字列だから、rは文字のrでしか無い。
てか、SUMIFなんて使わずにVBAで構文書いた方がずっと楽だよ。
114:デフォルトの名無しさん
09/05/21 21:28:23
こうか?
Cells(r + 1, 4).FormulaArray = "=SUMIF($O1:$O500," & Cells(r, 3) & ",#K1:$K500)"
115:デフォルトの名無しさん
09/05/22 01:11:16
>>111
そんなのはピボットでやれよ。
#は$の間違いか?
116:デフォルトの名無しさん
09/05/22 08:13:03
>>113
for文使ってるって言ってるんだからVBA使ってるいるんじゃないのか?
117:デフォルトの名無しさん
09/05/22 11:29:40
>>4 replace
☆VBAはVisual BASIC For Applicationsの略だとされており、Visual BASIC
Visual BASIC .NET VBScrptとは文法が異なる言語です。(ただし共通性は
概して高いです。)
☆制限はそれなりにありますが多くのVBA環境からもWindowsの共通ライブラリ
を利用することが出来ます。(但しそれぞれのライブラリの個性に応
じた、専門知識は必須ですがそれが公開されている(=入手可能)とは限りま
せん)
☆このスレではVBAを用いてExcelがインストールされている
Windowsマシンでは、原則としてはプログラム言語の種類によらずに
使用可能なライブラリ「Excel オブジェクト」の公開部分の操作をし
て目的の結果を得る(※)手段を考案する状況で発生した疑問、質問に対して
有志が答えるスレッドだと考えられます。Excelに付属のVBAエディター
を使用してプログラミングを行っているという状況はまさにこの
状況になりますし、その状況以外で発生したものはスレ違いになる可能性
が濃厚です。
(※)この手段が邪道でExcel道に根本的に反するという意見も貴重
です。Excelは一元的かつ算術的な処理の為のソフトウェアであり、多元的
かつ手続き的な処理には向かないという考えに基づくものです。
本来VBAがもっとも効率的に活躍するのはAccess環境であるという考え方
を取りたいものです。
118:デフォルトの名無しさん
09/05/22 11:51:39
>>111
そもそもFormulArrayなら範囲に1個の配列数式だからループを回すのはおかしい。
式の入力範囲がD2:D100だったらD2:D100を選択して{=SUMIF(O1:O500,C2:C100,K1:K500)]だが
Range("D2:D100").FormulaArray = "SUMIF(O1:O500,C2:C100,K1:K500)"
と書けば配列数式が入力される。
配列数式じゃなければFormulaArrayじゃなくてFormulaだ。
どっちにしてもループは回す必要なし。
>>115が言うようにおそらくピボットテーブルでできることだろうけどな。
119:デフォルトの名無しさん
09/05/22 11:52:34
Range("D2:D100").FormulaArray = "=SUMIF(O1:O500,C2:C100,K1:K500)"
だった。
120:デフォルトの名無しさん
09/05/22 12:15:10
>>117
回答者側はその物言いで理解できるだろうけど
質問者側はそれじゃ理解できない奴多いだろうな
121:デフォルトの名無しさん
09/05/22 13:32:03
世の中は即理解できる世界ばかりで出来ているわけじゃないことを
教えるのは重要
122:デフォルトの名無しさん
09/05/22 13:40:44
プログラムって、頭の良い人なら3日くらいで何でもできるようになるのだろうか?
自分は4月から勉強し始めたけど、やってもやっても、
分からないことや、知らなかったことが出てきてゴールが見えてこない。
123:デフォルトの名無しさん
09/05/22 13:48:57
頭の良い人なら3日くらいで何でもできるようになるのだろうか?
3日くらいで何でもできるようになるのが頭の良い人
124:デフォルトの名無しさん
09/05/22 14:18:55
試験勉強じゃないから暗記しなくてもいいし
わからなかったら人に聞いてもいいし
本人に作る気があればプログラムなんかいくらでも作れるだろ
125:デフォルトの名無しさん
09/05/22 14:31:46
俺は長い事ECMAやってからVBAを始めたんだけど、
・言語体系を覚えるまで3か月
・VBAで出来る事、向いてる事かが分かるまで更に3か月
・調べながら自分で作れるようになるまで更に3か月
って感じで、かなり時間が掛かった記憶がある。
VBから始める人ならそれこそ3日で出来るとかあるだろうけど、
それ以外の言語からだときちいわ。
未だに分からん事の方が多い。
プログラムやったこと無い人だったら、変数って何?配列って何?
って事から始まるんだし、もっと時間かかるんでないか?
126:デフォルトの名無しさん
09/05/22 14:34:59
ECMAって何だ?
127:デフォルトの名無しさん
09/05/22 14:36:41
まず、何でも出来るようにはならない。
出来るよ!って人でもその時々で調べながらプログラム組んでるものです。
暗記する必要もないし、調べながらでも出来れば問題ない。
大体、使うものって限られてるし、それが出来れば十分なわけです。
128:デフォルトの名無しさん
09/05/22 15:05:05
>>125
ECMAってJavaScriptだろ?
そりゃきちいわ。同じ系統でもVBScriptからだと
だいぶ違うと思うがどうかな。
だがVBA自体はかなりしっかりした
言語なんで半年以上かけて勉強したことに
ついて損はしてないね。
129:デフォルトの名無しさん
09/05/22 17:25:31
OS:WindowsXP
Excel2007
での質問です。
今までExcel2003で使っていたマクロの冒頭部分が以下のとおりです。
If Dir(OutPath & "\完成", vbDirectory) = "" Then MkDir OutPath & "\完成"
ActiveWorkbook.SaveCopyAs FileName:=OutPath & "\Tmp.xls"
Workbooks.Open FileName:=OutPath & "\Tmp.xls"
Dim TmpWorkBook As String
TmpWorkBook = "Tmp.xls"
Workbooks(TmpWorkBook).Activate
ここで作った一時ワークブックに、別に開いたCSVファイルをシートごとコピーするという命令が続くんですが、
Excel2007になってからCSVを開いた時勝手に巨大なシートサイズになる?のかどうかわかりませんが、
コピーの時点で「コピー先に対してシートサイズが大きすぎてコピーできません」となるようになってしまいました。
そこで上記マクロの"Tmp.xls"をすべて"Tmp.xlsx"にしてみたのですが、
今度はファイル拡張子とファイル内容が一致しませんと言われてOpenできませんでした。
原因と対処がわからないのですが、どのように改善したら良いでしょうか?
130:デフォルトの名無しさん
09/05/22 17:37:42
追記:マクロ実行時点でのActiveWorkbookは本マクロが含まれてるファイルです。
131:デフォルトの名無しさん
09/05/22 18:15:34
すみません、自己解決しました。
大元のファイルをxlsmで保存しなおして、VBAの中もxlsmにすればいいんですね。
132:デフォルトの名無しさん
09/05/22 19:17:20
>>122
目的があれば、すぐに覚えられる
事務作業の自動化のために
表への入力、印刷設定→印刷の自動化、ファイルを正規化させたり、シートを一度に何個も作る・・
等の作業をマクロの記録。そして改変。後はifやforを覚えたかな
プログラムへのとっかかりとして、マクロの記録はとんでもなく優秀だと思うわ
プロシージャやメソッド、その概念すら覚えて無くてもとりあえず動くマクロが作れるってところがね
133:デフォルトの名無しさん
09/05/22 19:48:19
>>127
確かに暗記しなくても書けるには書けるが、せめて
宣言系、制御系、演算子くらいは最低限暗記しないと、とても実用にはならないよ
まあこのへんはまともなコード書けば必ず使う物だから、意識して覚えようとしなくても
すぐに暗記しちゃうとは思うが
134:デフォルトの名無しさん
09/05/22 20:11:36
>>122
やりたいことが明確になればすぐにできるようになると思うよ
わからないことが出たら調べてそれでもわからなければここで聞けばみんなが教えてくれるし
参考書読んでてもあまりできるようにはならないかな
まず簡単な
A1の値をA3にコピーするから
A1の値をSHEET1のA3にコピーしてみる
さらにA1の値を別BOOKのSHEET1のA3にコピーしてみる
と言ったように自分でいろいろ弄って遊ぶような感覚でやっていかないと
覚えが悪いと思う
135:デフォルトの名無しさん
09/05/22 21:22:23
VBAを使ってツールバー上のコントロールを実行したいんですが、
ドロップダウンリストなどを項目を選択して実行するということは可能でしょうか?
例えば書式設定ツールバーのフォントを選択するリストでMS明朝を選んで実行、というようなことです。
普通のボタンをExecuteで実行するやり方は分かったんですが、リストの場合はどうすれば…
136:デフォルト名無しさん
09/05/22 22:46:56
学校の課題なんだけど、
URLリンク(www.hasimoto999.aki.gs)
URLリンク(www.hasimoto999.aki.gs)
が、5時間近く考えてもわからない
簡単過ぎる問題かもしれないけど、ご教授頼むorz
ちなみに19の1は解けてる。
137:デフォルトの名無しさん
09/05/22 22:50:05
> ★3 丸投げのプログラム作成依頼は受け付けていません
> ★7 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
> コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
> ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
138:デフォルトの名無しさん
09/05/22 22:55:09
>>136
そんなピラミッドを描いて何になる?
って解答欄に書いて、相手にたたきつけろ!
139:デフォルトの名無しさん
09/05/22 22:58:13
For〜Next、二重ループ とまで書いてくれてるのに分からないとか
140:デフォルトの名無しさん
09/05/22 23:10:41
URLリンク(detail.chiebukuro.yahoo.co.jp)
やるだけ時間の無駄な問題だな
141:デフォルトの名無しさん
09/05/22 23:24:46
デバッグのことに関して質問したいです。
代入していない、宣言していない変数へアクセスしたときにエラーを出すにはどうすればいいですか?
Option Explicitを指定すると 代入は検知できるんですが
宣言してない変数を読み出しても、Empty値が返ってくるだけで
そのまま実行されてしまいます。
142:デフォルトの名無しさん
09/05/22 23:29:09
それともう一つ、
また、エラーが発生した箇所を調べることは出来ないのでしょうか?
たとえば、オブジェクトをSetを使用しないで代入すると
「実行時エラー'91' オブジェクト変数またはWith(ry」と例外が発生して、ダイアログが出ますが
この例外が発生した箇所を調べることは出来ないのでしょうか?
現在は地道にステップインでエラーが発生するまで追っていますが
なんだかばからしくてやってられません。
また、例外構文もN88BASICを思い出させる、On Error〜割り込みしか無いのでしょうか?
よくある、try〜finally 〜catch(Exception e) というような構文はないんですか?
143:デフォルトの名無しさん
09/05/22 23:30:44
>>142
>なんだかばからしくてやってられません
それが自分の資質を示しているねw
144:デフォルトの名無しさん
09/05/22 23:34:47
>>136
辛口な事言うけど、論理的思考が全く出来てないでしょ。
ただ答えだけ貰ったって何も役に立たんのでは?
単位もらえりゃ良いって事なのかもしれんけどさ。
for i = 1 to 9
145:デフォルトの名無しさん
09/05/22 23:36:34
>>136
途中送信しちまった。
for i = 1 to 9
for j = 1 to 9
cells(i,j).value = i*j
next
next
つーか、こんな問題も解けない生徒がいるのに良く授業だなんて言えるわな。
146:デフォルトの名無しさん
09/05/22 23:38:30
>>142
エラー吐いた部分で黄色く反転して中断されないか?
147:デフォルトの名無しさん
09/05/22 23:43:47
これでも別に不正解ではないな。プログラムサイズに制限もないみたいだし。
二重ループは最後に空ループでも置いとけばいい。
Range("A2")=1
Range("A3")=2
Range("A4")=3
Range("A5")=4
:
以下略
ちなみに、文句言ってるやつは全科目100点だったのかな?
宿題を誰かに写させて貰ったこともないのかな?
学校なんてこんなもんだよ。まじめに考えすぎ。
148:デフォルトの名無しさん
09/05/22 23:45:22
>>145
そうやって結局教えちゃうから育たないんでしょ
149:デフォルトの名無しさん
09/05/22 23:46:10
たかが5時間でギブするのはどうだよ
150:デフォルトの名無しさん
09/05/22 23:46:29
>>147
論点のすり替え
ここは宿題教えるスレじゃない
151:デフォルトの名無しさん
09/05/22 23:46:55
単位なんてもらったもん勝ち。入試だって就職だって、まぐれでも入ったもん勝ち。
世の中、要領と運のいいやつが一番トクをする。
152:デフォルトの名無しさん
09/05/22 23:47:59
九九はどうでも良いんだけど、ピラミッドの方がなぁ。
指定された整数が129以上だと、その時点でオーバーフローだな。2003までは。
do untilで指定の数までインクリメントして、
do untilで1になるまでデクリメントして、
積み重ねる部分を関数化するのが楽だと思ってしまた。
153:デフォルトの名無しさん
09/05/22 23:48:42
>>149
それ以前に、こんな問題、読んで1分で分からなきゃモノにはならないよ。
154:デフォルトの名無しさん
09/05/22 23:51:57
こんなレベルの低い、下らないもんで良いのか。
やっぱ学校なんて気楽なもんだね。
この程度の問題が100点でした!VBA出来ます!!
って入ってくる新人がいるって事の方が怖い。
155:デフォルトの名無しさん
09/05/23 00:12:01
うちの学校は一般教養にコンピューターの授業が週一であって、
簡単なプログラミングの問題が出た。
少なくとも生徒の99.9%はプログラマーなんて目指してなかったし
宿題なんてほぼ全員が誰かのノートを丸写ししてた。
156:デフォルトの名無しさん
09/05/23 00:13:09
ふーん
157:デフォルトの名無しさん
09/05/23 00:22:59
うちの商学部でもCとかJavaとかの授業があった。教え合ったりこそはしたけど、コードとチャートは各自で書いてたよ。
SEにはならなかったけど、今の職場でVBAが扱えることで重宝してもらえてる。てかSEにならんでよかった、なったら埋没してたろうから。
158:デフォルトの名無しさん
09/05/23 00:27:04
>>157
自分より優秀な奴が集まる集団で働くよりも、自分が一番の集団で働く方が、
大事に扱われるし、自尊心も満たされるしなw
給料3万円しか違わないなら、俺は後者を選ぶ。
159:デフォルトの名無しさん
09/05/23 00:33:36
うちのひいじいちゃんが言ってた
「鶏口となるも牛後となる勿れ」ってね
160:デフォルトの名無しさん
09/05/23 00:35:14
俺は三番手位でいいや。
出る杭は打たれる、という諺もあるしな。
161:デフォルトの名無しさん
09/05/23 00:40:20
俺はわかっててもできないフリをしてる。
なんか面倒な作業を押しつけられそうだし。
今の年収で満足してるし、課長とか部長にもなりたくないし。
最低限の生活が出来ればいいや。
162:デフォルトの名無しさん
09/05/23 00:45:58
現実で使えない問題なんてさっさとネットで聞くのが吉
現実的にありそうな問題は分かるまで自分で考えるのが理想だが、そんなことで単位落としたりしてはそれはそれで問題だろう
実際現場ではネット使い放題、上司に質問し放題なんだし
かと言ってそれに頼りすぎて成長しないのも困るんだけどね
でもそれが仕事がすすまないのも困るんだけどね
163:デフォルトの名無しさん
09/05/23 03:26:21
>>143
構文チェック時・コンパイル時に分かることなのに
実行しないと分からない。しかも100行を超えるコードをウォッチ式で変数を監視しつつ、ステップ実行するというのは
明らかに効率が悪く、方法を見直す必要があるため、質問しました。
>>146
されません。 例外が発生すると、OKとHELPしか選択肢のないダイアログが出るだけです。
もちろん、ブレークポイントを設定したり、ステップ実行したり、Escキーで停止したときには
実行中の行が黄色く表示されますが。
書き忘れていましたが、
Office 2007 EEで保存形式は2007+マクロ(xlsm)です。
164:デフォルトの名無しさん
09/05/23 04:16:07
>>163
うそつき
URLリンク(windyakin.if.land.to)
165:デフォルトの名無しさん
09/05/23 13:42:35
>>164
私の環境では
URLリンク(windyakin.if.land.to)
こうなりますよ。
やはり何かデバッグオプションが足りないのかもしれません。
プロジェクトのプロパティに「条件付きコンパイル引数」という項目があるんですが
そこの所が空欄なのが問題なのかもしれません
が、オフラインヘルプを見ても
URLリンク(windyakin.if.land.to) というようになんか壊れてますし・・・
オンラインヘルプじゃないのでそのまま凸することも出来ません
MSDNの.netリファレンスが不親切だと思ったことはないですが
このVBEに付属するリファレンスは何かと不親切ですね。列挙子が何を意味するのかも省略されてますし、ひどいものです。
翻訳作業が間に合っていないならせめて原文を載せてほしいところです。
166:デフォルトの名無しさん
09/05/23 13:52:14
2007で確認したけど、164と同じ。
もしなんだったら、MSDNの原文読めばいいんじゃない?
167:デフォルトの名無しさん
09/05/23 15:21:26
>>165
条件付きコンパイル引数のとこはうちでも空欄
ヘルプも同じ所が同じようにおかしい
168:デフォルトの名無しさん
09/05/23 15:25:33
画像貼るの忘れた
URLリンク(windyakin.if.land.to)
169:デフォルトの名無しさん
09/05/23 15:35:28
セル内の文字列を選択した状態(反転表示した状態)のまま、マクロを実行することはできないのでしょうか?
ツール→マクロをみてもグレーアウトされた状態で実行できません。
170:デフォルトの名無しさん
09/05/23 18:22:20
>>136
今更だが今初めて質問みたのでピラミッドのヒントだけ
1,3,5,7,9と増えていくから必要な”■"は段数*2-1必要。
ループは後ろから回せばよい。
あとはCellsとかResizeとか好みでOffsetとか。
171:デフォルトの名無しさん
09/05/23 18:26:01
ループは頭からでも同じか。
172:デフォルトの名無しさん
09/05/23 19:06:30
一寸だけキモく書くならこんな感じか?
For i=1 To height
For j=1 To height*2-1
Cells(i,j)=IIf(i>Abs(height-j),"■","")
Next
Next
173:デフォルトの名無しさん
09/05/23 20:33:33
>>172
ふつうに数学的に考えるなら
y = n - | x - n/2 | で良いよね nは底辺の長さ n = h * 2
グラフに疎い人だと、ピラミットは垂直二等辺三角形が2つくっついたものだととらえて
x1(i) = h - i x2(i) = h + i y2(i) = y1(i) = h - i (0 <= i <= h)
とするかもしれない。
ピラミットに必要な石の数は孔子にでも聞け。区間[0,n-1]までで上記の式を積分すれば分かる。
174:デフォルトの名無しさん
09/05/23 20:38:21
垂直二等辺三角形
175:173
09/05/23 21:05:14
>>174
どんな三角形だw と思ったら自分で書いてたorz
正しくは"直角"二等辺三角形です
176:デフォルトの名無しさん
09/05/23 21:26:27
For i = 1 To 9
For j = i To 9
Union(Cells(i, j), Cells(j, i)) = i * j
Next
Next
If height * 2 - 1 > Columns.Count Then
MsgBox "列数が足りません"
Else
For i = 1 To height
Cells(i, height - i + 1).Resize(, i * 2 - 1).Value = "■"
Next
End If
177:デフォルトの名無しさん
09/05/23 22:03:49
>>176
union使いたかっただけじゃないのかと。
178:デフォルトの名無しさん
09/05/24 03:18:30
Range("A1:I9").Formula = "=ROW()*COLUMN()"
179:デフォルトの名無しさん
09/05/24 03:46:10
Height = 5
[A1].Resize(Height, 2 * Height + 1).Formula = "=IF((ROW()+COLUMN()>" & Height & ")*(COLUMN()-ROW()<" & Height & "),""■"","""")"
180:デフォルトの名無しさん
09/05/24 03:56:07
Range("A1:J10").Formula = "=IF(ROW()*COLUMN()<>1,(ROW()-(ROW()>1))*(COLUMN()-(COLUMN()>1)),"""")"
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5174日前に更新/136 KB
担当:undef