Excel VBA質問スレ Part11at TECH
Excel VBA質問スレ Part11 - 暇つぶし2ch2:デフォルトの名無しさん
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)),"""")"

181:デフォルトの名無しさん
09/05/24 08:15:08
>>135
ちれすだが、win32 apiを使用すれば可能。
enumwindows等でハンドル取得、sendmessageでコマンド送信する。
概してvbaでやるもんではない。
それよりも自前機能内なら、font選んで使った方が早くないか?
知らんけど。

182:デフォルトの名無しさん
09/05/24 14:09:19
ちょいと見逃してて今読み返してみたが、Win32API使う必要なんて全く無いじゃん

Application.CommandBars("Formatting").Controls("フォント(&F):").Text = "MS 明朝"

Textプロパティに値を代入した時点で、Executeしたのと同じで選択セルのフォントが変更される


継承って概念を理解してないとわかりにくいかもしれないけど、定義上Controlsコレクションが返すのは
CommandBarControlだが、実際にControls("フォント(&F):")が返すのはCommandBarControlを継承した
CommandBarComboBoxなので、CommandBarControlには無いTextやListIndexなどのプロパティが指定できる


上記の書き方では.Textプロパティはコードの自動補完リストには出てこないが

Dim objCommandBarComboBox As CommandBarComboBox
Set objCommandBarComboBox = Application.CommandBars("Formatting").Controls("フォント(&F):")
objCommandBarComboBox.Text = "MS 明朝"

とすればちゃんと補完リストにも出てくる

183:135
09/05/24 15:54:03
>>181
ありがとうございます。実際には罫線ツールバー上にある「罫線の作成」「罫線グリッドを作成」の
線スタイルと線の色を選択したかったんです。
とりあえず罫線の作成を使うのはあきらめて、Bordersで選択セルに線引くマクロ作って代用しました。

184:デフォルトの名無しさん
09/05/25 21:57:57
質問です。

ユーザーフォーム上のコンボボックスでリストの中から
選択すると、その文字が全選択された状態になります。

これを解除してカーソルの状態にするにはどう記述す
ればいいのでしょう?

185:デフォルトの名無しさん
09/05/26 05:25:55
ComboBox1.SelStart = Len(ComboBox1.Text)

186:デフォルトの名無しさん
09/05/26 08:31:22
>>185
ありがとうございました。

187:デフォルトの名無しさん
09/05/26 18:33:19

自分では、セルA1の値が75以上で合格、90以上で優秀、
それ以外は不合格になるプログラムを書いたつもりなのですが、
セルA1に100を入れても、合格になってしまいます。
どこがダメですか?


Sub 条件判断()
Dim i As Integer
i = Range("a1")
If i >= 75 Then
Range("b1").Value = "合格"

ElseIf i >= 90 Then
Range("b1").Value = "優秀"

Else
Range("b1").Value = "不合格"
End If

End Sub

188:デフォルトの名無しさん
09/05/26 19:07:03
>>187
Sub 条件判断()
Dim i As Integer
i = Range("a1")
If 90 > i And i >= 75 Then
Range("b1").Value = "合格"
ElseIf i >= 90 Then
Range("b1").Value = "優秀"
Else
Range("b1").Value = "不合格"
End If
End Sub

189:デフォルトの名無しさん
09/05/26 19:28:32
>>188
ありがとうございます。

>>186 の式だと、ElseIf の文が評価されずに終わるから、ダメ。

という理由で合ってますか?

190:デフォルトの名無しさん
09/05/26 19:30:32
>>189
訂正です

186 ではなくて、 >>187でした。
すみません。

191:デフォルトの名無しさん
09/05/26 19:40:50
>>189
If i >= 75 Thenの時点で100の判定はされているので
ElseIf i >= 90 Thenの部分は評価されません。

こう書いた方が分かりやすかったかも
Sub 条件判断()
Dim i As Integer
i = Range("a1")
If i >= 90 Then
Range("b1").Value = "優秀"
ElseIf i >= 75 Then
Range("b1").Value = "合格"
Else
Range("b1").Value = "不合格"
End If
End Sub

192:デフォルトの名無しさん
09/05/26 22:06:07
こういうパターンは、Select Caseで書く方が判り易いかな。
そして判り難い書き方の例。
Range("b1").Value = Choose(1-(i>=90)-(i>=75),"不合格","合格","優秀")

193:デフォルトの名無しさん
09/05/26 22:17:26
「分かりやすい」感覚の押しつけには反対です。

194:デフォルトの名無しさん
09/05/26 22:21:17
分かりやすいって書く前にコードを書いてみたらいいじゃない
その方がどちらが分かりやすいか「分かりやすい」だろう

195:デフォルトの名無しさん
09/05/26 22:23:17
おれならElseIfは使わないかな

If i >= 90 Then
  優秀
Else
  If i >= 75 Then
    合格
  Else
    不合格
  End If
End If

196:デフォルトの名無しさん
09/05/26 22:24:00
VBAで
たとえばExcelで
Z11に文字が値が入力されていたらA1~Z11を全選択
A40000に文字が値が入力されていたらA1~A40000を全選択する文を記述したいのですが
これってどうすればいいのでしょうか?

197:デフォルトの名無しさん
09/05/26 22:34:12
>>196
うーん・・マクロの記録で
ctrl+end
と同じってこと?

198:デフォルトの名無しさん
09/05/26 22:44:38
UsedRange.Selectで解決しそうな予感

199:デフォルトの名無しさん
09/05/26 22:44:39
ファイルの検索やフォルダの検索ってできますか?

あるルートフォルダから、以下何階層に渡ってフォルダが作られているかは不明で、
指定した文字を含むファイルをルート以下から探して、返したいんだが。。。
全てを探して、名前を含むリストを作りたいんだよね。

200:デフォルトの名無しさん
09/05/26 22:49:33
とりあえず、FileSearchオブジェクトは使用禁止と言っておく。
Office2007で廃止する気満々だったので。

201:デフォルトの名無しさん
09/05/26 22:55:02
とうとう俺がVBAに本気出すことにした。
今はまだひよっこだが、いずれ大鷲となって羽ばたいた時
おまえら大鷲先生と呼べよ。

202:デフォルトの名無しさん
09/05/26 23:00:54
飛んでから言えよw

203:デフォルトの名無しさん
09/05/26 23:01:46
何か知らんががんばれよ
俺は配列で飽きてC言語やってるわ

204:デフォルトの名無しさん
09/05/26 23:03:22
>>199
そのマクロどっかで配布されてた。


205:デフォルトの名無しさん
09/05/26 23:11:21
Excel VBA FileSearchでぐぐると
Dir関数とかの話がでてくるよ

206:デフォルトの名無しさん
09/05/26 23:47:16
FileSearchってのは使わない方がいいのは何故なんでしょう?

207:デフォルトの名無しさん
09/05/27 00:06:07
URLリンク(www.google.co.jp)


208:デフォルトの名無しさん
09/05/27 00:12:10
質問です。

Functionプロシージャに渡したい引数が多い場合、構造体を作って
Public Type UserType
  a As integer
  b As Long
  c(10) As String
End Type

Sub AAA()
  Dim data As UserType
  Call BBB(data)
End Sub

Function aaa(ByRef data As UserType)
 '処理
End Function

のように構造体ごと渡してやればスッキリしますよね。
この時dataの中身を値渡しのように使いたいとしても、参照渡しとなるので
Functionプロシ-ジャの中でdataの中身が書き換えられる恐れはありますよね?
構造体を渡すけれども、値渡しとして使うという明示的な方法はあるのでしょうか?

宜しくお願いします。

209:デフォルトの名無しさん
09/05/27 07:41:08
>>208
基本的には無い。やるとしたら以下の3つかな?
①コーディングルール徹底(コメントを残して従う、関数名 etc)
②予め構造体をコピーしておく
③構造体ではなく、必要データだけ渡す

もしかして、byval渡しなら出来たりして。
けど、VBAに限らず上の3つは基本だと思う。

210:デフォルトの名無しさん
09/05/27 20:37:10
W2K XL2000 配列から重複データを排除しユニークなデータの集合にする方法を教えてちょんまげ

211:デフォルトの名無しさん
09/05/27 20:52:04
>>210
スレ違い>>4★5★6

212:デフォルトの名無しさん
09/05/27 22:04:46
>>210
dictionary使う。

213:デフォルトの名無しさん
09/05/27 22:09:44
ユニークといえばモニーク

214:デフォルトの名無しさん
09/05/28 03:34:49
>>210
ワークシートに並べてフィルタかける

215:デフォルトの名無しさん
09/05/28 09:01:13
>>214
オートフィルタとかワークシート関数とかを如何に活用するかが
ExcelVBAの醍醐味

216:デフォルトの名無しさん
09/05/28 18:33:58
>>215
そうだね。
となりに=COUNTIF($A$1:A1,A1)が1になってるとことか、=MATCH(A1,A:A,0)=ROW()がTRUEになってるとこをオートフィルターにかけりゃいいもんな。

217:デフォルトの名無しさん
09/05/28 19:25:09
配列まで使えるってことはVBAをそれなりに使えると考えられるわけで
既に存在する配列からの削除って事は
フィルタかけるくらいなら取り込み時点で排除する方法を採っているだろうと予想できるわけで
CreateObject(Scripting.Dictionary)はこれ自体の機能はスマートだけど
結局配列に戻さないといけないから実用レベルで組み込むとコードが鬱陶しいんだよね。
なんか実務家ならではの回答ってないの?おまえら

218:デフォルトの名無しさん
09/05/28 19:32:50
dictionaryに放り込んでから配列に戻すのが面倒だと感じるならば、
重複判定を積んだ配列に放り込めば良いじゃない。

配列を複数持つ事を嫌うならば、クイックソートで配列を並び替えて、
重複した場合に削除すりゃ良い。
これはワークシートでやってる事と一緒だけどね。

個人的には、作業用配列を作る事に違和感を感じないんで、
別配列に重複判定しながら放り込むけどな。

219:217(210)
09/05/28 19:48:25
いいですね。教えてちょんまげ。
まず「配列に重複判定を積む」ってどうやるんですか?
それから、配列から配列を作ろうとする場合、まず二重ループでの処理を思いつくけど
配列を二重ループ内に組み込むとエラーが出ちゃいますよね。
これ、どうやって回避、あるいはどんな他の方法を採ってますか?

220:デフォルトの名無しさん
09/05/28 20:02:41
1次元配列で良ければDictionaryのKeysメソッドで何も面倒なことないんでない?
別の2次元配列なら重複判定しながら放り込んだ方がいいけどな。

221:デフォルトの名無しさん
09/05/28 20:25:20
Scripting.Dictionaryがハッシュ使ってて性能いいんじゃね?

222:デフォルトの名無しさん
09/05/28 20:53:30
>>221
データによるね。
あまりにも多いとCollectionに負けるし、クイックソートして詰める手法にも負ける。

223:デフォルトの名無しさん
09/05/28 21:09:02
Dictionaryで重複を弾くのは裏道を抜ける感じがするんで、
論理的思考を養う段階のレベルならば、Dictionaryを避けて配列使った方が良いかもなぁ。

でも、pushがデフォルトで搭載されてない言語だから、ステップ数増えるよね。
Dictionaryでもいいかな・・・とも思う。難しいのぉ。

これを機会にクイックソート覚えるのもいいかもね。

224:デフォルトの名無しさん
09/05/28 21:19:37
CreateObject("System.Collections.SortedList")は?

225:デフォルトの名無しさん
09/05/28 21:22:06
文字列データはいいとして、ある決まった範囲の整数にまでDictionaryを使うやつはアホだね。
猫も杓子もCreateObject(Scripting.Dictionaryを見るとうんざり。

226:デフォルトの名無しさん
09/05/28 21:26:35
> なんか実務家ならではの回答ってないの?おまえら
スレ違いだからコードそのものは伏せるけど、重複削除の汎用関数作って、
それに放り込むだけだろ

ワークシートの機能とかScripting.Dictionaryとか使えない言語でも
この手の処理は必要になるから、ちゃんといくつかのアルゴリズムが確立されている

ソートみたいに、計算量、必要バッファ量、順序の維持(ソートで言うところの安定ソート)など
それぞれ特徴があるから、必要なアルゴリズムを必要な言語に書き換えて用意して
おけば良いだけの話

227:デフォルトの名無しさん
09/05/28 21:31:06
>>226
それがどれなのか分からないから教えてくださいって話じゃね
教えてくださいよ先輩

228:デフォルトの名無しさん
09/05/28 21:32:39
しかしExcel2007の新機能の重複の削除はひどいな。
どっかで見て俺も試したら笑ってしまった。
重複してないものまで削除することあるんだもんな。

229:217(210)
09/05/28 21:33:53
いろいろありがとう。
>重複削除の汎用関数作って
理想としてはこれでやりたいんだけど、
Functionとの間での配列の引渡し方・受け入れ方が分からないんですよ…

230:デフォルトの名無しさん
09/05/28 22:11:21
>>229
もう総当たりでやれよ。関数化は後の話だ。
関数化するにも、自前でルーチン作成出来なきゃダメなんだしさ。

forで 配列1 から 配列2 に全要素をコピーするだけだ。
その時に、配列2に対象の要素が含まれていない時って条件付けるだけ。
総当たりでやるのが論理的には一番理解しやすい。

先ずはここから入って、処理速度や負荷の問題が見えてきたら、
その状況に応じて別のルーチンを考えれば良いと思うよ。

231:デフォルトの名無しさん
09/05/29 09:41:11
そういえば、2007で.netってサポートされてるの?
使える雰囲気が全然無いんだが、2010では.netのサポートがあるかな?
次期Officeにはほかの言語もサポートしてもらえるとうれしいな。

232:デフォルトの名無しさん
09/05/29 10:02:32
質問です。

コマンドボタンを押すとへこんだままになってしまいます。
処理は正しく実行されて、もう一度押すとまた処理が実行された後に元に戻ります。
使う上で問題は無いのですが、直したいです。
設定が悪いのでしょうか?

233:デフォルトの名無しさん
09/05/29 10:08:25
それ、コマンドボタンじゃなくてチェックボックスだろ

234:デフォルトの名無しさん
09/05/29 10:15:42
いえ、コマンドボタンです。
確認したら処理は最後まで実行されていたんですが、
見た目だけだと処理がフリーズして止まっている様な感じになります。


235:デフォルトの名無しさん
09/05/29 10:27:16
解決しました。
今あるボタンを消して新しく作ってみたら直りました。

236:デフォルトの名無しさん
09/05/29 10:38:56
作り直して解決って事はやっぱりチェックボックスだったんだろうな
グラフィックは全く同じだし、押し下げでも上げ戻しでもClickイベント発生するし

237:デフォルトの名無しさん
09/05/29 14:18:22
>>231
VSTO使えば.netFrameworkの恩恵をフルに享受することができる。
あまり流行ってないけどね。

238:デフォルトの名無しさん
09/05/29 17:50:30
Excel2003のVBAで新規のbookを作ってファイル名を
YYYYMMDDhhmmssにしたいのですが、

Wbook_out = Year(Date) & _
Right("0" & Month(Date), 2) & _
Right("0" & Day(Date), 2) & _
Right("0" & Hour(Now), 2) & _
Right("0" & Minute(Now), 2) & _
Right("0" & Second(Now), 2)

もっと適当な命令や定番テクニックってないですか?

239:デフォルトの名無しさん
09/05/29 18:30:47
>>238
=Format(Now,"YYYYMMDDHHMMSS")

240:238
09/05/29 18:39:35
>239

ありがとうございました(ペコリ

241:デフォルトの名無しさん
09/05/29 18:43:43
今、VBAの勉強してるんですが、自分は仕事しててこういう時にVBAが役立った
という経験があったら教えていただきたいのですが。。

242:デフォルトの名無しさん
09/05/29 18:59:16
VBAのおかげで彼女が出来ました!

243:デフォルトの名無しさん
09/05/29 20:22:10
>>241
・古いファイルの正規化
・プリンタの変更→印刷→プリンタの変更、をボタン一つで出来るようになったこと
・他人に作ったシートには関数を入れず、ボタンを押して計算させるようにしたこと(何度言っても計算式の入ってるセルに上書きするアホウがいる為)
・ファイル名の一部をシート名にする、等
・彼女は出来・・ねーよwただ仕事上、仲良くなるきっかけにはなったかもしれない
他細かいことは色々あるけど、とにかくまぁ色々便利。特に中小企業でマクロ使えればかなり便利じゃないかな
逆に大企業だと使う場面が無いかと。VBA無しのアクセスの方がよっぽど使う機会が多かった

244:デフォルトの名無しさん
09/05/29 20:29:39
テキストエディタのマクロや正規表現は結構使うけど
Excelのマクロとか、セキュリティ云々でうるさいからあまり使わないなぁ。

245:デフォルトの名無しさん
09/05/29 20:56:05
>>241
VBAのおかげで持病が治りました

246:デフォルトの名無しさん
09/05/29 20:56:47
Sub hoge()
    Dim hoge As Range
   
    If (hoge Is Nothing) Or (hoge.Value = 0) Then
        Exit Sub
    End If
End hoge
なぜかエラー出る@2007

247:デフォルトの名無しさん
09/05/29 21:00:25
>>246
Sub hoge()
Dim hoge As Range
Set hoge = Range("a1")
If (hoge Is Nothing) Or (hoge.Value = 0) Then
Exit Sub
End If
End Sub

set

248:デフォルトの名無しさん
09/05/29 22:32:13
>>247
hogeに値を代入してないのは、値を読み出そうとしたときにエラーを起こさせるためだよ。
VBAはデフォルトでショートサーキット評価ではないみたいだね。
URLリンク(msdn.microsoft.com)(VS.80).aspx
ショートサーキットで評価をするにはOrElseをつかえということだけど
VBAではこれまた制限されてるみたいだね。
If hoge is Nothing then exit sub
if hoge.Value == 0 then exit sub
と分けて書くしかないかな?




249:デフォルトの名無しさん
09/05/29 22:48:53
何をやりたいのか分らんが、こういうことじゃないよなぁ。
Select Case True
  Case hoge Is Nothing, hoge.Value = 0
    Exit Sub
End Select

250:246
09/05/29 23:31:58
>>249
おお、それだ。
Select Case Trueとか、なんて変態的なんだw
Delphiのcase Integer of (Cのunionと同義)を思い出させるぜ。

なんかトリッキーすぎて分かりにくいなあ。VBAではこういう書き方って一般的なの?
それとも、Ifを連ねて書く方が一般的?

251:デフォルトの名無しさん
09/05/29 23:53:18
オレはIf~Elseを並べてる

252:デフォルトの名無しさん
09/05/30 00:39:40
>>250
VBAではごく一般的だと思うけどな。

253:デフォルトの名無しさん
09/05/30 00:55:27
言語によってスパスパ頭切り替えられない奴は
向いてないと思う。

254:デフォルトの名無しさん
09/05/30 00:55:38
職場のEXCEL2000で使うためのマクロを作っています
マクロ自体は自宅の2003で組んでいます。OSはどちらもXPです。

D2とA5のセルにそれぞれ値が入っているときに、D5のセル位置を取得する方法ってありませんか?
Ctrl+Endで移動する位置を取得したいのです。
ActiveSheet.UsedRangeでいけるかなと思ったのですが、セルが飛び飛びで利用されている場合だと
うまく機能しないときがあるようです。


255:デフォルトの名無しさん
09/05/30 01:00:33
>>254
URLリンク(www.niji.or.jp)

256:デフォルトの名無しさん
09/05/30 07:39:32
>>241
SQL Server とのやり取りが多いから、使わないと仕事にならねぇ
検索結果をExcelにはくことが多いから
#数万行出す場合、他アプリから出力すると遅さに耐えられないw

テキスト取り込んで簡単な集計する場合とか、ボタン一発のほうが楽じゃね?
#簡単じゃない集計はDBに入れてから処理する

worksheet関数を鬼のように駆使する人は、ある意味すごいと思うけど
VBA使ったほうが、楽になるのに・・と思う場合が多い
後でメンテする場合、Cellを延々と追いかけるの、めんどくないかなと思うんだわ
#いや、自分はめんどくさがりや だから
#まぁ コード書くのが本職なんだけどねw

257:デフォルトの名無しさん
09/05/30 07:49:05
数式が長くなると一覧できなくなるのと
コメントが書けないのがワークシート関数の欠点かな
関数一発でいきなり動いて結果が出る手軽さとどっちを取るかだね

258:デフォルトの名無しさん
09/05/30 08:56:42
delete押すだけで消えてしまうのも怖い

259:デフォルトの名無しさん
09/05/30 09:19:01
保護

260:デフォルトの名無しさん
09/05/30 21:29:03
行がたくさんあってゴチャゴチャしてるシートの視認性を良くするために
選択したセルのある行に一時的に色をつける処理を考えてるんですが
Private SubWorksheet_SelectionChange(ByVal Target As Range)

261:デフォルトの名無しさん
09/05/30 21:34:59
誤送信失礼。
行がたくさんあってゴチャゴチャしてるシートの視認性を良くするために
選択したセルのある行全体に一時的に色をつけようと考えてるんですが

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Rows(ActiveCell.Row).Interior.ColorIndex = 37
End Sub

でとりあえず色はつけられたものの
カーソルを移動した後もその行は色がついたままになってしまうので
どうにか消せないものかと考えてるんですが、何か方法はありませんでしょうか?

262:デフォルトの名無しさん
09/05/30 21:52:08
消す処理入れてないんだから消えないのは当然でしょ?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Cells.Interior.ColorIndex = xlNone
   Rows(ActiveCell.Row).Interior.ColorIndex = 37
End Sub

但し、行強調以外の色つけも全部消えるからね
それじゃ困るというならあとは自分で工夫しな

263:デフォルトの名無しさん
09/05/30 21:57:04
VBA以前にレイアウトを考えたほうが良いんじゃね?

264:デフォルトの名無しさん
09/05/30 21:59:14
あー、なるほど
色をつける前に全消ししてしまえばいいんですね
色をつけたあとに前に選択していた行だけを消そうと考えていたせいで思いつきませんでした
ありがとうございます

265:デフォルトの名無しさん
09/05/30 23:54:29
ワークシートの右端の列にフラグを入れるとか

266:デフォルトの名無しさん
09/05/31 00:01:11
>265

ダッセw

267:デフォルトの名無しさん
09/05/31 08:07:29
>>261
実際にやってみると分かるけど、すげー重いぞそれ。
とても実用化出来ないほど重い。

268:デフォルトの名無しさん
09/05/31 08:49:31
余程化石なPC使ってるか、余程システムかExcelが腐ってる状態で使ってるんですね

269:デフォルトの名無しさん
09/05/31 15:09:59
昔は>>261>>262みたいなのは重くて使えなかったのは確かだが、今のパソコンはそれほどでもないんじゃない?
Excel97が出たころは一工夫して下みたいな十字カーソルをやってた。
もっともExcel97はTargetじゃなくSelectionだったかも。

Dim rng As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not rng Is Nothing Then
  rng.Interior.ColorIndex = xlColorIndexNone
End If
With Target
  Set rng = Union(.EntireRow, .EntireColumn)
End With
rng.Interior.ColorIndex = 8
End Sub

今のExcelは行列番号の色がはっきり違って目立つから全然必要ないと思うんだが。

270:デフォルトの名無しさん
09/05/31 16:34:43
実はたいして変わらないんだけどね

271:デフォルトの名無しさん
09/05/31 18:26:20
他ファイルを処理するプログラムの初期処理で、
選択範囲を保管しておきたいです。

選択範囲がセルなら、Selection.Address
選択範囲が図形なら、Selection.Name

を保管しておけばいいのだろうけれど、
値にアクセスする前に型を判別できないのでエラーになってしまう。
どうしたらよかんべ?

272:デフォルトの名無しさん
09/05/31 18:34:20
>>271
なんでわざわざAddressやNameを保持するの?
Selectionそのものを保持すればいいだけじゃん

Dim hoge As Object

Sub 選択保持()
  Set hoge = Selection
End Sub

Sub 選択復元()
  hoge.Select
End Sub

273:デフォルトの名無しさん
09/05/31 19:09:00
>>272
サンクス。

Rangeオブジェクトのときは上手くいくのだけど、
画像などの場合、他の箇所で切った貼ったを行ってしまうと、
PictureクラスのSelectメソッドが失敗してしまう。

なので、質問したようなやり方をしたいのだ。

274:デフォルトの名無しさん
09/05/31 19:27:31
>>270
今はたいして変わらんかも知らんが、昔の低スペック機では全然違ったのよ。
いったん全部色を消すのは使い物にならなかった記憶がある。

275:デフォルトの名無しさん
09/05/31 19:57:25
>>269のコードと、普通に書いた下のコードを比較してみれば分るな。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Cells.Interior.ColorIndex = xlColorIndexNone
With Target
Union(.EntireRow, .EntireColumn).Interior.ColorIndex = 8
End With
End Sub

2007でA1:J100を順番にSelectさせてみたら、こっちは約10秒で>>269は約2秒だった。
5倍くらい違うということか。
今の高スペック機じゃ一回では体感できないが昔ははっきり体感できたもんな。

276:デフォルトの名無しさん
09/05/31 21:25:29
>>273
セルと図形って言ってただろ?
なんで画像が出てくるんだ?

277:デフォルトの名無しさん
09/05/31 21:28:48
>>275
現行機で0.93秒と、1.75秒だった
10年以上前のPen3 450MHzでも1回当たりの体感に差はない

278:デフォルトの名無しさん
09/05/31 21:54:28
>>277
バージョンによってCellsとかの扱いが違うのかもよ。
とにかくExcel97で275みたいなのは使い物にならなかったのははっきり覚えているよ。
あまり絡むなよ。

279:デフォルトの名無しさん
09/05/31 22:24:30
覚えていること(人の記憶)と、リアルタイムで実践したことでは
当然ながら後者に信憑性があることは言うまでもないわけで。
あまり絡むなよ。

280:デフォルトの名無しさん
09/05/31 22:27:47
本当に嫌な性格だねぇ。
Pentium3の発売が何年か知ってるのかよ。
97年当時Pentium3 450MHzなんてないんだよ。

281:デフォルトの名無しさん
09/05/31 22:33:18
粘着君が97年当時のパソコンをヤフオクで買い求めたりしてw

282:デフォルトの名無しさん
09/05/31 22:38:15
Office97が出た頃にはWindows98の話題が出ていた
多くの人はWin95にOffice97パッケージを乗せずに、
Win98もしくはWin98SEとOffice97が入ったマシンに買い換えた
1999年、Pentium IIIが現れWin98の情報も溢れてきた頃に

283:デフォルトの名無しさん
09/05/31 22:55:11
というか、277は10年以上前のPen3 450MHzって書いてるだけで、10年前にPentium3が無かったってなら
突っ込むのも解るが、10年前にはPentium3の550MHzが出てたし、280は何で絡んでるのかよくわからんな。

284:デフォルトの名無しさん
09/05/31 23:03:41
>>283
話の流れを良く読め。

285:デフォルトの名無しさん
09/05/31 23:09:39
277=279だったら277が粘着してるが、別人だったら>>283の言う通りだね。

286:デフォルトの名無しさん
09/05/31 23:13:12
というか、件のコードが当時は使い物にならなかったってことにしようと
約一名が躍起になってるだけのように見えて痛々しい

287:デフォルトの名無しさん
09/05/31 23:18:41
と約1名が躍起になってるようですね。
ほんと痛々しいね。

288:デフォルトの名無しさん
09/05/31 23:20:39
>>280
化石引っ張り出してきたよ
12年前のPen2 233MHzでも1回当たりの体感に差はない

カーソルキーで連続移動すれば体感差あるけど
カーソルキー移動1回、もしくはマウスクリック1回に置いて
色の切り替わり速度に違いは感じられない

289:デフォルトの名無しさん
09/05/31 23:24:34
結局認めてるじゃん

290:デフォルトの名無しさん
09/05/31 23:28:35
まぁ1回ではって書いたの俺だから、俺が悪かったよ。
気が済んだか?


291:デフォルトの名無しさん
09/05/31 23:30:43
> 今の高スペック機じゃ一回では体感できないが昔ははっきり体感できたもんな。

292:デフォルトの名無しさん
09/05/31 23:32:54
>>289
話の流れを良く読め。

293:デフォルトの名無しさん
09/05/31 23:33:55
だから1回ではってのは間違いだよ。すまんね。
使い物にならないのは>>268も書いてる通りだ。


294:293
09/05/31 23:34:53
>>268じゃなくて>>288な。

295:288
09/05/31 23:36:45
残念、使い物になってるけど

296:デフォルトの名無しさん
09/05/31 23:37:00
どっちもファイト!

297:デフォルトの名無しさん
09/05/31 23:37:27
>>276
Excelのオブジェクトでは、図形に画像は包含されるから。
Shape > Picture
紛らわしい書き方だったか。

298:通りすがり
09/05/31 23:38:33
いやそもそも
>>288
は真実か?
先ずはそこから検証だ

299:デフォルトの名無しさん
09/05/31 23:40:22
通りすがり
わざわざ書くのは
自作自演

字余り

300:デフォルトの名無しさん
09/05/31 23:43:56
>>299
お前かわいそうなやつだなぁ。
まぁ自作自演じゃないのが分るのは2名だけだけどな。

301:デフォルトの名無しさん
09/05/31 23:46:07
図星か

302:デフォルトの名無しさん
09/05/31 23:49:06
本当の通りすがりは、わざわざ通りすがりであることを
強調する必要もないからな。
当人ではなく第三者的な意見だって事に
しておきたい場合の策だったんだろうがバレバレすぎるw

303:通りすがり
09/05/31 23:49:12
違うんだけどな
このIDの無い板で自作自演をするのに
わざわざハンドル名付ける必要も
そもそも自作自演する必要も無いんだけどな

304:デフォルトの名無しさん
09/05/31 23:52:03
本当に通りすがりなら、勘違いしてる奴なんて放っておけば良いのに
必死に弁明するから実は通りすがりじゃないことが立証されていく
まさに泥沼

305:デフォルトの名無しさん
09/05/31 23:53:31
>>3.02は普段さんざん自作自演やりまくってるんだよ。
自分がやってるから他人もそうだと思っちゃうかわいそうな人なんだな。

306:デフォルトの名無しさん
09/05/31 23:54:06
>>304
おめー病院逝けよ。

307:デフォルトの名無しさん
09/05/31 23:55:05
> >>3.02
そんなに焦らず、そんなに怯えずに

308:デフォルトの名無しさん
09/06/01 00:03:01
自己を誤魔化しきれなくなると相手の罵倒に走る、正に王道パターンw

309:デフォルトの名無しさん
09/06/01 00:12:16
おまいら会って喧嘩しろよ。
勝った方が正義だw
ファイト!

310:デフォルトの名無しさん
09/06/01 00:16:48
というかその前に静かになっちゃったね
自演で1回線2,3役やってたから連投規制でも喰らったかな

311:デフォルトの名無しさん
09/06/01 00:26:53
かわいそうな人。

312:デフォルトの名無しさん
09/06/01 00:43:01
ほんと、かわいそう

313:デフォルトの名無しさん
09/06/01 01:48:00
>>269>>275を比較してみた。
A1~J100をループを回してセレクトしてみた。

まずどちらもまっさらなシートで計ったら
>>269 2.2秒
>>279 11秒

次に両方のシートのA1:J5000に"a"と入力してから計ったら
>>269 10.59秒
>>279 23.44秒

>>288はどういう計り方したの?


314:デフォルトの名無しさん
09/06/01 02:06:30
すまん、>>269>>275ね。
ちなみにA1:S10000に入力したら12秒と40秒だった・

315:>>261
09/06/01 07:23:35
>>267
会社のパソコンでやってみたらなんか処理重いなと思って来てみたら
俺のへっぽこコードのせいで変な議論になっちゃったみたいですね・・・

消すほうも塗るほうも範囲を指定すれば軽くなるのかな?

316:デフォルトの名無しさん
09/06/01 07:34:06
良く分からんけど、changeの度に200ms以上のラグが発生したらNGだな。


317:デフォルトの名無しさん
09/06/01 07:59:23
性能が高すぎるんじゃね?
比較するなら短い方が最低でも2,3秒になるように範囲を調整した方がいいかも。
値が小さくなるほど誤差の影響は大きくなるから。

あとは2007ではなく2003だと、差が少ないのかも知れない。
うちはメインもサブもXPに2003だけど、A1:J100で5回の平均取ったら

メイン 1.6秒:3.9秒 2.43倍
サブ  2.3秒:7.1秒 3.08倍

A1:J200だと

メイン 2.9秒:8.6秒 2.96倍
サブ  4.6秒:14.1秒 3.06倍

って結果になったよ。約3倍ってところで、2003なら5倍までの差は無いみたい。

318:デフォルトの名無しさん
09/06/01 08:16:53
>>315
気にするな、基地外が一人紛れ込んできただけらしいから。
Excel2000で>269と>>275比べて見たが、はっきり体感差があるよ。
>>277>>288はシートの上の方の行でしか比べてないんだろう。
>>313のように入力して最終行近くで比べれば1回でもはっきり分かる。
A1~J100をSelectさせてみたら>>269が8秒で>>275が66秒だった。
Pentim D 2.8GHzの結構古いパソコンだけど、もっと昔のExce97当時の
パソコンなら多分>>275は後ろの行ではとろくて使えないと思う。

319:デフォルトの名無しさん
09/06/01 08:23:23
>>316
だよな。おれも0.2秒ならストレス感じるよ。
しかし最近はSUMPRODUCTなどで鍛えてる人多いから、そういう人たちは我慢強いかもね。

320:318
09/06/01 08:41:57
ごめん、>>313のように入力範囲が広ければ別に最終行近くじゃなくてA1近くでもはっきり体感差があるね。

321:デフォルトの名無しさん
09/06/01 09:34:35
>>320
1回65536行目近くに移動してから1行目近くににもどった場合>>275は重くなるんじゃじゃね?
1行目近くで軽くするにはオブジェクト変数にMe.UsedRangeをセットすればいいみたいよ。
65536行近くだとやっぱ重いけどな。

322:318
09/06/01 09:49:56
>>321
トンクス
試してみたら確かにそうだった。
最初はたしかA1近くでは重くなかったはずなのに途中で重くなったのでおかしいと思ったよ。
なるほどUsedRangeね。

323:デフォルトの名無しさん
09/06/01 11:25:22
>>317
結構速いね。
俺はCore 2 Duo3.33GHzだがそちらのサブ機より約3倍近く遅い。
Vistaがクソなのか?
ところで>>313が書いてるように広範囲に入力したの?

324:デフォルトの名無しさん
09/06/01 12:45:14
しかし>>269をさんざん罵倒してたやつある意味すごいよな。
他人の言うことは端から聞く耳持たないらしいけど、変な自信はたっぷりあるんだろうね。
負けることは絶対に許されない人かも知らんね。
前からここや総合相談所に統合失調症の疑いがあるやついるんだが彼かもね。

325:デフォルトの名無しさん
09/06/01 13:19:26
>>323
広範囲に入力しなくても最終行に飛んで1行に戻ってくるだけで重いみたいね。

326:デフォルトの名無しさん
09/06/01 14:02:31
>>325
だったね。

327:デフォルトの名無しさん
09/06/01 16:48:51
速度厨 uza

328:デフォルトの名無しさん
09/06/01 17:44:02
間違いをuzaで済ませられる性格がうらやましいね。
おれなんか落ち込んで死にたくなるよ。
そこをこらえて謝るけどな。

329:デフォルトの名無しさん
09/06/01 17:46:02
一連の気違い発言が327じゃなかったらすまんね。

330:デフォルトの名無しさん
09/06/01 20:07:30
>>324
>>269を罵倒してる奴なんて一人も居ないよ。

>>269の方が優れていることは認めた上で、>>262でも
使い物にならないほど遅くはないって話をしてるだけ。

会社でいつも怒られまくってて被害妄想気味なのかもしれないけど
誰も>>269を責めても攻めてもいないから、よく話を読もうね。

331:デフォルトの名無しさん
09/06/01 20:17:39
来たね。w
もう見苦しいからいい加減やめようや。
会社員ねぇw

332:デフォルトの名無しさん
09/06/01 20:46:01
とりあえず落ち着こう。

333:デフォルトの名無しさん
09/06/01 20:48:06
今頃>>262が使いものになるってアホでつか?
使い物にならない事例がさんざん書かれてるのに見てないのかな。
ほんと見苦しいいいわけにしか見えないや。

334:デフォルトの名無しさん
09/06/01 20:58:00
>>333
まぁまぁ。
辛抱強い人には200m秒はおいて数秒のレスポンスでも遅いと感じないかも知れないんだから。
人それぞれだよ。

335:デフォルトの名無しさん
09/06/01 21:07:01
>>334
なるほどね。
スローライフの人か。

336:デフォルトの名無しさん
09/06/01 22:23:20
For i = 0 to 20000
   Cell.Interior.ColorIndex = Int(Rnd()*20)
Next i
したらマジで気分悪くなってきた

337:デフォルトの名無しさん
09/06/01 22:44:50
>>336
最新のExcelはCellsじゃなくてもいいのか

338:241
09/06/02 00:36:45
>>243
>>256

今更だけど、どうもありがとう。
勉強初めて一ヶ月経ったけど、ただテキストを最初から読んでいくだけだと、
あまり身につかないものですね。

VBAを使って何をどうしたいという動機が必要なのかな?

339:デフォルトの名無しさん
09/06/02 02:09:20
>>337
タイポだ。まあ気にしないでくれ。

340:デフォルトの名無しさん
09/06/02 05:02:32
時代の変化を受け入れられないんだね

341:デフォルトの名無しさん
09/06/02 09:40:02
PowerPointのVBAなんだけど、他所にないようなのでここで質問させてほしい。

PowerPointでファイルを開いてVBAを使った処理をするんだけど、
PowerPointにはExcelのGetOpenFilename()に相当するものが存在しないので、
コマンドバーを使ってファイルを開くダイアログを出してみた。
 Application.CommandBars.FindControl(ID:=23).Execute
これを実行してみると、ダイアログを呼び出してすぐに次の命令に進んでしまう。
つまり、新しくファイルを開く前に先に進んでエラーになってしまう。
今はブレークポイントを設定しておき、ファイルを開いてから再実行するということをしている。

タイマーを使うとか考えてみたけど、どうも現実的ではない。
何とかうまくやる方法はないだろうか。

342:通りすがり
09/06/02 09:55:39
>>341
>>92は駄目?

343:デフォルトの名無しさん
09/06/02 09:57:30
ごめん
これ
閉じてから再実行でした

344:デフォルトの名無しさん
09/06/02 12:27:25
>>338
作りたいものを作って、少しずつ改良していくのがいいと思う

345:デフォルトの名無しさん
09/06/02 13:04:19
>>338
やりたいことがわからないで勉強しても無意味だよ
学校に通ってても英語の勉強が今では何の役にも立たないのと一緒

毎回これやるのめんどくせぇな、、、、なんとかならんかな、、、
からvba勉強し始めると
ここの人の手助けもあって2週間位で株の自動発注から返済までが組めるようになった

346:デフォルトの名無しさん
09/06/02 14:09:08
株ねぇ
そういえば俺の尊敬する株屋さんどこ行っちゃったんだろうな。
某Q&Aサロンで女性になりすまして活躍してるという噂を聞いたが。

347:デフォルトの名無しさん
09/06/02 18:21:01
さっき図書館でSE関係の新刊があったのでパラパラとめくりながら読んでたら、
”VBAにいくら習熟しても金にならないから、優秀な人はどんどん他の言語に移っていく。
VBAは下っ端の奴がやらされる仕事だ。”
みたいな意味の事が書いてあった。

薄々、同じような事を思ってたけど、いざ活字で目にするとショックだ。


348:デフォルトの名無しさん
09/06/02 18:52:54
質問です。

少し時間のかかる処理をさせているんですが、
その処理が動いてる間、
ボタンなしのダイアログ等で『処理中』と表示させ、
処理が済んだら自動で消す、
といったような事はできますか?

349: ◆.jruuB3RTA
09/06/02 19:06:59
Cells(Rows.Count,1).End(xlUp).Select

Endプロパティは連続したデータ範囲の終端セルを返すので、
表の途中に空白セルがあるとデータを返せない。
と、テキストには書いてあるのですが、
空白セルがあったら、Null値とか文字列とかを入れるプログラムは書けませんか?

350:デフォルトの名無しさん
09/06/02 19:20:53
>>347
んっとだな。
VBA単体では金にならない。ってのが正しいと思うよ。

事務処理業務+VBA とか、何かの基礎に付随する能力としてのVBAは金になる。

VBAだけしこしこ組んで金にはならん。
DB+VBAとかでも生活出来る程度の金になるし、
転職する時には凄く大きなアドバンテージになる。

351:デフォルトの名無しさん
09/06/02 19:24:14
>>348
ユーザーフォームで。
もしくは別シートを表示させるとかね。

>>349
何のデータを返したい?
表の途中に空白があったら、そこに文字列を入れたいのかな?
それならば、forで上から判定させながら入れて行くのが良いんじゃないかな。

for i = 1 to cells(rows.count,1).end(xlup).row
if cells(i,1).value = "" then
cells(i,1).value = "空欄"
end if
next

みたいに。

352: ◆.jruuB3RTA
09/06/02 19:30:15
>>351
どうもありがとう。
こんな短時間で答えられるなんてすごいなぁ。
図々しくて申し訳ないんだけど、

rows.count,1

の1って、どういう意味ですか?
すいませんが宜しくお願いします。


353:デフォルトの名無しさん
09/06/02 19:42:16
Cells(Rows.Count, 1)..SelectとかCells(Rows.Count, 2)..Selectなどやってみれば分りますよ。

354:デフォルトの名無しさん
09/06/02 20:09:13
>>351
ユーザーフォームとは、、
まだ始めたばかりで余り単語とかも分からず…

355:デフォルトの名無しさん
09/06/02 21:01:54
>>348
VBAでプログレスバーっていうのはどこかにあるよ

356:デフォルトの名無しさん
09/06/02 21:47:46
プログレスバーってのはvbaだけですよね?
excelで使いたいんです。。。
通常のVBは入ってないので。

357:デフォルトの名無しさん
09/06/02 21:54:20
>>347
あくまで道具の一種ですよ。
ほかの言語でやる必要があればその言語を使えば良いだけ。
並列言語とかをのぞけば、要件抽出して、適当にクラスをモデリングするという基本的な作業は変わらん。

>>350
>DB+VBAとかでも生活出来る程度の金になるし、
それは他の分野で優れていて、なおかつそういうサブスキルがあればその分有利になるってだけの話だろ。
それだけで食っていけるなら、失業者なんて出ないよ。

358:デフォルトの名無しさん
09/06/02 21:56:38
以前、FileSearchについて質問した者です。

更に質問なんですが、
FileSearchで見つかったファイル、ファイルパスをシートにリストにしているんですが、
その見つかった数だけ、隣にコマンドボタンを自動で作り、そのボタンで隣のパスのファイルを開く、
という動作はできますでしょうか?


359:デフォルトの名無しさん
09/06/02 22:08:23
プログレスバーの例
URLリンク(www.asahi-net.or.jp)

>>358
ボタンじゃなくて、リンクではどうよ

360:254
09/06/02 23:32:35
>>255
遅ればせながらありがとうございました。
リンク先S4でやりたかったことができました。

361:デフォルトの名無しさん
09/06/02 23:43:00
>>359
リンクでやってみようと思います。

それから、FileSearch実行中にステータスバーに検索状況を表示しようと思っているんですが、
どのタイミングで記述すればいいか分かりません。
以下ソース一部です。

.SearchSubFolders = True ' サブフォルダも探索

If .Execute() <> 0 Then
For Each vntF In .FoundFiles
With objFSO.GetFile(vntF)
GYO = GYO + 1
Cells(GYO, 1).Value = .Name
Cells(GYO, 2).Value = .DateLastModified
Cells(GYO, 3).Value = _
Left(.Path, Len(.Path))
With Worksheets("Sheet1")
.Hyperlinks.Add anchor:=Cells(GYO, 3), _
Address:=Cells(GYO, 3).Value
End With
cntFound = cntFound + 1
End With
Next vntF
End If
End With


362:デフォルトの名無しさん
09/06/03 00:22:43
>>349
>>空白セルがあったら、Null値とか文字列とかを入れるプログラム
Cells(Rows.Count, 1).SpecialCells(xlCellTypeBlanks) = "Nullとか文字列"
はだめ?

363:341
09/06/03 01:13:32
だめかなー

364:デフォルトの名無しさん
09/06/03 07:07:54
vbaって廃止されるの?
VSTOだけになっちゃうの?

365:デフォルトの名無しさん
09/06/03 07:19:18
VBAって何の為にあるのだろう?
昨日、VBAを使ってACCESSにつなぐのが1時間くらいできなくて、
さっきExcelのリボンからやってみたら1分でできた。
俺の頭が悪いだけなのかw

でも、VBAやったおかげで、他のスクリプト言語の理解度が深まった気がするから、
やはり、勉強してみて良かったのかな?

366:デフォルトの名無しさん
09/06/03 07:36:02
>>365
お前ではどんな言語をやっても意味ないだろうな

367:デフォルトの名無しさん
09/06/03 08:15:48
単一の機能を呼び出すだけなら、1時間もかかるのはバカだからだとしても
VBAのコード書きからやるよりは、メニューやリボン、ツールバーなどからの方が速くて当然

VBAは主に何度も行う定型処理や規則処理、連続処理などに使う
スクリプトも使うならそのくらいわかりそうな物だけど

368:デフォルトの名無しさん
09/06/03 08:16:13
VBAって補助的なツールとして使うだけだな。
使えればそれなりに作業効率がアップする程度かな。

369:デフォルトの名無しさん
09/06/03 08:56:47
最初は時間かかってもいいからとにかく動くものを作って理解する
作ったものはエクスポートして保管しておく
後はそれをコピペして改造しながら使っていく

VBAを飯の種にしてる人以外はこんなもんじゃね?

370:デフォルトの名無しさん
09/06/03 09:55:35
純粋にVBAだけで食ってるのは、本書いたり教室で教えたりの人だけじゃね?

俺は全社の業務効率化の為にVBAだけで仕事してるけど、
それでも会社の事知らないと作れないから、それだけで食ってるとは言い難いな。

371:デフォルトの名無しさん
09/06/03 19:20:28
VBAもピボットも機能の一つでしょ。それ以上でもそれ以下でもない
使いどころを間違えれば仕事が遅くなるのは当然

372:341
09/06/03 22:14:25
>>366
はは。他の言語とか、そんなことないんだけどなー。
Office VBAはやらなかったもんでね。
オブジェクトモデルも理解してないんだよ。

さっと教えてみてくれよ。

373:デフォルトの名無しさん
09/06/03 22:42:57
>>372
URLリンク(www5c.biglobe.ne.jp)
WordにもGetOpenFileNameがないらしいので参考にすれば



しかし、ここはExcel VBA質問スレだ
二度と来るな

374:デフォルトの名無しさん
09/06/03 23:02:19
>>361ですが、
特にレスがないってのは出来ないって事でしょうか・・・

それともここにはそれだけの知識を有した方がいないんでしょうか


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch