5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Excel VBA質問スレ Part11

1 :デフォルトの名無しさん:2009/05/10(日) 01:05:30
Excelの「VBA」に関する質問スレです

前スレ http://pc12.2ch.net/test/read.cgi/tech/1235332603/

★1 質問をするときはOSとExcelのバージョンを必ず書きましょう

★2 わからなければとりあえず「マクロの記録」をしてみましょう

★3 丸投げのプログラム作成依頼は受け付けていません

★4 VBAを使わない、Excelの使い方に関する質問はスレ違いです
    Excel総合相談所 82
    http://pc11.2ch.net/test/read.cgi/bsoft/1241825062/

2 :デフォルトの名無しさん:2009/05/10(日) 01:06:41
過去スレ
01 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
08 http://pc11.2ch.net/test/read.cgi/tech/1219673793/
09 http://pc11.2ch.net/test/read.cgi/tech/1228372971/
10 http://pc12.2ch.net/test/read.cgi/tech/1235332603/

3 :デフォルトの名無しさん:2009/05/10(日) 02:30:44
卒研でVBAを使用することになったんですがお勧めの初心者向けのテキスト(教科書)教えてくれませんか?
当方一年授業で学んでオセロつくったくらいです


4 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/10(日) 05:27:12
>>4は同意されたものではないので、無視してかまいません。

6 :デフォルトの名無しさん:2009/05/10(日) 07:23:15
>>4に同意する

7 :デフォルトの名無しさん:2009/05/10(日) 08:46:57
★7は必須だろ

8 :デフォルトの名無しさん:2009/05/10(日) 09:03:06
>>4
ExcelVBAからADOを使ってmdbのデータを読む、なんてのは含まないんだね

9 :デフォルトの名無しさん:2009/05/10(日) 09:20:46
APIの話も、Excelから呼び出すなら良いと思うけどな。
具体的なAPI詳細とかなら、専用スレに誘導すりゃ良いし。

10 :デフォルトの名無しさん:2009/05/10(日) 19:54:55
EXCEL2003とXPを使用しています
デバッグのステップインでF8を押して進めるとすべて問題なく処理が完了するのですが
マクロの実行でやると
実行時エラー424オブジェクトが必要です
という物が表示されてしまいます

何処の変数がオブジェクトにしないといけないとか判断する方法はないでしょうか?

11 :デフォルトの名無しさん:2009/05/10(日) 22:15:31
「実行時エラー424オブジェクトが必要です」
って表示された時に処理止まっているんじゃないの?

12 :デフォルトの名無しさん:2009/05/10(日) 23:04:45
デバッグのF8連打のステップインの時は全く問題なく終了(ループ)するんですよ、、、、
実行でもたまに上手くいくんですが大半がエラー424になって

なんでデバックだと上手くいくのに実際だとエラーが出るんだろ、、、、と思いまして

13 :デフォルトの名無しさん:2009/05/10(日) 23:27:43
ブレイクポイント入れてないのに勝手に止まったりすることあるよ

こまかいことは(ry

14 :デフォルトの名無しさん:2009/05/10(日) 23:44:49
スクリプトうpれ

15 :デフォルトの名無しさん:2009/05/11(月) 03:27:13
通信に関係あるプログラムじゃね?WEBとかデータベース鯖とか。

相手の準備が出来たかどうか、データの取得が完了したかどうか
ちゃんとステータスチェックせずに次に進むと成功したり失敗したりするし、
F8連打だとそれだけで時間稼ぎになるから失敗しにくくなる。

16 :デフォルトの名無しさん:2009/05/11(月) 04:58:31
処理が止まった行の

xxx.Value = yyy
または
yyy = xxx.Value

のxxxに問題あり?

17 :デフォルトの名無しさん:2009/05/11(月) 07:31:15
>>10
あるねぇ
>>15の通り、相手の準備が出来てないっての。通信に限らずオブジェクトの描画か何かでも起こった気がする
ループ使ってるならloopやnextの上の行辺りに
Sleep 100
とか入れて見ると解決した気がする
ループじゃなければちとわからん

18 :デフォルトの名無しさん:2009/05/11(月) 10:23:34
初心者丸出しのコードでもいいでしょうか?



19 :デフォルトの名無しさん:2009/05/11(月) 10:46:03
Sleep 100とか入れちゃう初心者じゃなければいいよw

20 :デフォルトの名無しさん:2009/05/11(月) 10:46:06
友人の持って来たノートPC、XP,Office2000だと
実行を40回ループさせても実行時エラー424オブジェクトが必要です
って表示されない、、、、

OFFICE2003が何か悪さしてるのかな、、、、

21 :デフォルトの名無しさん:2009/05/11(月) 10:46:22
>>18 = >>10か?
どんな行で止まったかだけでも分からないと推測で答えるしかない

22 :デフォルトの名無しさん:2009/05/11(月) 11:13:53
>>21
はい昨日424エラーが出ると言った者です

皆さんの予想通りWEBにアクセスしてデータを持ってくるという物を作ろうとしています

エラーが出るところは行はランダムなのですが

Set IE = CreateObject("InternetExplorer.Application") 'ココ
IE.Visible = False 'ココ

If CODE = "" Then
MsgBox "コードがありません"
Exit Function
Else

TARGETURL = "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=" & 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 :デフォルトの名無しさん:2009/05/11(月) 11:24:34
あー自分も同じような事をしてるよ!w

うちはXPでOffice2000なんだけど・・・

Officeのバージョンとかは特に関係なくてIEが立ち上がりきっていない場合にそういうエラーでますよ。
自分はエラーハンドラで回避しているけどね。

24 :デフォルトの名無しさん:2009/05/11(月) 12:40:48
OfficeよりもIEのバージョンのほうが問題か?
IE7だと重くて起動遅いとか

25 :デフォルトの名無しさん:2009/05/11(月) 16:47:43
IE7というより自マシンの環境によるんじゃないのか?

26 :デフォルトの名無しさん:2009/05/11(月) 17:02:44
>>23
ありがとうございます
エラーハンドラーっていうのがあるんですね
ちょっと調べてみようと思います



512MBのメモリのとき妙に424エラーとメモリ不足ですというのがでて
友人の2GBでは何もエラーをはかずに処理が終わる
1GB借りて512MB→1GBにしてみるとなぜか424エラーは出なくなった、、、、
気持ち悪いけどメモリ増やすと問題なく動くみたいです



27 :デフォルトの名無しさん:2009/05/11(月) 17:13:16
>512MBのメモリのとき妙に424エラーとメモリ不足ですというのがでて

424はよく分からんがメモリ不足は後始末がちゃんとできてないと起こりやすいな
Set XXX = ○○と書いたらSet XXX = Nothing で開放しとかないとだめ
同じ変数にSetしなおしても上書きはされずにメモリを掴んだままになるらしい
やってるよな?

28 :デフォルトの名無しさん:2009/05/11(月) 18:05:50
Set XXX = Nothingって処理が終了すれば自動解放されるからなくても大丈夫だけどね

29 :デフォルトの名無しさん:2009/05/11(月) 18:10:04
起動時に全シートの固定行数(SpritRowプロパティ)を求めているのですが、
グラフ等がアクティブになっているとプロパティ無しエラーになります。
On Error 以外で シートがアクティブになっているかどうかを判定する方法が
ありますでしょうか?

30 :デフォルトの名無しさん:2009/05/11(月) 18:14:19
>>28
そう思って書かないことが癖になると危ないと思うんだがw

っていうかあの時はマジでやばかった(謎

31 :デフォルトの名無しさん:2009/05/11(月) 18:18:25
>>29
TypeName(Selection)
でどうかな?

32 :デフォルトの名無しさん:2009/05/11(月) 18:28:39
>>31
素早い対応、有難うございます。


33 :デフォルトの名無しさん:2009/05/11(月) 18:59:21
>>27
確かに
Set IE = CreateObject("InternetExplorer.Application")
のあとに解放せずに
何十回もAccessYahoo(コード番号)で呼びまくってました
よくない癖は早めに直さないといけないですねありがとうございます

34 :デフォルトの名無しさん:2009/05/11(月) 20:46:02
IEをCreateObjectしてURLを開くのと
Workbook.Open Filename:=URLで開くのは
どこが違うんだろうか

35 :デフォルトの名無しさん:2009/05/11(月) 21:40:54
IEはQuitしてやらんと、終了しないだろ
非表示のIEがいっぱい残ってるんだろ
ttp://www.forest.impress.co.jp/article/2006/02/06/okiniiri.html
これで一覧してみな

36 :デフォルトの名無しさん:2009/05/11(月) 21:52:38
>>35
XP,Office2003で確認してみたのですが
2003はIE.quitをしなくても
自動的に消えてくれるようです


2000でも使う可能性があるのででIE.quitをAccessYahoo(コード番号)の最後に追加しました
ありがとうございます
IE.Quitはvisible をFalseにしたら不必要だと思ってました

37 :デフォルトの名無しさん:2009/05/11(月) 22:12:19
>>36
ウィンドウを閉じる(終了する)のと見えなくするのは違うぞ。
プロセスはちゃんと終わらせなきゃいけない。

38 :デフォルトの名無しさん:2009/05/11(月) 22:24:47
>>36
解放で自動的に消えてくれるかどうかは、officeやosのverより、
むしろieのverによると思うけど、うちのie8では消えないみたいよ
消えたかどうか何で確認してるの?
>>37
ieはプロセスに同居するから、インスタンス

39 :デフォルトの名無しさん:2009/05/11(月) 22:57:57
>>38
>>35さんが教えてくれたMenuBar.HTAで確認してみました


40 :デフォルトの名無しさん:2009/05/12(火) 12:55:01
VBAでフォームだけ入力することは可能でしょうか?

やりたいと思っていることは
ログイン、画面推移までは自分でIEを立ち上げて手入力でして
チェックボックスやテキストボックスにはVBAの入力ボタンを押すと自動的に
入力されてsubmitし最終確認画面が出るようにしたいと思っています

現在IEで表示している画面の要素をIEオブジェクトに取り込むということはできるものでしょうか?


41 :デフォルトの名無しさん:2009/05/12(火) 13:30:20
>>40
SendKeysとか使うくらいしか思いつかんな

42 :デフォルトの名無しさん:2009/05/12(火) 13:30:46
再読込するから無理だった気がする

43 :デフォルトの名無しさん:2009/05/12(火) 14:07:50
ありがとうございます

なさそうですか、、、
最初からVBAでIE立ち上げて
ログインする際にID、PASSを入力待ちで手入力にして最終確認画面でmsgboxだして投稿するような方法の方が簡単そうですね


44 :デフォルトの名無しさん:2009/05/12(火) 17:03:24
VBAじゃなくてVBScriptでIDとPWが入力された状態で表示させることもできるけどね

45 :デフォルトの名無しさん:2009/05/12(火) 17:17:07
IDとパスワードはフォームに入力して、それをSendKeysで送ればいいと思う

46 :デフォルトの名無しさん:2009/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 = "http://www.yahoo.co.jp/" Then
objWindow.document.sf1.p.Value = "VBA"
End If
Next

Set objIE = Nothing
Set objWindow = Nothing

47 :デフォルトの名無しさん:2009/05/12(火) 17:55:25
もうちょっと推敲しろよ

48 :デフォルトの名無しさん:2009/05/12(火) 21:28:22
質問です。

shell関数でIEを全画面サイズで開く処理を行うと、
会社のPCだと、どうしても全画面で開けません。

最小化でも開けず、ただ適当なサイズで開いてしまうんですが、
何かサイズ指定が不可能になる条件ってPC側にあるんでしょうか?

OSはXP、MSは2002です。

49 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/12(火) 22:36:02
>>48
ie側の問題だと思う

iexplore -nohome
だと効くみたいだけど

52 :デフォルトの名無しさん:2009/05/12(火) 22:50:59
>>51
そうなんですか。。。
ありがとうございます。

53 :デフォルトの名無しさん:2009/05/13(水) 12:54:29
msgboxのYES,NOをすべての最前面に出す方法はないでしょうか?
VbMsgBoxSetForegroundが最前面表示とあるので
MsgBox("確認", vbYesNo, vbMsgBoxSetForeground)
としてみたのですが

VBA実行→IEが立ち上がる→確認がIEの後ろに隠れてしまう
(奥からエクセル、確認msgbox、IEの順になってしまう)
VBA実行→IEが立ち上がる→確認がIEの手前で
奥からエクセル、IE、確認msgboxの順になるようにしたいと思っています

54 :デフォルトの名無しさん:2009/05/13(水) 15:12:06
+ vbSystemModal

55 :デフォルトの名無しさん:2009/05/13(水) 15:31:48
>>53
APIでエクセルをアクティブにしてからメッセージボックスを出すとか

56 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/13(水) 16:08:53
MsgBoxについての話はスレ違いか?
vbSystemModal使うと「メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。」
だから都合悪いかもしれないと思ってAPI使うってアクティブにする案を出したんだが・・・

APIの使い方がわからないって言ってきたらググレカスとでも言っておくがなw

58 :57:2009/05/13(水) 16:10:07
訂正
× API使うってアクティブにする
○ API使ってアクティブにする

59 :デフォルトの名無しさん:2009/05/13(水) 16:36:25
要件満たさんだろ

60 :デフォルトの名無しさん:2009/05/13(水) 19:39:10
そもそもアクティブにするのと最前面にするのは違うし。
おかげでボタンが押せなくて操作不能になるアプリがたまにある。

61 :デフォルトの名無しさん:2009/05/13(水) 21:37:14
>50
お返事ありがとう
その方法でもメニューが追加されるのは一枚目のシートだけ見たいです
具具っても見当たらないんですよね

62 :デフォルトの名無しさん:2009/05/13(水) 23:07:23
>>49
いま手元にExcelが無いのであれだが
' Set fBar = CommandBars("Worksheet Menu bar").CommandBars("Cell")
Set fBar = Application.CommandBars("Cell")
で どうかな?

63 :デフォルトの名無しさん:2009/05/13(水) 23:13:16
セルに色が設定されていない状態のcolorIndexは何でしょうか?

If Worksheets("Sheet1").Cells(1, 1).Font.ColorIndex <> 2 Then
MsgBox "color"
End If

みたいに書いているんですが、bookを作った最初の状態は、白ではなく、色が未設定の状態だと思うんですが。。。


64 :デフォルトの名無しさん:2009/05/13(水) 23:16:58
xlColorIndexNone ですかね。

65 :デフォルトの名無しさん:2009/05/13(水) 23:19:21
Interior.Colorindex= 0

fontではなくInteriorです!

66 :デフォルトの名無しさん:2009/05/13(水) 23:23:50
ありがとうございます!

0でもxlColorIndexNoneでも同じって事ですか?

fontとInteriorはコピーする箇所を間違えました;

67 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/14(木) 01:13:52
xlNoneは-4142だから0とは違う

69 :デフォルトの名無しさん:2009/05/14(木) 12:35:39
-4142
-4142
-4142
-4105

になったぞ by Excel97

70 :デフォルトの名無しさん:2009/05/14(木) 19:53:45
スイマセン、ローカルにコピーしたロータスノーツのファイルにアクセスする方法について教えていただきたいのですが・・・
あと、VBAの設定で参照可能なライブラリファイルにチェックを入れとけばいいんですよね?

71 :デフォルトの名無しさん:2009/05/16(土) 19:47:16
オブジェクト型変数には、オブジェクト自身ではなく、オブジェクトの情報を呼び出す為の番号(参照)が入る。

って、要するにポインタのことですか?

72 :デフォルトの名無しさん:2009/05/16(土) 20:27:27
参照です。

73 :デフォルトの名無しさん:2009/05/16(土) 20:34:09
大まかには合ってるんじゃない?
とりあえず、他の変数に代入してもオブジェクトそのものは
複製されない事だけ把握しとけばOK。

74 :デフォルトの名無しさん:2009/05/16(土) 20:46:14
実態をコピーせずに何らかの番号で区別するって意味では合ってるかもしれないけど
やっぱり参照とポインタは微妙に違う
狭い意味だとポインタはアドレスのことだったりもするし
あとは実装次第だ

75 :71:2009/05/16(土) 21:09:11
>>72-74
ありがとうございます。

76 : ◆aAB/3SgCFU :2009/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 :デフォルトの名無しさん:2009/05/17(日) 14:13:56
>>76
Office2007で利用可能な桁数が大幅に増えた(16384?)のが理由。
桁数が最大256桁とか決めうちしていると、こういうことになる。

78 :デフォルトの名無しさん:2009/05/17(日) 14:14:38
Cells(i).

が原因だね。
cells(row,column) 
で指定しないと。

79 : ◆aAB/3SgCFU :2009/05/17(日) 19:32:56
>>77-78
どうもありがとう

80 :デフォルトの名無しさん:2009/05/18(月) 07:30:50
質問です
VBAで他のアプリケーションを開くまでは色々ググって出来たんですが
そのアプリが閉じられたら、再びVBAに処理を戻したいんです。
今はファイル名のリストがフォーム上に有ってその名前で検索したファイルを開くという作業で一太郎やワード等を
ShellExecuteで開くというの作ったんですが
開いたファイルが閉じられたら更新日時を調べて変化が有れば書類の板番号を更新したいんですが
いつ閉じられたかも解らないし、ファイルを開いて処理が中断し閉じて再開すると言った事は不可能でしょうか?

81 :デフォルトの名無しさん:2009/05/18(月) 09:09:25
>>80
それはアプリの終了よりもファイルの更新を調べた方がいいのでは。
VBAで1秒間隔のタイマーをセットして、ファィルのタイムスタンプを1秒おきに調べるみたいな方法なら
すぐに思い付くけど。

82 :デフォルトの名無しさん:2009/05/18(月) 12:00:46
>>81
わかりました
それで行きます


83 :デフォルトの名無しさん:2009/05/18(月) 13:17:19
えっ、それでいっちゃうの?

84 :デフォルトの名無しさん:2009/05/18(月) 13:20:12
行くって言ってるだろ

85 :デフォルトの名無しさん:2009/05/18(月) 14:53:02
だって
思い付かないんだもん

86 :デフォルトの名無しさん:2009/05/18(月) 16:03:24
OpenProcess()してWaitForSingleObject()するのは駄目なのか?

87 :デフォルトの名無しさん:2009/05/18(月) 16:06:00
dirname/filea.ext
dirname/fileb.ext
があったときに、".ext"に関連づけられているsomeapp.exeを起動したとき、
fileb.extもsomeapp.exeで更新している可能性があるので、
プロセスの終了を待ち合わせて、dirname/*を全検索して情報を更新するのが一番。

88 :デフォルトの名無しさん:2009/05/18(月) 17:00:13
ファイルを閉じて、アプリは閉じないかもしれない

89 :デフォルトの名無しさん:2009/05/18(月) 17:19:47
ROTにファイルがあるかチェックすればよい

90 :デフォルトの名無しさん:2009/05/18(月) 19:17:48
line input 命令で chr(&h0) の入ったレコードを読み込むと強制的に chr(&h20)に置き換えられるのでしょうか?
もしそうでしたら、何らかの回避方法を教えていただきたいのですが・・・

91 :デフォルトの名無しさん:2009/05/18(月) 20:21:34
バイナリで読め

92 :デフォルトの名無しさん:2009/05/19(火) 11:12:20
>>86
試して見ましたが
ファイルが開き終わるとwaitが終了し次の処理に移ってしまうようで上手くいきませんで
filepath="sample.txt"
CreateObject("WScript.Shell").Run FilePath, vbNormalFocus, True
MsgBox FilePath & "が閉じられました。", vbInformation Or vbSystemModal
これで済ませました お騒がせしました 

93 :デフォルトの名無しさん:2009/05/19(火) 12:11:15
ワークシートのmodと異なり、VBAのmodは小数点下が切り捨てられてしまいます。

小数点下を含む剰余を返すようにしたいのですが、ワークシートのmodは演算子だから
application.mod()とは出来ない。

良い方法はありますでしょうか?

94 :デフォルトの名無しさん:2009/05/19(火) 14:33:35
小数点下は元の数と同じな気がする

95 :93:2009/05/19(火) 15:32:48
>>94
分母が整数なら・・・。

x mod yの場合、x - Int(x / y) * yで良いのかなぁ。

96 :デフォルトの名無しさん:2009/05/19(火) 22:18:52
x - (x \ y) * y

だとどうだろう

97 :デフォルトの名無しさん:2009/05/19(火) 22:45:17
顔文字かと思った

98 :デフォルトの名無しさん:2009/05/19(火) 22:52:54
>>96
たばこを吸うバルタン星人ですよね???

99 :デフォルトの名無しさん:2009/05/20(水) 15:37:42
すいません、WindowsXP SP3、Excel2003での質問なんですが、
VBAを使って罫線ツールバーの「罫線を作成」機能(セルの枠線にそってクリック・ドラッグで罫線を引く)
と同じことをするのは可能でしょうか?

100 :デフォルトの名無しさん:2009/05/20(水) 17:04:50
>>99
罫線を引きたいセルを選んでVBA実行して罫線が引かれるっていうのならできるんじゃね

101 :デフォルトの名無しさん:2009/05/20(水) 17:29:32
test

102 :デフォルトの名無しさん:2009/05/20(水) 21:13:05
以下のようなことをやりたいです。
XP、Excel2003です。

Excelファイルが2つある。1つは用語集ファイルと呼び、もう1つは作業ファイルと呼ぶ。
用語集ファイルには英単語とその対訳がリスト形式で保存されている。
作業ファイルには英文が書かれていて、知らない英単語が出てきたら用語集ファイルを検索して
その意味を調べる。
具体的には
1.作業ファイル中の検索したい単語を反転表示させる。
2.右クリックのショートカットメニューから、独自に追加した「単語を検索」をクリックする。
3.用語集ファイルに、1で選択した単語の検索結果が表示される。(Ctrl+Fでの検索と同じ表示結果)

※ただし、作業ファイルにはマクロは記述しない。

作業ファイルにはマクロは記述しないので2が無理かと思うのですが、代替案として
どのような方法を取ればいいでしょうか?(右クリックのショートカットメニューでなくてもいいので
とにかく作業ファイルにはマクロは記述せずに、3と同じ結果を得たいのです)
おおまかな手順でいいので、ヒントをお願いします。

103 :デフォルトの名無しさん:2009/05/20(水) 21:26:28
personal.xlsに記述するのもだめ?

104 :102:2009/05/20(水) 21:49:38
>>103
OKです。
personal.xlsが何なのか知らなかったので調べたのですが、どうやら自分の作ったマクロを
まとめておくエクセルファイルのようですね(初心者ですみません)。
つまり、最終的には作業ファイル・用語集ファイル・personal.xlsという3つのファイルで作業する
という認識で正しいですよね?

105 :デフォルトの名無しさん:2009/05/20(水) 22:00:12
>>102
その程度のユーザビリティなら、そのままCtrl+Fで良いじゃん。
わざわざマクロを組む必要性がわからん。


106 :105:2009/05/20(水) 22:01:04
>>105
あぁ、別ファイルか。
ごめん。

107 :デフォルトの名無しさん:2009/05/21(木) 07:37:30
>>95
別に分母が正数じゃなくてもそれでいいんじゃない?
むしろ分母が整数の必要があるのは>>96だな。

108 :デフォルトの名無しさん:2009/05/21(木) 08:20:20
重複に関してちょっと質問します。

= IF(COUNTIF(B:B,B4) >1, "重複","")

この関数でE4という条件をB列全てに適応できたらと
思っています。この関数ではB4のセルの内容が
他と重複してるかいないかのチェックだけになります。

B4セル エクセル
B5セル ワード

このような場合エクセルとワードという単語がB列で
重複してるかいないかのチェックになります。

109 :デフォルトの名無しさん:2009/05/21(木) 09:31:14
これはVBAではないですよね?


110 :デフォルトの名無しさん:2009/05/21(木) 11:00:14
エクセルだなw

111 :デフォルトの名無しさん:2009/05/21(木) 20:18:50
あるセルにこんなSUMIF関数を入れたいんだけど、
Cells(r + 1, 4).FormulaArray = "=SumIf($O1:$O500,cells(r,3),#K1:$K500)"
エラーになってしまうのは、検索条件がおかしい?
(rはFOR〜Nextさせています)

112 :デフォルトの名無しさん:2009/05/21(木) 20:32:10
Cells関数なんてあったか?

113 :デフォルトの名無しさん:2009/05/21(木) 20:43:27
>>111
何で文字列に変数名が入ってるんだ。
” ”で囲まれた中は文字列だから、rは文字のrでしか無い。

てか、SUMIFなんて使わずにVBAで構文書いた方がずっと楽だよ。

114 :デフォルトの名無しさん:2009/05/21(木) 21:28:23
こうか?
Cells(r + 1, 4).FormulaArray = "=SUMIF($O1:$O500," & Cells(r, 3) & ",#K1:$K500)"

115 :デフォルトの名無しさん:2009/05/22(金) 01:11:16
>>111
そんなのはピボットでやれよ。
#は$の間違いか?

116 :デフォルトの名無しさん:2009/05/22(金) 08:13:03
>>113
for文使ってるって言ってるんだからVBA使ってるいるんじゃないのか?

117 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/22(金) 11:52:34
Range("D2:D100").FormulaArray = "=SUMIF(O1:O500,C2:C100,K1:K500)"
だった。


120 :デフォルトの名無しさん:2009/05/22(金) 12:15:10
>>117
回答者側はその物言いで理解できるだろうけど
質問者側はそれじゃ理解できない奴多いだろうな

121 :デフォルトの名無しさん:2009/05/22(金) 13:32:03
世の中は即理解できる世界ばかりで出来ているわけじゃないことを
教えるのは重要

122 :デフォルトの名無しさん:2009/05/22(金) 13:40:44
プログラムって、頭の良い人なら3日くらいで何でもできるようになるのだろうか?
自分は4月から勉強し始めたけど、やってもやっても、
分からないことや、知らなかったことが出てきてゴールが見えてこない。

123 :デフォルトの名無しさん:2009/05/22(金) 13:48:57
頭の良い人なら3日くらいで何でもできるようになるのだろうか?


3日くらいで何でもできるようになるのが頭の良い人

124 :デフォルトの名無しさん:2009/05/22(金) 14:18:55
試験勉強じゃないから暗記しなくてもいいし
わからなかったら人に聞いてもいいし
本人に作る気があればプログラムなんかいくらでも作れるだろ

125 :デフォルトの名無しさん:2009/05/22(金) 14:31:46
俺は長い事ECMAやってからVBAを始めたんだけど、

・言語体系を覚えるまで3か月
・VBAで出来る事、向いてる事かが分かるまで更に3か月
・調べながら自分で作れるようになるまで更に3か月

って感じで、かなり時間が掛かった記憶がある。
VBから始める人ならそれこそ3日で出来るとかあるだろうけど、
それ以外の言語からだときちいわ。
未だに分からん事の方が多い。

プログラムやったこと無い人だったら、変数って何?配列って何?
って事から始まるんだし、もっと時間かかるんでないか?

126 :デフォルトの名無しさん:2009/05/22(金) 14:34:59
ECMAって何だ?

127 :デフォルトの名無しさん:2009/05/22(金) 14:36:41
まず、何でも出来るようにはならない。

出来るよ!って人でもその時々で調べながらプログラム組んでるものです。

暗記する必要もないし、調べながらでも出来れば問題ない。

大体、使うものって限られてるし、それが出来れば十分なわけです。

128 :デフォルトの名無しさん:2009/05/22(金) 15:05:05
>>125
ECMAってJavaScriptだろ?
そりゃきちいわ。同じ系統でもVBScriptからだと
だいぶ違うと思うがどうかな。
だがVBA自体はかなりしっかりした
言語なんで半年以上かけて勉強したことに
ついて損はしてないね。

129 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/22(金) 17:37:42
追記:マクロ実行時点でのActiveWorkbookは本マクロが含まれてるファイルです。

131 :デフォルトの名無しさん:2009/05/22(金) 18:15:34
すみません、自己解決しました。

大元のファイルをxlsmで保存しなおして、VBAの中もxlsmにすればいいんですね。


132 :デフォルトの名無しさん:2009/05/22(金) 19:17:20
>>122
目的があれば、すぐに覚えられる
事務作業の自動化のために
表への入力、印刷設定→印刷の自動化、ファイルを正規化させたり、シートを一度に何個も作る・・
等の作業をマクロの記録。そして改変。後はifやforを覚えたかな
プログラムへのとっかかりとして、マクロの記録はとんでもなく優秀だと思うわ
プロシージャやメソッド、その概念すら覚えて無くてもとりあえず動くマクロが作れるってところがね


133 :デフォルトの名無しさん:2009/05/22(金) 19:48:19
>>127
確かに暗記しなくても書けるには書けるが、せめて
宣言系、制御系、演算子くらいは最低限暗記しないと、とても実用にはならないよ

まあこのへんはまともなコード書けば必ず使う物だから、意識して覚えようとしなくても
すぐに暗記しちゃうとは思うが

134 :デフォルトの名無しさん:2009/05/22(金) 20:11:36
>>122
やりたいことが明確になればすぐにできるようになると思うよ
わからないことが出たら調べてそれでもわからなければここで聞けばみんなが教えてくれるし

参考書読んでてもあまりできるようにはならないかな
まず簡単な
A1の値をA3にコピーするから
A1の値をSHEET1のA3にコピーしてみる
さらにA1の値を別BOOKのSHEET1のA3にコピーしてみる
と言ったように自分でいろいろ弄って遊ぶような感覚でやっていかないと
覚えが悪いと思う

135 :デフォルトの名無しさん:2009/05/22(金) 21:22:23
VBAを使ってツールバー上のコントロールを実行したいんですが、
ドロップダウンリストなどを項目を選択して実行するということは可能でしょうか?
例えば書式設定ツールバーのフォントを選択するリストでMS明朝を選んで実行、というようなことです。

普通のボタンをExecuteで実行するやり方は分かったんですが、リストの場合はどうすれば…

136 :デフォルト名無しさん:2009/05/22(金) 22:46:56
学校の課題なんだけど、
ttp://www.hasimoto999.aki.gs/img-box/img/5764.jpg
ttp://www.hasimoto999.aki.gs/img-box/img/5765.jpg

が、5時間近く考えてもわからない
簡単過ぎる問題かもしれないけど、ご教授頼むorz
ちなみに19の1は解けてる。



137 :デフォルトの名無しさん:2009/05/22(金) 22:50:05
> ★3 丸投げのプログラム作成依頼は受け付けていません

> ★7 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
>    コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
>    ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

138 :デフォルトの名無しさん:2009/05/22(金) 22:55:09
>>136
そんなピラミッドを描いて何になる?
って解答欄に書いて、相手にたたきつけろ!

139 :デフォルトの名無しさん:2009/05/22(金) 22:58:13
For〜Next、二重ループ とまで書いてくれてるのに分からないとか

140 :デフォルトの名無しさん:2009/05/22(金) 23:10:41
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1411688549
やるだけ時間の無駄な問題だな

141 :デフォルトの名無しさん:2009/05/22(金) 23:24:46
デバッグのことに関して質問したいです。
代入していない、宣言していない変数へアクセスしたときにエラーを出すにはどうすればいいですか?

Option Explicitを指定すると 代入は検知できるんですが
宣言してない変数を読み出しても、Empty値が返ってくるだけで
そのまま実行されてしまいます。






142 :デフォルトの名無しさん:2009/05/22(金) 23:29:09
それともう一つ、
また、エラーが発生した箇所を調べることは出来ないのでしょうか?
たとえば、オブジェクトをSetを使用しないで代入すると
「実行時エラー'91' オブジェクト変数またはWith(ry」と例外が発生して、ダイアログが出ますが
この例外が発生した箇所を調べることは出来ないのでしょうか?

現在は地道にステップインでエラーが発生するまで追っていますが
なんだかばからしくてやってられません。

また、例外構文もN88BASICを思い出させる、On Error〜割り込みしか無いのでしょうか?
よくある、try〜finally 〜catch(Exception e) というような構文はないんですか?

143 :デフォルトの名無しさん:2009/05/22(金) 23:30:44
>>142
>なんだかばからしくてやってられません

それが自分の資質を示しているねw

144 :デフォルトの名無しさん:2009/05/22(金) 23:34:47
>>136
辛口な事言うけど、論理的思考が全く出来てないでしょ。
ただ答えだけ貰ったって何も役に立たんのでは?
単位もらえりゃ良いって事なのかもしれんけどさ。

for i = 1 to 9


145 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/22(金) 23:38:30
>>142
エラー吐いた部分で黄色く反転して中断されないか?


147 :デフォルトの名無しさん:2009/05/22(金) 23:43:47
これでも別に不正解ではないな。プログラムサイズに制限もないみたいだし。
二重ループは最後に空ループでも置いとけばいい。

Range("A2")=1
Range("A3")=2
Range("A4")=3
Range("A5")=4
  :
以下略

ちなみに、文句言ってるやつは全科目100点だったのかな?
宿題を誰かに写させて貰ったこともないのかな?
学校なんてこんなもんだよ。まじめに考えすぎ。

148 :デフォルトの名無しさん:2009/05/22(金) 23:45:22
>>145
そうやって結局教えちゃうから育たないんでしょ

149 :デフォルトの名無しさん:2009/05/22(金) 23:46:10
たかが5時間でギブするのはどうだよ

150 :デフォルトの名無しさん:2009/05/22(金) 23:46:29
>>147
論点のすり替え
ここは宿題教えるスレじゃない

151 :デフォルトの名無しさん:2009/05/22(金) 23:46:55
単位なんてもらったもん勝ち。入試だって就職だって、まぐれでも入ったもん勝ち。
世の中、要領と運のいいやつが一番トクをする。

152 :デフォルトの名無しさん:2009/05/22(金) 23:47:59
九九はどうでも良いんだけど、ピラミッドの方がなぁ。
指定された整数が129以上だと、その時点でオーバーフローだな。2003までは。

do untilで指定の数までインクリメントして、
do untilで1になるまでデクリメントして、
積み重ねる部分を関数化するのが楽だと思ってしまた。

153 :デフォルトの名無しさん:2009/05/22(金) 23:48:42
>>149
それ以前に、こんな問題、読んで1分で分からなきゃモノにはならないよ。

154 :デフォルトの名無しさん:2009/05/22(金) 23:51:57
こんなレベルの低い、下らないもんで良いのか。
やっぱ学校なんて気楽なもんだね。

この程度の問題が100点でした!VBA出来ます!!
って入ってくる新人がいるって事の方が怖い。

155 :デフォルトの名無しさん:2009/05/23(土) 00:12:01
うちの学校は一般教養にコンピューターの授業が週一であって、
簡単なプログラミングの問題が出た。
少なくとも生徒の99.9%はプログラマーなんて目指してなかったし
宿題なんてほぼ全員が誰かのノートを丸写ししてた。

156 :デフォルトの名無しさん:2009/05/23(土) 00:13:09
ふーん

157 :デフォルトの名無しさん:2009/05/23(土) 00:22:59
うちの商学部でもCとかJavaとかの授業があった。教え合ったりこそはしたけど、コードとチャートは各自で書いてたよ。
SEにはならなかったけど、今の職場でVBAが扱えることで重宝してもらえてる。てかSEにならんでよかった、なったら埋没してたろうから。

158 :デフォルトの名無しさん:2009/05/23(土) 00:27:04
>>157
自分より優秀な奴が集まる集団で働くよりも、自分が一番の集団で働く方が、
大事に扱われるし、自尊心も満たされるしなw
給料3万円しか違わないなら、俺は後者を選ぶ。

159 :デフォルトの名無しさん:2009/05/23(土) 00:33:36
うちのひいじいちゃんが言ってた
「鶏口となるも牛後となる勿れ」ってね

160 :デフォルトの名無しさん:2009/05/23(土) 00:35:14
俺は三番手位でいいや。
出る杭は打たれる、という諺もあるしな。

161 :デフォルトの名無しさん:2009/05/23(土) 00:40:20
俺はわかっててもできないフリをしてる。
なんか面倒な作業を押しつけられそうだし。
今の年収で満足してるし、課長とか部長にもなりたくないし。
最低限の生活が出来ればいいや。

162 :デフォルトの名無しさん:2009/05/23(土) 00:45:58
現実で使えない問題なんてさっさとネットで聞くのが吉
現実的にありそうな問題は分かるまで自分で考えるのが理想だが、そんなことで単位落としたりしてはそれはそれで問題だろう
実際現場ではネット使い放題、上司に質問し放題なんだし
かと言ってそれに頼りすぎて成長しないのも困るんだけどね
でもそれが仕事がすすまないのも困るんだけどね


163 :デフォルトの名無しさん:2009/05/23(土) 03:26:21
>>143
構文チェック時・コンパイル時に分かることなのに
実行しないと分からない。しかも100行を超えるコードをウォッチ式で変数を監視しつつ、ステップ実行するというのは
明らかに効率が悪く、方法を見直す必要があるため、質問しました。

>>146
されません。 例外が発生すると、OKとHELPしか選択肢のないダイアログが出るだけです。
もちろん、ブレークポイントを設定したり、ステップ実行したり、Escキーで停止したときには
実行中の行が黄色く表示されますが。

書き忘れていましたが、
Office 2007 EEで保存形式は2007+マクロ(xlsm)です。

164 :デフォルトの名無しさん:2009/05/23(土) 04:16:07
>>163
うそつき
ttp://windyakin.if.land.to/src/up38_1232.png

165 :デフォルトの名無しさん:2009/05/23(土) 13:42:35
>>164
私の環境では
http://windyakin.if.land.to/src/up38_1233.png
こうなりますよ。

やはり何かデバッグオプションが足りないのかもしれません。
プロジェクトのプロパティに「条件付きコンパイル引数」という項目があるんですが
そこの所が空欄なのが問題なのかもしれません

が、オフラインヘルプを見ても
http://windyakin.if.land.to/src/up38_1234.png というようになんか壊れてますし・・・
オンラインヘルプじゃないのでそのまま凸することも出来ません

MSDNの.netリファレンスが不親切だと思ったことはないですが
このVBEに付属するリファレンスは何かと不親切ですね。列挙子が何を意味するのかも省略されてますし、ひどいものです。
翻訳作業が間に合っていないならせめて原文を載せてほしいところです。

166 :デフォルトの名無しさん:2009/05/23(土) 13:52:14
2007で確認したけど、164と同じ。
もしなんだったら、MSDNの原文読めばいいんじゃない?

167 :デフォルトの名無しさん:2009/05/23(土) 15:21:26
>>165
条件付きコンパイル引数のとこはうちでも空欄
ヘルプも同じ所が同じようにおかしい

168 :デフォルトの名無しさん:2009/05/23(土) 15:25:33
画像貼るの忘れた
ttp://windyakin.if.land.to/src/up38_1235.png

169 :デフォルトの名無しさん:2009/05/23(土) 15:35:28
セル内の文字列を選択した状態(反転表示した状態)のまま、マクロを実行することはできないのでしょうか?
ツール→マクロをみてもグレーアウトされた状態で実行できません。

170 :デフォルトの名無しさん:2009/05/23(土) 18:22:20
>>136
今更だが今初めて質問みたのでピラミッドのヒントだけ
1,3,5,7,9と増えていくから必要な”■"は段数*2-1必要。
ループは後ろから回せばよい。
あとはCellsとかResizeとか好みでOffsetとか。

171 :デフォルトの名無しさん:2009/05/23(土) 18:26:01
ループは頭からでも同じか。

172 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/23(土) 20:38:21
垂直二等辺三角形

175 :173:2009/05/23(土) 21:05:14
>>174
どんな三角形だw と思ったら自分で書いてたorz
正しくは"直角"二等辺三角形です

176 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/23(土) 22:03:49
>>176
union使いたかっただけじゃないのかと。

178 :デフォルトの名無しさん:2009/05/24(日) 03:18:30
Range("A1:I9").Formula = "=ROW()*COLUMN()"

179 :デフォルトの名無しさん:2009/05/24(日) 03:46:10
Height = 5
[A1].Resize(Height, 2 * Height + 1).Formula = "=IF((ROW()+COLUMN()>" & Height & ")*(COLUMN()-ROW()<" & Height & "),""■"","""")"

180 :デフォルトの名無しさん:2009/05/24(日) 03:56:07
Range("A1:J10").Formula = "=IF(ROW()*COLUMN()<>1,(ROW()-(ROW()>1))*(COLUMN()-(COLUMN()>1)),"""")"

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

182 :デフォルトの名無しさん:2009/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:2009/05/24(日) 15:54:03
>>181
ありがとうございます。実際には罫線ツールバー上にある「罫線の作成」「罫線グリッドを作成」の
線スタイルと線の色を選択したかったんです。
とりあえず罫線の作成を使うのはあきらめて、Bordersで選択セルに線引くマクロ作って代用しました。

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

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

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

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

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

187 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/26(火) 19:28:32
>>188
ありがとうございます。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

207 :デフォルトの名無しさん:2009/05/27(水) 00:06:07
ttp://www.google.co.jp/search?q=excel+2007+filesearch


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

238 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/29(金) 18:30:47
>>238
=Format(Now,"YYYYMMDDHHMMSS")

240 :238:2009/05/29(金) 18:39:35
>239

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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


255 :デフォルトの名無しさん:2009/05/30(土) 01:00:33
>>254
http://www.niji.or.jp/home/toru/notes/8.html

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

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

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

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

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

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

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

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

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

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

262 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/30(土) 21:57:04
VBA以前にレイアウトを考えたほうが良いんじゃね?

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

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

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

ダッセw

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

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

269 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/31(日) 16:34:43
実はたいして変わらないんだけどね

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

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

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

272 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/31(日) 19:09:00
>>272
サンクス。

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

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

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

275 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/05/31(日) 21:25:29
>>273
セルと図形って言ってただろ?
なんで画像が出てくるんだ?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


294 :293:2009/05/31(日) 23:34:53
>>268じゃなくて>>288な。

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

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

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

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

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

字余り

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

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

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

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

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

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

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

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

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

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

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

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

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

313 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/06/01(月) 02:06:30
すまん、>>269>>275ね。
ちなみにA1:S10000に入力したら12秒と40秒だった・

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

338 :241:2009/06/02(火) 00:36:45
>>243
>>256

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

351 :デフォルトの名無しさん:2009/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 :2009/06/02(火) 19:30:15
>>351
どうもありがとう。
こんな短時間で答えられるなんてすごいなぁ。
図々しくて申し訳ないんだけど、

rows.count,1

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


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

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

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

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

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

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

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

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


359 :デフォルトの名無しさん:2009/06/02(火) 22:08:23
プログレスバーの例
http://www.asahi-net.or.jp/~ZN3Y-NGI/YNxv9g1810.html

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

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

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

363 :341:2009/06/03(水) 01:13:32
だめかなー

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

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

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

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

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

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

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

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

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

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

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

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

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

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

373 :デフォルトの名無しさん:2009/06/03(水) 22:42:57
>>372
http://www5c.biglobe.ne.jp/~yamag/data/Soft/VBAProgramingTIPS.html
WordにもGetOpenFileNameがないらしいので参考にすれば



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

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

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

375 :デフォルトの名無しさん:2009/06/03(水) 23:18:19
もう来んな。臭すぎて気分悪いわ。

やっぱり俺が出て行くわ。

376 :デフォルトの名無しさん:2009/06/04(木) 00:04:06
> それともここにはそれだけの知識を有した方がいないんでしょうか
そうだよ、だから帰ってね

377 :デフォルトの名無しさん:2009/06/04(木) 00:19:07
>>341
PowerPointから
CreateObject("Excel.Application")して
GetOpenFileNameするってのもありか

378 :デフォルトの名無しさん:2009/06/04(木) 02:59:12
>>374
まあファイル総数を調べた後に1つ1つカウントすればいいんじゃね?
簡単だろ?わからないなら1から10までカウントのプログラム書いてみ?セルに表示するやつ
あとはそれをどう表現するかの問題。セルに色塗ったり、色付きラベルの長さを伸ばしたり・・・
コントロールもあったかもしれん

そもそも経過処理表示を本気で実装するのは難しい(無理)
インスコ等でも分かると思うが、人間の感覚と処理経過に乖離が発生する。

379 :デフォルトの名無しさん:2009/06/04(木) 03:09:35
>>374
「vba ステータスバー」でググった一番上。まさにこれかと・・・
そもそもfor文使ってるのに意味分かってないのがアウツ

380 :デフォルトの名無しさん:2009/06/04(木) 06:52:18
おまえらほんと優しいな、あからさまに煽ってるやつの相手してあげるなんて

381 :デフォルトの名無しさん:2009/06/04(木) 07:25:18
で?

382 :デフォルトの名無しさん:2009/06/04(木) 07:35:17
って

383 :デフォルトの名無しさん:2009/06/04(木) 07:50:09
     /ニYニヽ
    /( ゚ )( ゚ )ヽ
   /::::⌒`´⌒::::\   呼んだ?
  | ,-)___(-、|
  | l   |-┬-|  l |
   \   `ー'´   /

384 :デフォルトの名無しさん:2009/06/04(木) 09:08:08
XP、Office2003を使用しています
IEのherf="javascript:clickQuickLink('summary');"
これをクリックしてページの推移をしたいのですが

このリンクをマウスでクリックするようにvbaでクリックする方法を教えていただけないでしょうか
よろしくお願いいたします

385 :デフォルトの名無しさん:2009/06/04(木) 09:40:56
>>384
VBAを使ってのExcelの操作ではなくIE(IEオブジェクト)の操作はスレ違い>>4

386 :デフォルトの名無しさん:2009/06/04(木) 11:30:08
いちいち言わなくてよろしい

387 :デフォルトの名無しさん:2009/06/04(木) 15:32:16
言わずとも解ってる人には言わなくても良い
言わないと解らない人には言う必要がある

スレ違いな質問しちゃう人は後者なので言う必要がある

388 :デフォルトの名無しさん:2009/06/04(木) 15:54:06
ほっとけばよろしい

389 :デフォルトの名無しさん:2009/06/04(木) 16:00:08
寛容と無秩序を取り違えている人?

390 :デフォルトの名無しさん:2009/06/04(木) 16:13:58
うざいよ

391 :デフォルトの名無しさん:2009/06/04(木) 16:17:48
スレ違い認定はもういいよ

392 :デフォルトの名無しさん:2009/06/04(木) 17:11:47
論では返せず

393 :デフォルトの名無しさん:2009/06/04(木) 19:14:19
ならツモで

394 :デフォルトの名無しさん:2009/06/04(木) 20:27:47
>>361です
見付かったファイル状況ならもちろん分かります。

検索しているファイルのカウントを表示させたいんですが、
どこでどのオブジョクトを見ればよいのかが分かりません

395 :デフォルトの名無しさん:2009/06/04(木) 23:03:46
世の中に自分で書いたソースが理解できない奴なんて居るの?

396 :デフォルトの名無しさん:2009/06/04(木) 23:04:40
2年前のソース理解できませんでした。サーセンwww

397 :341:2009/06/04(木) 23:04:55
>>373
えらい人だね

>>377
> CreateObject("Excel.Application")して
なるほど。 明日から出張なんで、帰国したら試してみる。
ありがとう。

398 :デフォルトの名無しさん:2009/06/04(木) 23:37:34
スレタイ見ようぜ。

399 :デフォルトの名無しさん:2009/06/05(金) 00:10:03
executeした後に、どこにファイル検索数を持ってるんでしょう?
プロパティやオブジェクトもググっても見つからないし、
executeしたらその.Executeの中身はすぐにhit数になってるし。

400 :デフォルトの名無しさん:2009/06/05(金) 08:54:53
オブジョクト

401 :デフォルトの名無しさん:2009/06/05(金) 08:56:30
オブジョイ

402 :デフォルトの名無しさん:2009/06/05(金) 09:12:57
オブジョイト

403 :デフォルトの名無しさん:2009/06/05(金) 09:46:46
EXCELの自動計算がとまってしまうことがあります
オプションの自動計算のチェックボックスはonのままです

とりあえずマクロの
Private Sub Worksheet_Calculate
を削除したところ止まらないようになりましたけど・・


原因がわかりません

404 :デフォルトの名無しさん:2009/06/05(金) 21:45:53
Worksheets("Sheet1").Delete
これをVBAで実行すると、シートを削除するときに本当に消していいのかという
確認ダイアログを求められるのですが
これを出さずに強制的に削除する方法ってあるのでしょうか?

405 :デフォルトの名無しさん:2009/06/05(金) 21:58:29
>>404
Application.DisplayAlerts = False

406 :デフォルトの名無しさん:2009/06/06(土) 02:07:20
>>403
そのマクロの中身がわからんことには…

407 :VBA暦12時間:2009/06/07(日) 14:49:37
すみません
初歩的な所ではまっています。

下記の処理は、
”■”なら16行目に値をカウント
”□”なら17行目に値をカウント
という処理をしています(4列目に実際に加算したい数値が入っています)

この場合、何回もボタンを押すとどんどん値がふえてしまうのでボタンをおしたタイミングで16行目と17行目を0クリアしたいのですが、
コメントにしている部分を解除にすると、なぜか計算がされません。(0のまま)
どなかたどうかご教授よろしくお願いいたします。

Private Sub CommandButton1_Click()

For 列 = 5 To 27
For 行 = 5 To 10
' Cells(16, 列) = 0
'Cells(17, 列) = 0

If Cells(行, 列) = "■" Then
Cells(16, 列) = Cells(16, 列) + Cells(行, 4)

ElseIf Cells(行, 列) = "□" Then
Cells(17, 列) = Cells(17, 列) + Cells(行, 4)
End If
Next
Next
End Sub

あと自分のレベルで参考になるVBAサイトもご紹介いただけると助かります。
よろしくお願いいたします

408 :デフォルトの名無しさん:2009/06/07(日) 15:52:12
0にクリアするところはFor文の外にしなきゃだめだよ

409 :VBA暦12時間:2009/06/07(日) 16:42:40
うわっ!俺あほだ!
ありがとうございました!

410 :デフォルトの名無しさん:2009/06/07(日) 20:46:57
Option Base 1
Sub a()
Dim a
Dim b(3, 3)
'空いてる数字探し配列bに入れる
For n = 1 To 10000000
a = Range("a1:c3")
For i = 1 To 3
For k = 1 To 3
If a(i, k) <> 0 Then
b(i, k) = a(i, k)
End If
Next
Next
'実際に作成
For i = 1 To 3
For k = 1 To 3
If a(i, k) = 0 Then
'bにない数字を探す
Do
c = Int(9 * Rnd + 1)
If (Application.Match(c, b, 0) >= 1) Then GoTo fjk


411 :410の続き:2009/06/07(日) 20:48:22

Loop
fjk:
b(i, k) = c
End If
Range("a10:c12") = b
Next
Next
Next
If (1 = 2) Then
Exit Sub
'ここまで

If (Application.Match(c, b, 0) >= 1) Then GoTo fjk
の時点で型が違いますとエラーが出ます、これは何故でしょうか?
ワークシート関数matchで検索し、配列bの中にcがあるかどうかを調べようとしているのですが、cがどんな数字でもエラーが出てしまいます。どうしてでしょうか?

コードの主な内容は、A1:C3を元に乱数で魔方陣を作ってみようというものです
配列aはA1:C3セルの数字、配列bは一時的な計算用配列です


412 :デフォルトの名無しさん:2009/06/07(日) 21:43:55
型が違うってことは型が違うんだよ!さっさと死ね!

413 :デフォルトの名無しさん:2009/06/07(日) 22:32:48
え・・

414 :デフォルトの名無しさん:2009/06/07(日) 22:38:09
んー。癖が強すぎるコードだなぁ。
余談だけど、こんな書き方を推奨してる参考書でもあるの?

条件指定なしのdoを使ってる所見ると、他言語で覚えたかな。
if thenでGoToに飛ばすコードは記憶の限りでは初めて遭遇したんだけど、
他の言語だと一般的なのかな?後学の為に教えてください。

cが宣言無しで突如出てきてるのは、まぁ良いのか。
bは2次元配列のはずなのに、matchでは何も指定されてないけど、
そこが問題じゃない?

415 :デフォルトの名無しさん:2009/06/07(日) 22:39:10
Windows:XP
オフィス:2003


VBAの勉強を始めようとセルの結合や色付けなど
ごく初歩的なマクロを使ってるのですが
マクロで実行した操作を戻ることはできないのでしょうか?

たとえばA1:B1セルの結合をすると
戻るボタンがグレーになり、保存せずに閉じて開きなおすしか戻る方法がありません。
これをマクロで実現するにはどうすればよいのでしょうか?

416 :デフォルトの名無しさん:2009/06/07(日) 23:00:29
>>414
おお!ありがとうございます!!そこでした
doloopとgotoは今回始めて使いました。参考書とかは特に見ていません。
普通はuntilなどと組み合わせるのですね

ワークシート関数のmatchは↓のページを参考にしたのです
ttp://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200706/07060141.txt
If (Application.Match(c, b(2, 2), 0) >= 1) Then GoTo fjk
でも
If (Application.Match(c, b, 0) >= 1) Then GoTo fjk
でも型が違うとエラーが出ます。何が悪いのでしょう?
↓できるだけまとめてみました

Option Base 1
Sub a()
Dim b(3, 3)
For i = 1 To 3
For k = 1 To 3
b(i, k) = 5
Next
Next
Do
c = 5
If (Application.Match(c, b(2, 2), 0) >= 1) Then GoTo fjk
Loop
fjk:
End Sub


417 :デフォルトの名無しさん:2009/06/07(日) 23:08:05
matchなんて使った事無いんだが、2次元配列内を一発で検索出来るのか?それ。

418 :デフォルトの名無しさん:2009/06/07(日) 23:09:01
>>415
マクロで実行した物は戻せない。
結合したものを解除したいなら、結合を解けば良い。

419 :デフォルトの名無しさん:2009/06/07(日) 23:12:48
>>417
可能ですよ。存在してたら数字、存在してなかったら型が違うとエラーになります。
ただ>>416ではウォッチ式見ても型も同じです
Sub a()
Dim myary
myary = Array( _
"加入者番号:", "加入者:", "会社名:", "登録日:", "加入日:", _
"予定事項:", "担当者:", "部門:", "区分:", "住所:", _
"請求書住所:", "電話:", "請求書電話:", "アドレス:")
MsgBox Application.Match("登録日:", myary, 0)
End Sub


420 :デフォルトの名無しさん:2009/06/07(日) 23:12:53
>>416
釣りだよな?

421 :デフォルトの名無しさん:2009/06/07(日) 23:14:54
>>420
違います。
本気で分からないので教えてくださいorz

422 :デフォルトの名無しさん:2009/06/07(日) 23:15:54
>>419
それじゃ1次元配列じゃないか。

423 :デフォルトの名無しさん:2009/06/07(日) 23:30:29
If (Application.Match(c, b(2, 2), 0) >= 1) Then GoTo fjk

b(2,2)が配列もしくは範囲ではないから

424 :デフォルトの名無しさん:2009/06/07(日) 23:34:55
>>419
Sub test111()
Dim ar As Variant
ar = [{1,2;3,4}]
MsgBox Application.Match(1, ar, 0)
End Sub

2次元配列にmatch掛けられないじゃないか。
存在していても型エラー出る。


425 :416:2009/06/07(日) 23:46:36
申し訳ございませんでした!

426 :デフォルトの名無しさん:2009/06/08(月) 15:28:10
>>414
BASICではそもそもIF THENの後のGOTOは省略できるってほど
THEN GOTOが人気だったんだぜ…

>>416
この用途だと Exit Doで十分だな。
というか、今時GoToなんて苦行する必要ない。
GOTO 、GOSUBなんてのはユーザー関数が無かったころの名残。

427 :デフォルトの名無しさん:2009/06/08(月) 20:31:59
テキストとか読み込みとき、Line InputとFileSystemObjectの機能とどっちを使うほうがいいの?

428 :デフォルトの名無しさん:2009/06/08(月) 21:25:23
       ,-┐
 ,ィ─、ri´^-─- 、 .┌f^f^f^f^f^f^f^f^f^┐
く  / , ,'   ヽ ヽ| ~ ~ ~ ~ ~ ~ ~ ~ ~│
 `<' / ,'レイ+tVvヽ!ヽト 知ってるが  │
  !/ ,' i |' {] , [}|ヽリ  お前の態度が |
  `!_{ iハト、__iフ,ノリ,n   気に入らない |
   // (^~ ̄ ̄∃_ア____n_____|
 _r''‐〈  `´ア/トr──!,.--'
<_>─}、  `」レ
'ヽ、   ,.ヘーァtイ
   Y、.,___/  |.|
    |  i `ー'i´

429 :デフォルトの名無しさん:2009/06/08(月) 22:04:04
昔はLine Inputだったけど、今ならFileSystemObjectを使うのが一般的

430 :427:2009/06/08(月) 22:14:12
>>429
レスさんくすです

431 :デフォルトの名無しさん:2009/06/08(月) 23:15:19
Function Line(args1)
ActiveCell.FormulaR1C1 = "=COUNTIF(Sheet1!R1C[args1]:R30000C[args1],RC[-1])"

こういう感じでargs1を変数にして呼び出し元で中身を変えて実行したいのですが
どうしてもうまく来ません
どうやればいいのか教えてください

432 :デフォルトの名無しさん:2009/06/08(月) 23:46:53
>>431
ActiveCell.FormulaR1C1 = "=COUNTIF(Sheet1!R1C[" & args1 & "]:R30000C[" & args1 & "],RC[-1])"

433 :デフォルトの名無しさん:2009/06/09(火) 09:50:58
俺なら
= replace("=COUNTIF(Sheet1!R1C[@]:R30000C[@],RC[-1])", "@", "1")
とやる事が多い

434 :433:2009/06/09(火) 09:53:58
= replace("=COUNTIF(Sheet1!R1C[@]:R30000C[@],RC[-1])", "@", args1)


435 :デフォルトの名無しさん:2009/06/09(火) 23:42:12
質問です。

例えばですが、「abcdefg」といった文字列に、「def」が含まれているか、
といった処理をさせようとしているんですが、どうやって比較したらよいのでしょうか?

*def*または、?def?の使い分けもできるようにしたいんですが、可能でしょうか?

436 :デフォルトの名無しさん:2009/06/09(火) 23:50:42
>>435
InStr
正規表現

437 :デフォルトの名無しさん:2009/06/10(水) 00:40:03
*def*と?def?の使い分けIをnStrでどうやるんだろ?
俺には分らんな。
Like演算子なら使い分けは簡単。
"abcde" Like "?bcd?"ならTrueだが
"abcdef" Like "?bcd?"ならFalseだ。

438 :デフォルトの名無しさん:2009/06/10(水) 11:35:40
正規表現なら、

.*def.*
.def.

だぬ。

439 :デフォルトの名無しさん:2009/06/10(水) 14:50:52
ADOからSQLで"*def*"とやるとエラーになんだよね
"%def%"もしくは"_def_"と覚えたほうがいいと思う

440 :デフォルトの名無しさん:2009/06/10(水) 18:29:09
>>437
横スレだけど、
len(str) が5文字かつ、instrが2なら "?bcd?" に該当するんじゃないかな。
正規表現やlike演算子使った方が楽だけど。

441 :デフォルトの名無しさん:2009/06/10(水) 18:29:21
×スレ
○レス

442 :437:2009/06/10(水) 19:43:01
>>440
なるほど。

443 :デフォルトの名無しさん:2009/06/10(水) 20:11:04
よこだっ!いいぞ!いいぞ!そう!よこっ!すれっ!すれっ!!よこすれっっ!!!

444 :デフォルトの名無しさん:2009/06/10(水) 22:54:02
質問です。

「マクロ→セキュリティ→Visual Basicプロジェクトへのアクセスを信頼する」にチェックを入れるのを、
マクロで行う事って出来ないんでしょうか?

445 :デフォルトの名無しさん:2009/06/10(水) 22:59:50
>>444

何のウイルスを配布するつもりなの?

446 :デフォルトの名無しさん:2009/06/10(水) 23:16:43
OS:Windows XP Professional SP2
Excel:2000

以下2つなのですが、参照している列と値を格納する配列以外は全く一緒です。
引数の参照渡しとかでまとめることはできませんか?

Yousosu=0
For Each Youin In Range(Cells(36,3),Cells(49,3))
  If Youin.Value="" Then
    ReDim Preserve Joken1(Yousosu)
    Joken1(Yousosu)=Cells(Youin.Row,2).Value
    Yousosu=Yousosu+1
  End If
Next


Yousosu=0
For Each Youin In Range(Cells(36,4),Cells(49,4))
  If Youin.Value="" Then
    ReDim Preserve Joken2(Yousosu)
    Joken2(Yousosu)=Cells(Youin.Row,2).Value
    Yousosu=Yousosu+1
  End If
Next

447 :デフォルトの名無しさん:2009/06/11(木) 00:54:09
できま

448 :427:2009/06/11(木) 01:05:01
s(ry

449 :デフォルトの名無しさん:2009/06/11(木) 02:13:20
すぇん

450 :デフォルトの名無しさん:2009/06/11(木) 08:00:42
>>446
異なる部分を引数にもつ関数作れば?

451 :デフォルトの名無しさん:2009/06/11(木) 09:59:51
>>446
やりたいことが分からんけど

Dim Joken(36 to 49, 3 to 4)

For i=36 to 49
If Cells(i, 3).value = "" Then
Joken(i, 3)=Cells(i, 2).value
endif
If Cells(i, 4).value = "" Then
Joken(i, 4)=Cells(i, 2).value
endif
Next i

452 :デフォルトの名無しさん:2009/06/11(木) 13:06:37
>>444
レジストリ

453 :デフォルトの名無しさん:2009/06/11(木) 20:25:43
VBAの年月を取得したいのですが

以下のように作成したのですが、

年:XXXX 4桁で取得できました。
月:XX 2桁ができません、1桁になります。

  5月なら05として取得したいのですが、修正方法がわかりません
  A1には、2009/5/1と入力しています。

VBAに詳しい方で簡単に、どうぞお願いします。

Sub sample()
Dim myDate As Date
myDate = Range("A1").Value

Range("B7").Value = Year(myDate)
Range("C7").Value = Month(myDate)
Range("D7").Value = Day(myDate)

End Sub


454 :デフォルトの名無しさん:2009/06/11(木) 20:51:04
>>445
>>452

ウイルスとかじゃなくて、あちこちアップデートが必要ににりそうなファイルを
自動でパッチあてる感じにしたいんだ

レジストリはVBEマクロでいじれるもんなの?

455 :デフォルトの名無しさん:2009/06/11(木) 20:56:16
>>453
A1が日付なら
Range("B7").Resize(, 3).Value = Split(Format$(Range("A1").Value, "yyyy/mm/dd"), "/")
の1行で充分じゃね?

456 :デフォルトの名無しさん:2009/06/11(木) 20:57:19
>>453
書式設定か、

Range("C7").Value = "0" & Month(myDate)

457 :デフォルトの名無しさん:2009/06/11(木) 21:00:18
>>450
そうなのですが、いろいろ試してもうまくいかなくて…

>>451
すみません。どんな動作をしたいか、書いておくべきでした。
なるほど…2次元ですか。
ただ、できれば動的配列にしたいかなぁなんて思ってまして。
2次元だと、Preserveは片方にしか利かないとか。

ありがとうございました。また、自分でも考えてみます。

458 :デフォルトの名無しさん:2009/06/11(木) 21:03:50
>>456
それじゃ10月は010になってまずいんじゃないかなぁ。
右2文字を取り出せばいいけどね。

459 :デフォルトの名無しさん:2009/06/11(木) 21:25:21
>>455
>>456
サンクス
 宣言した変数(例、TTTTTTT)に05を文字列として入力したい)

 A1に2009/5/1と入力して、あるフォルダの2009年05月XXX.xlsというファイルを
 読み込むマクロを書いています。

 よろしくお願いします。

460 :デフォルトの名無しさん:2009/06/11(木) 21:29:22
>>453
Range("C7").Value = "'" & Format(myDate, "mm")

これじゃダメかな?

461 :デフォルトの名無しさん:2009/06/11(木) 21:35:54
>>459
Format$(Range("A1").Value,"yyyy年mm月XXX")の文字列を作ってWorkbokks.Openと組み合わせるだけ。

462 :デフォルトの名無しさん:2009/06/11(木) 21:37:25
>>460
できました。
 サンクス
   , - ,----、
  (U(    )
  | |∨T∨
  (__)_)


463 :デフォルトの名無しさん:2009/06/12(金) 01:08:40
取得した文字列を、すでに宣言した変数名と一致させて
使いたいのですが、できますか?
やりたいのは

Dim ABCDE As Integer
Dim moji As String

moji = AB
"moji"CDE = 5

みたいな感じです




464 :デフォルトの名無しさん:2009/06/12(金) 03:32:11
>>463
変数はただの入れ物だから、無理じゃないかなぁ

何がやりたいか詳しく書いてくれたら、
別の方法になるかもしれないけれど、実現できるコードを考えられるかも

465 :デフォルトの名無しさん:2009/06/12(金) 04:26:27
>>464
たぶん>>463が言いたいのはリフレクションを使って
動的に変数を追加・参照することは出来ないかってことじゃね?
そんなことをして、なんになるのか分からないが、そういうことだと思う
# javascriptで関数電卓のフレームワーク+プラグイン(関数やらが定義されてたりする)を作ったときに使ったくらいかな?

たぶん、VBAのリフレクションは貧弱だから出来なさそうな気がする。
だけど、サンプルを見る限り、連想配列で良いんじゃね?って思うな。

最終的にやりたいことは
userStatus("Jonson") = "空腹"
userStatus("Harris") = "眠い"
userStatus("cherry") = "ピヨピヨ来た"
ってことでしょ。

VBAでどうやって連想配列を使うか知らないけど。
# たぶん、つかえないだろうなぁ
# 無かったら、自分で作ればいいけど、速度面でどうなんでしょうねぇ。
# 下手なハッシュ関数作るより、 配列二つ並べて、逐一中身を検索した方が早かったりしてw

466 :デフォルトの名無しさん:2009/06/12(金) 05:21:46
>>463
http://okwave.jp/qa2033484.html
これみたいなカンジ?

467 :デフォルトの名無しさん:2009/06/12(金) 06:05:14
>>465
なんか、全然わかってなくて書いちゃって恥ずかしいっす。
教えてくれてあんがと。

連想配列の使い方を調べたら、Dictionaryオブジェクトだらしいです。

468 :463:2009/06/12(金) 07:51:24
"moji"CDEってのが変数ABCDEのつもりです


たとえば
takeda
aoyama
tanaka
sirakawa
aoyama
koyama

みたいな50種類くらいの名前がかぶりつつ列挙されてて、それぞれ何個
でてきたかしりたいのです。
変数 aoyama_name,koyama_name,takeda_name
と人数分の変数を宣言しておいて、セルの文字列を順に取得し、
その文字列に対応する変数にカウントしていく方法ができないかと



469 :デフォルトの名無しさん:2009/06/12(金) 08:13:29
該当したらインクリメントすりゃ良いんでないかい?
Instrでもlikeでも正規表現でも、何でも良い様な気がする。

470 :デフォルトの名無しさん:2009/06/12(金) 09:34:58
>468 こういうことでいいのかな。
A列に(1行目から)集計対象があり、B列、C列に集計結果を出力する。
Option Explicit
Dim 名前(100) As String, 件数(100) As Integer, i As Integer, i_max As Integer, 縦 As Long, 内容 As String
Sub カウント()
  Call 初期処理
  内容 = Cells(縦, 1).Value
  Do While (内容 <> "")
    If i_max = 0 Then
      名前(0) = 内容: 件数(0) = 1: i_max = 1
    Else
      For i = 0 To i_max
        If 内容 = 名前(i) Then
          件数(i) = 件数(i) + 1
          Exit For
        Else
          If i = i_max Then
            名前(i_max) = 内容: 件数(i_max) = 1: i_max = i_max + 1
            Exit For
          End If
        End If
      Next i
    End If
    縦 = 縦 + 1: 内容 = Cells(縦, 1).Value
  Loop
  For i = 0 To i_max - 1  '集計結果の出力
    Cells(i + 1, 2).Value = 名前(i): Cells(i + 1, 3).Value = 件数(i)
  Next i
End Sub
to be continued

471 :デフォルトの名無しさん:2009/06/12(金) 09:38:23
続きです
Private Sub 初期処理()
  For i = 0 To 100
    名前(i) = "": 件数(i) = 0
  Next i
  i_max = 0: 縦 = 1
  Exit Sub
End Sub
以上
出現順に名前を格納する配列と件数を格納する配列を用意して、セルの内容を読み込む都度
名前配列を順に調べていく、初めてならば添字を+1して名前を格納し、同じ添字の件数配列
に1をセットするというやり方です。もっとスマートな方法があればお知らせください。

472 :デフォルトの名無しさん:2009/06/12(金) 12:25:10
>>468
Excelの本来の機能は表計算ソフトだから、個数を集計する方法はいくつもあるよ。
COUNTIFとかピボットテーブルとか。
VBAだけでやろうとするより、ワークシートにデータを入れちゃって集計の関数を使った方が早い。

VBAだけでやりたいならDictionaryって便利な機能がある。同じ物があったかどうかのチェックが
とても簡単。

Sub 集計()
  Dim name() As String  'テスト用データを用意
  name = Split("takeda,aoyama,tanaka,sirakawa,aoyama,koyama", ",")
  Set dic = CreateObject("Scripting.Dictionary")

  For Each n In name  '配列で集計
    If dic.exists(n) Then
      dic(n) = dic(n) + 1
    Else
      dic.Add n, 1
    End If
  Next

  For Each d In dic  '結果出力
    Debug.Print d, dic(d)
  Next
End Sub

473 :470:2009/06/12(金) 13:14:48
>472
こういうことができるんですね。
集計対象データが大量の場合は、いったん文字列変数にに","をはさんで連ねていくことになりますね。
Dictionaryの機能は半角英数の大文字・小文字の別とか日本語対応はどうなんでしょう。


474 :デフォルトの名無しさん:2009/06/12(金) 13:25:58
>>473
あくまでもサンプルだから , で区切ったデータを用意したけど、
実際のデータはワークシートやファイルから読み込むのが普通。
キーワードには日本語も使える。英字の大小は区別される。
データを "鈴木,高橋,山田,田中,鈴木,高橋" に変えて試してみ。

475 :デフォルトの名無しさん:2009/06/12(金) 14:28:42
50件程度なら重複チェックを省略しても、とりたてて問題はない。

  For Each n In name  '配列で集計
    dic(n) = dic(n) + 1
  Next

たったこれだけで集計できる。
データが増えると遅くなるけど。

476 :デフォルトの名無しさん:2009/06/12(金) 16:22:18
UserFormから数式を入力させて、その数式に該当するセルに処理を行いたいのですが、
ヒントになるサイトか関数などあれば教えてください。よろしくお願いします

477 :463:2009/06/12(金) 16:27:12
実は集計するだけではなく、
高橋 100点
三根 98点
山田 100点
高橋 100点
青山 97点
山田 99点 
(50人くらい、データは1000件くらい)

で100点の人だけ集計して100点の高橋が何人いて、
100点の山田が何人いるみたいなことをしたかったので、
100点で検索して左のセルをみて、
文字列を取得して、その取得した文字列と
関連するの配列名にカウントしたかった
のですが、どうもdictionaryでできそうです。
みなさんありがとうございました。

478 :デフォルトの名無しさん:2009/06/12(金) 16:27:50
「数式に該当するセル」が意味不明
実例を示せ

479 :デフォルトの名無しさん:2009/06/12(金) 16:30:15
>>477
その程度ならVBAなんぞ使わんでも一発で集計できるがね


480 :デフォルトの名無しさん:2009/06/12(金) 16:43:26
>>478
失礼しました

やりたいことは条件付き書式設定のようなことで、
例えば

30
20
50
60
40
80

というセルを選択した後、ユーザーフォームから数式を入力してボタンを押すと
数式に該当するセルに対して、処理を行うということです。
条件付き書式設定を使えというのは無しでお願いします。。。

481 :デフォルトの名無しさん:2009/06/12(金) 17:31:32
列なの行なの?
なんなのその数字。

482 :デフォルトの名無しさん:2009/06/12(金) 18:13:09
Chr(13)とvbCrlfの使い分けの判断は何?

483 :デフォルトの名無しさん:2009/06/12(金) 19:49:23
vbCrLf = Chr(13) & Chr(10)
Chr(13) = vbCr
Chr(10) = vbLf

484 :デフォルトの名無しさん:2009/06/12(金) 21:11:04
>>482
改行コードは状況によって変わることがあるから
Chr(13)とかChr(10)とかに固定すると具合が悪いこともある

485 :デフォルトの名無しさん:2009/06/12(金) 21:20:26
ぜんぜん「数式に該当するセル」の説明になってない…

486 :デフォルトの名無しさん:2009/06/13(土) 09:26:08
俺がエスパーすると
数式の解に該当する数字の入ったセル

487 :デフォルトの名無しさん:2009/06/13(土) 10:58:14
数式: >=50
数式に該当するセル: 50 60 80

ってことじゃね

488 :デフォルトの名無しさん:2009/06/13(土) 11:10:30
俺がエスパーすると、

フォームから「A2=A1+10」と入力する。A1に5が入っていたとしたらA2に15を入れる。

どうだ?

489 :デフォルトの名無しさん:2009/06/13(土) 12:27:04
463が説明しようとする度にエスパーが大量に必要になりそうな悪寒
何をどうしたいのか細切れに話そうとしてるからますます判らん w

490 :デフォルトの名無しさん:2009/06/13(土) 12:28:17
       ____
     /_ノ  ヽ、_\
   o゚((●)) ((●))゚o   ,. -- 、
  /::::::⌒(__人__)⌒:::::: /    __,>─ 、
  |     |r┬-|    /          ヽ
  |     | |  |   {            |__
  |     | |  |    }  \       ,丿 ヽ
  |     | |  |   /   、 `┬----‐1    }
  |     | |  |  /   `¬|      l   ノヽ  wwwwwwwwwwwwwwwww
  \      `ー'ォ /    、 !_/l    l    /  }
           {       \     l   /  ,'
           \      ´`ヽ.__,ノ  /   ノ
             \     ヽ、\ __,ノ /
               ̄ ヽ、_  〉 ,!、__/



491 :デフォルトの名無しさん:2009/06/13(土) 16:20:49
>>480
数式からEvaluateで戻り値を求めて、その戻り値でフィルターにかけりゃいいじゃん。
それともフィルタオプションで検索条件範囲の1行目を空白にして、2行目に=A2=数式と書きだして抽出するとかね。

492 :491:2009/06/13(土) 16:24:49
俺のエスパー度はマグニチュード7くらいの自信があるから上で間違いないな。

493 :デフォルトの名無しさん:2009/06/13(土) 16:52:40
463まとめ
>>463
>>468
>>477
>>480


494 :デフォルトの名無しさん:2009/06/13(土) 21:30:24
>>493
仲間はずれがいるぜ。
>>480>>476だな。

495 :デフォルトの名無しさん:2009/06/13(土) 22:23:18

                  /   ノノ ノノノ ヾヽ、ヽ
               /   ノj `      ´ i |    
               i    {   ` , ,-,、´  i | 
              {    i     )-―-'(  i |    
                 ヽ   i     ⌒   } |_,,,. -‐- 、  
              __)), ,ノ人   、_,  ノ''"´   ,      \ 
                /       ` ー--,. '´   . : :`(      ゝ、
               /           : : :: :´: .         : :\ , ' ´_   ヽ
           /  r´: :       : : : :       ,. ' ´ ヽ>'´    ,'ヽ!
             / γ: :        ノ    _   ,, 、,, ,,__i  。 ./       ; ,!
           i   ir' " ヽ    ,,, ''' ´         `"7         :/ 
         i  |、 ° }, '                 ` y'         /
   "'''‐‐- ...,,,_|   ヽ、ー/           __    _/          /
             `'''-,,,て          ´    ̄ ̄ /          ,イ 
             `''-、__/            /    `  / ,!    _,
                     `''-,,_     ,..、_,,..イ´      i'´  `ゝ''"´
                    \_ ,,,,,...ゞ、_           |ー-/  
                           ミ〉       !r'´
                         ヽ   ミ/、 /|  i  i }


496 :416:2009/06/14(日) 13:08:25
Sub Macro1()
Dim sssss As Range
Set sssss = Range("a1:aa27")
Do
Loop Until sssss <> Range("a1:aa27")
End Sub

上記のコード5行目で型が違うとエラーが出ます。どうすればよいでしょうか?
doloopの中身はRange("a1:aa27")の内容の変更で、変更しなくなるまで続けるコードです

497 :496:2009/06/14(日) 13:09:11
416は別スレの名前が残ってしまいました、すいません

498 :デフォルトの名無しさん:2009/06/14(日) 13:29:42
>>496
何がやりたいのか分らんな。
それにおめーどう見てもこのスレの>>416じゃないかw
嘘つくんじゃないよ。
ハンドルをコロコロ変えて指摘されると別人だと言い張るやつらと変わらんな。

499 :デフォルトの名無しさん:2009/06/14(日) 13:40:38
>>498
スンマセン別に嘘ついたわけじゃないです
違うスレの名前と思ったらここのでした

分かりにくくすいません。
まとめると、
Range("a1:aa27") を一旦変数sssssに入れ、
Range("a1:aa27") の数字を変更した後
sssss <> Range("a1:aa27")
の真偽を確かめたいのです
変更しない場合もありますので、その場合loopから抜け出したいのです

500 :デフォルトの名無しさん:2009/06/14(日) 16:54:14
>>499
> Range("a1:aa27") の数字を変更した後
> sssss <> Range("a1:aa27")
> の真偽を確かめたい

これで実現できる事が分からん。
手先のやり方でなくて、最終的な目的を書いた方がレスしやすいよ、あんたの場合。

501 :デフォルトの名無しさん:2009/06/14(日) 17:56:04
数字を変更って二通りに解釈できるんだけど。
範囲を変えるのか(たとえばRange("A1:AA27")をRange("A1:AA999")に変える)
セル内の数値を変えるのか。(Range("A1").Value=123みたいに)

502 :デフォルトの名無しさん:2009/06/14(日) 18:52:19
>>500
ライフゲームを作ってるんです
常に変化する配列で、配列が変化しなくなったら終了しようと思いました
>>501
分かりにくいですね
Range("a1:aa27")のセル一つ一つのVALUEです。

503 :デフォルトの名無しさん:2009/06/14(日) 18:57:39
もっと分からなくなってしまった・・・

504 :デフォルトの名無しさん:2009/06/14(日) 19:10:28
説明下手で吸いませんでしたorz
もう別セルを作業セルとして使います・・

505 :デフォルトの名無しさん:2009/06/14(日) 21:27:16
ライフゲームならわかるぞ。
それならワークシートを3枚用意して
1枚目=初期状態
2枚目=次の世代
3枚目=1枚目と2枚目の差を計算する数式、空いてる列にシート全体の合計
みたいにして、その合計の部分が0になったかどうか調べるのが一番簡単かな。遅いけどね。

VBAだけで処理を完結させたかったら、
配列を一気に比較する方法はないので、ループを回すしかない。

506 :デフォルトの名無しさん:2009/06/14(日) 21:28:28
>>505
神!!ありがとうございます
しかも自分が作ってるノより楽そうです

507 :デフォルトの名無しさん:2009/06/14(日) 22:12:02
すみません質問です。
可変する最終行のセルに合計を求めたいのですが。
具体的には・・・
・A1〜C3の数が埋まっている表がある
(この表は可変し、範囲がA1〜C20の時もある)
・例として、A1〜C3の範囲だけの表の時は、A4・B4のセルを結合し、"合計"と表示、
 C4にC1〜C3の合計の数値を返す数式。

範囲が可変するのでそれに対応するマクロを組みたいのですが
どなたかご教授お願い致します。

508 :デフォルトの名無しさん:2009/06/14(日) 22:24:57
>507
それだけならマクロ組む必要はありません。「Excel総合相談所 83」の
レス番号80と86を参照してください。


509 :デフォルトの名無しさん:2009/06/14(日) 22:43:00
>>507
Sub sample()
Dim LstR As Long
LstR = Range("C65536").End(xlUp).Row
With Range("C" & LstR + 1)
.Value = WorksheetFunction.Sum(Range("C1:" & "C" & LstR))
With .Offset(, -2).Resize(, 2)
.Merge
.Value = "合計"
End With
End With
End Sub

510 :509:2009/06/14(日) 22:55:21
C列最終行に数式そのものを入れたいならこっち

Sub sample()
  Dim LstR As Integer
  LstR = Range("C65536").End(xlUp).Row
  With Range("C" & LstR + 1)
    .Formula = "=Sum($C$1:" & "C" & LstR & ")"
    With .Offset(, -2).Resize(, 2)
      .Merge
      .Value = "合計"
    End With
  End With
End Sub


511 :デフォルトの名無しさん:2009/06/15(月) 01:28:36
<VBA入門>
Excel VBA 入門講座
http://excelvba.pc-users.net/
Excel全開VBA
http://www.sigoto.co.jp/excel/
moug モーグ | 即効テクニック |
http://www.moug.net/tech/exvba/

<練習問題>
VBA関連問題集
http://www.accessclub.jp/ac-quiz/quiz.cgi?d=vba&m=2
Excelチャレンジ500
http://excel-quiz.sakura.ne.jp/index.php

<公式>
Microsoft Excel Visual Basic リファレンス
http://msdn.microsoft.com/ja-jp/library/cc363846.aspx

512 :デフォルトの名無しさん:2009/06/15(月) 17:23:52
質問です。
chitest(実測値範囲, 期待値範囲)を使うときに、
実測値範囲, 期待値範囲を変数で指定したいのですが、
どうすればよいでしょうか

513 :デフォルトの名無しさん:2009/06/15(月) 17:41:39
>>512
パラメータには配列を使うことができるから、
配列のサイズを、範囲指定用の変数を使ってReDimで変えてやればいいと思う。

(例)
Dim val() As Double
Dim expVal() As Double
ReDim val(3)
ReDim expVal(3)
val(0) = 1
val(1) = 2
val(2) = 3
val(3) = 4
expVal(0) = 2
expVal(1) = 4
expVal(2) = 6
expVal(3) = 8
P = WorksheetFunction.Chitest(val, expVal)
Debug.Print P

514 :デフォルトの名無しさん:2009/06/15(月) 17:55:57
if not (cell is nothing) then
   v = cell.value
else
   v = 0
end if
ということがよくあるんだが、
これは三項演算子iffを使うのが一般的?それともifで場合分けするのが一般的?

515 :デフォルトの名無しさん:2009/06/15(月) 18:01:51
それは好き々き。
それよりも「セルの内容が不定で、値が入っていたり空白だったりする」ようなシートの設計に
問題がないか考えてみた方がいい。
データの個数が不明ならxlUpとかUsedRangeとか使って処理の必要な範囲を決められるように
できないか検討してみる。

516 :デフォルトの名無しさん:2009/06/15(月) 18:28:49
VBAって三項演算子実装してるの?

517 :デフォルトの名無しさん:2009/06/15(月) 20:03:06
VBAに参考演算子はないが、似たようなものにIIf関数がある。
ただこれを使うのはアフォということになってる。
もうめちゃくちゃ遅いからね。

518 :デフォルトの名無しさん:2009/06/15(月) 20:22:56
アホはおまえ

519 :デフォルトの名無しさん:2009/06/15(月) 20:28:13
うん、おれもアフォお前もアフォ

520 :デフォルトの名無しさん:2009/06/15(月) 20:43:49
まぁ分ってる人はIIf関数は使わんわな。

521 :デフォルトの名無しさん:2009/06/15(月) 21:58:28
定数を返す時は普通に使うな。Ifでダラダラ書くの鬱陶しいし。
予め真偽両方の戻り値が評価されてしまうことに注意しとけばOKじゃね?
大体、多少の無駄は、Excelのオブジェクトにアクセスするコストと比べると、
どうでも良いレベルになっちゃうんだよなあ。

522 :デフォルトの名無しさん:2009/06/15(月) 22:34:08
IIFってググって見たけど、演算子とは全く性質違うのね。
と言うか、三項演算子とも解釈が全然違う、ただの関数か。

三項演算子じゃないなら、if重ねて書いた方が可読性上がるな。

523 :デフォルトの名無しさん:2009/06/15(月) 22:44:25
IIFで速度気にする前にやる事あるだろうがw
一行でかけるのにIF文ずらずら書いてたらウザイわな。
可読性が悪い。

524 :427:2009/06/15(月) 22:46:20
おれはIf文のみのが読みやすいけど

525 :デフォルトの名無しさん:2009/06/15(月) 22:49:51
つまり
Function IIF(exp as boolean, trueValue as valiant, falseValue as valiant)
  if exp then IIF = trueValue else IIF = falseValue
end function
とほとんど同じって事か?

なら、value = Iif(cell is nothing, 0 , cell.value)しても
結局cell(=noting)を参照することになるから例外発生するじゃないか
代入演算子と比較演算子が同じだから
if (cell=Range.Find()) is nothing then〜
という簡略化も出来ないし

VBAって難しいんですね

526 :デフォルトの名無しさん:2009/06/15(月) 23:13:27
>>523
ifで連ねた方が圧倒的に可読性高い。
他の三項演算子が実装されてる言語でも、
可読性が下がるって理由で三項演算子は避けられる事が多いよ。

Ifなんてネスティングで分岐するのが当たり前な訳で、
無理やりIIFでネストしたら手に負えないだろう。



527 :デフォルトの名無しさん:2009/06/15(月) 23:51:57
>可読性が下がるって理由で三項演算子は避けられる事が多いよ。

ソース(ry

528 :デフォルトの名無しさん:2009/06/16(火) 00:20:10
If expr Then var = valueA Else var = valueB
var = IIf(expr, valueA, valueB)
こういう単純なパターンならOK、というのが俺基準。
計算式とか入って少しゴチャゴチャしそうなら普通にIfで書く。

>>525
難しいというか面倒。VBAの開発は終了しているから進化はありえないし。
なら.NET経由で、となると今度はプロセス間通信でやりとりのコストが跳ね上がる……

529 :デフォルトの名無しさん:2009/06/16(火) 00:25:55
好きなほうつかえ

530 :デフォルトの名無しさん:2009/06/16(火) 00:37:01
>>526
知らない奴の可読性が落ちるから、が正解。

531 :デフォルトの名無しさん:2009/06/16(火) 01:12:09
常識で考えて

Function IIF(exp as boolean, trueValue as valiant, falseValue as valiant)
  if exp then IIF = trueValue else IIF = falseValue
end function

でIIF使わねーだろ!例にも限度があるぞ!
IFにIFをネストする場合は使わないんだよ。

しかも3項演算子とIIFは別物だから関係ない!

532 :デフォルトの名無しさん:2009/06/16(火) 01:16:24

If expr Then var = valueA

って一文で書く奴アホやで。

C言語でも可読性考えて必ず{}は省略せずに括って3行にすんだよ。

If expr Then exit sub とかならまだ許せるけどな。

533 :525:2009/06/16(火) 02:13:20
>>531 >>532
ひょっとして僕が叩かれてる?

>>532
掲示板にちょっと書くくらい良いじゃないか。
言いたかったのは、IIFが演算子ではなく、関数と同じ
しかも、自分で実装できる程度のものか?ということ。

無駄に一行にまとめるのが愚行だというのは同意しますよ。
#でも、無駄に空行を入れるのはどうかと思いますがw
#さらに言うなら、方言が出ていますよ。自覚しにくいから方言は怖いですね。

>>531
三項演算子とIIFが関係ないのは分かるが
それ以前の文で、何が言いたいのか分からない。

534 :デフォルトの名無しさん:2009/06/16(火) 06:30:18
>>528みたいな事例に限って1回だけなら許せるとしても、ループの中で使うやつはアホだな。

535 :デフォルトの名無しさん:2009/06/16(火) 08:20:49
そんなに熱くならないで!
たかだかVBAですよ?

IIfはご自由に使いなさい!(職場の方針に応じて)
ソースは見やすいように書きなさい!(VBAで他の人が修正するようなちっさい仕事ないけどね)
速度は大して気にするな!(VBAで出来るようなちっさい処理で)

536 :デフォルトの名無しさん:2009/06/16(火) 08:26:09

                  / / i   ∧ :   、     ヽ
             /)   '  '   !  /  ',: .   ヽ       !
           ///) .|  i  | / へ. {\  iヘ ,   |
          /,.=゙''"/  .!. |  |'/ ´ ̄`ヽ ヽ 「∨   |
   /     i f ,.r='"-‐'つl ハ|  i′ - 、    ノ ', /  |   細かいことは
  /      /   _,.-‐'~  八 |  |ィニヽ    ,ニ 、∨  '
    /   ,i   ,二ニ⊃ /   |  |´ :::::   ,  ⌒ヾ 八/ ,′    いいのよ!
   /    ノ    il゙フ  /  人  |    __  :::: /  /
      ,イ「ト、  ,!,!|  / ,..:':::::::::} |、   ( ノ   /  /
     / iトヾヽ_/ィ"/r.::::::::::::::::八 ヽ: 、     .イ/   ∧



537 :デフォルトの名無しさん:2009/06/16(火) 08:44:01
>>533
ぜんぜん叩かれてはいないから安心して。

538 :デフォルトの名無しさん:2009/06/16(火) 09:27:45
でもことさらIIfばっか使ってたら変なこだわりに見えるわな。
普通に書けばIfステートメントだからな。
よくいるよね。ある意味個性はあるけど人より劣った個性ってやつ。

539 :デフォルトの名無しさん:2009/06/16(火) 10:39:58
どっちの関数が速いとか、あんまり気にしないなあ。
処理が遅くて困る時は、関数単位で考えるより
データ構造とアルゴリズムを見直すべきだと思ってるし。

540 :デフォルトの名無しさん:2009/06/16(火) 11:15:16
すみません。VBA初心者ですが、質問です。
B列に、顧客名が表示されていて、
"有限会社"・"株式会社"・""・""・"(有)"←全角
の文字列を削除し【株式会社 ○○工業】→【○○工業】
とだけ表示したいのですが、【○○工業】の文字列は左詰めで表示したいと思っております。
Ltrim関数の使い方がよくわかりません。どなたかご教授お願い致します。

541 :デフォルトの名無しさん:2009/06/16(火) 11:46:17
>>540
表示ってどこに表示するの?
B列のデータを直接書き換えちゃっていいの?

542 :デフォルトの名無しさん:2009/06/16(火) 12:00:47
>>540
とりあえず、B列のデータを直接書き換えてしまうプログラム
LTrim、RTrimは使ってないけど

Sub 形態削除()
  Dim 顧客名 As String
  Dim list() As String
  Dim B As Range
  Dim s As Variant
  list = Split("有限会社,,(有),(有),株式会社,,(株),(株), , ", ",")
  For Each B In Intersect(Range("B:B"), ActiveSheet.UsedRange)
    顧客名 = B.Value
    For Each s In list
      顧客名 = Replace(顧客名, s, "")
    Next
    B.Value = 顧客名
  Next
End Sub

543 :デフォルトの名無しさん:2009/06/16(火) 12:23:17
Inc.とかCo.,Ltdは考慮しなくていいんかな

544 :デフォルトの名無しさん:2009/06/16(火) 14:15:07
>>539
そんなこたー当たり前だわな。
その上でチューンするときはIIfは使わん。
使い捨てマクロなら使うこともあるけどね。

545 :540:2009/06/16(火) 14:17:52
皆様ありがとうございます。

>541
>表示ってどこに表示するの?

すみません。複数あるシートの中で、
"顧客リストA"という名のシートと"顧客リストB"という名のシートの
B列全てです。
542さんので試しましたが、変化しませんでした・・・
申し訳ないです。

546 :デフォルトの名無しさん:2009/06/16(火) 14:25:43
>>545
そのシートを選択してから>>542を動かしてみ

547 :デフォルトの名無しさん:2009/06/16(火) 14:30:53
>>545
ほれ

Sub aaa()
  Worksheets("顧客リストA").Activate
  形態削除()
  Worksheets("顧客リストB").Activate
  形態削除()
End Sub

548 :デフォルトの名無しさん:2009/06/16(火) 15:47:47
だめじゃん

549 :540:2009/06/16(火) 15:53:22
うわあああ!
できました!
ありがとうございます!

550 :デフォルトの名無しさん:2009/06/16(火) 18:16:19
ワークシートのオブジェクト(Sheet1)でtxtという変数に文字列を代入して、
そのオブジェクトでユーザーフォームを表示してる

フォームのコードに

Sub UserForm1_Initialize()
UserForm1.TextBox1.Value = txt
End Sub

って書いた

しかしフォームのテキストボックスには何も表示されない

なんで?

551 :デフォルトの名無しさん:2009/06/16(火) 18:27:40
>>550
VB 変数 スコープ でぐぐれ

552 :550:2009/06/16(火) 18:41:36
ごめん言い忘れてた
txt変数はモジュールレベルで宣言した

553 :デフォルトの名無しさん:2009/06/16(火) 18:50:45
>>552
どのタイミングでtxtに文字列を代入したのか

554 :550:2009/06/16(火) 19:00:11
変数たくさん宣言
(このときモジュールレベルでtxt変数宣言)
--------------------------------------
他のプロシージャ色々
--------------------------------------
txtに文字列代入
--------------------------------------
UserForm1.Show

========ここからフォームのコード=========

Sub UserForm_Initialize()
UserForm1.TextBox1.Value = txt
End Sub

って感じなんだけど

という感じ

555 :デフォルトの名無しさん:2009/06/16(火) 19:01:10
>>550
根本的に間違ってるやん
自分のと↓のコードどこが違うか見比べろ

Private Sub UserForm_Initialize()
UserForm1.TextBox1.Value = txt
End Sub

556 :デフォルトの名無しさん:2009/06/16(火) 19:02:34
>>554
この2カ所にMsgBox入れて、どっちが先に出るか試してみ

txtに文字列代入
UserForm1.TextBox1.Value = txt

557 :デフォルトの名無しさん:2009/06/16(火) 19:02:47
>>554
>>550ではSub UserForm1_Initialize()って書いてあるけど?

558 :デフォルトの名無しさん:2009/06/16(火) 19:03:14
Private ってのが要るんだね
初心者でごめん
vba歴1ヶ月なもんで

559 :デフォルトの名無しさん:2009/06/16(火) 19:07:50
いや、Privateは別に関係ない

560 :デフォルトの名無しさん:2009/06/16(火) 19:10:14
いじくってみたら、フォームのコードまでtxtの値が渡ってないようだった

原因は分かったような気がするが、解決策が分からん

561 :デフォルトの名無しさん:2009/06/16(火) 19:13:02
もしかして関数のヘッダーを自分で打ち込んでるの?
コード画面のリストから選ばなきゃだめだよ。
選ぶと自動的にヘッダーが画面に出てくる。

ttp://windyakin.if.land.to/src/up38_1280.png

リストの中にUserFormとかInitializeってのが見あたらなかったら
それはプログラムを書く場所が間違ってる。

562 :550:2009/06/16(火) 19:14:06
>>561
リストから選んでる

563 :デフォルトの名無しさん:2009/06/16(火) 19:16:35
>>560
Public

564 :デフォルトの名無しさん:2009/06/16(火) 19:21:38
>>560
たぶん、こういうこと
ttp://windyakin.if.land.to/src/up38_1281.png

565 :デフォルトの名無しさん:2009/06/16(火) 19:33:27
>>562
リストから選べばPrivateも自動的に入るはず。わざわざ消した?

566 :デフォルトの名無しさん:2009/06/16(火) 20:03:48
>>554
で(このときモジュールレベルでtxt変数宣言)って書いてあるから
>>564で答えが出ているけどtxtをパブリック変数として宣言すれば解決じゃね?

567 :デフォルトの名無しさん:2009/06/17(水) 01:44:03
漠然とした質問ですみません。
勉強しながらマクロを使ってます。
いろんなマクロを作成、使っていて、そんなたいしたマクロではないんですが
何回か走らせてると処理スピードががくんと落ちて終わらなくなることがあります。
(普段なら数秒で終わるループなど)


そんな現象がおきるようになったのは自分がオブジェクト変数や配列変数を使うようになってからなので
使いかたが雑なのかと反省して、オブジェクトには使いおわったらNothingを代入、
配列はEraceしてやるなど勉強不足だった点を補ってやってもまだたまに発生します。

いちどExcelを終了するなどしてやればたいがい戻るので自分の知らない「基本」があるんだと思うんですが
原因が特定できずにおります。


このスレの先輩方でこういう経験あるかたがいれば何か思いついてもらえるかもと
書いてみました。
もしこんな質問で思いあたる点あればご教示いただければ幸いです。

568 :デフォルトの名無しさん:2009/06/17(水) 01:55:43
>>567
オブジェクト型の変数はかなり初歩の段階から、それとは知らずに使ってるはずだから
(さもないと意味のある作業が殆ど出来ない)関係ないはず。
配列は、よほど大きい(要素の数が10000以上とか)物を使わない限り、関係ない。

個人的な経験では、Win32APIを続けて10000回ぐらいコールするプログラムを
何回か動かしたらGCで15秒ぐらい動作が固まったことがあった。

569 :デフォルトの名無しさん:2009/06/17(水) 02:15:44
別に禁止してるわけでもないのに
イベントが溜まって固まったように見えることもあるね。
要所にDoEventsをはさむと改善されることがある。

570 :デフォルトの名無しさん:2009/06/17(水) 02:46:02
AVERAGE関数などを呼び出して連続処理をする際、
不正なセルを指定したり変な値になったりするとプログラムがエラーに
なってとまりますが、プログラムがとまらないように、そういうエラーを
無視して#N/Aなどの値を返すようにするにはどうすればいいですか?

571 :デフォルトの名無しさん:2009/06/17(水) 03:07:24
>>570
VBAの中では#N/Aを返すことはできないけどOn Errorを使えば
エラーを無視して続行することは可能。

572 :デフォルトの名無しさん:2009/06/17(水) 03:09:45
補足。
エラーが発生した時、システム変数Errにエラーコードが自動的に入るようになってるから、
それを調べればいいと思う。

573 :デフォルトの名無しさん:2009/06/17(水) 03:14:21
>オブジェクトには使いおわったらNothingを代入、
この必要性がよく分からない。
なんかの変数がそのインスタンスを参照してるとGCorが回収してくれないから
Nothingを代入しろって事だと思うけど
そもそも、ローカル変数の寿命って関数を出たときだから、Nothingを代入する必要ないんじゃない?

配列に関しても同じ。
実際には、適当なタイミングで一括でGCしてるとおもうけど。

574 :570:2009/06/17(水) 03:38:53
>>571
ありがとうございます。できそうです。

575 :567:2009/06/17(水) 07:57:49
皆様ありがとうございます参考にします。

>>568
APIがどうとか難しいことしたことないんで
私のは別の理由なんでしょうねえ。

>>569
今回相談のケースとは別に確かにそんなケースもあります。
適当なとこにDoEventsってはさんどけばいいんでしょうか。
まだ使ったことないです。

>>573
そう思ってたんでこれまで代入しっぱなしだったんです。
詳しい人のコードみるとだいたい初期化してるし
自分がたまに困ってるんだから自分が間違ってるんだろうと
最近使うようにしてみたんですがあまり変わりません。

576 :デフォルトの名無しさん:2009/06/17(水) 08:11:30
>>575
CPUパワーが足りないとイベントが溜まる可能性が上がるかも。
メモリが足りないとGCの発生率が上がるかも。
どんなスヘ゜ックのマシン使ってる?

577 :560:2009/06/17(水) 20:54:28
お礼が遅くなってすいません
何とかできました
ありがとうございました

578 :デフォルトの名無しさん:2009/06/18(木) 00:19:33
Excel2003を使ってます。
マクロでマクロが書かれたファイル名自体を変えることってできますか?
Name fileA As fileB
だと、fileAがマクロの書かれたファイル自身でなければうまく動くのですが、
自分自身だとうまく動かないようです。
もしいい方法があれば教えてください。


579 :デフォルトの名無しさん:2009/06/18(木) 06:21:33
>>578
SaveAsで保存してから前のファイルをDeleteする。

580 :579:2009/06/18(木) 06:26:51
FileSystemObject使わないなら、削除はKillで。

581 :578:2009/06/18(木) 12:48:21
>>579
ありがとうございます!

582 :デフォルトの名無しさん:2009/06/18(木) 14:23:17
os xp
Excel 2003

フォームの後ろにBOOKを隠して、Excelを見えないように作成したものがあるのですが
(ドラッグして動かしても位置が同期するので常に見えません)
このファイルを社内の5台のマシンに移して動作確認をしたところ
一台のみエラーになってしまいます

フォームは起動するのですが
そこからなにかアクションを起こすとアプリケーションエラーになるのですが、解決できずに、途方に暮れています

アドバイスお願いします

試みたのは、対象のマシンがsp2だったのでsp3にしたぐらいです


583 :デフォルトの名無しさん:2009/06/18(木) 14:56:44
エラーの種類も具体的なプログラムソースも書かずに何がわかるというんだ…

それよりも、何かのウィンドウを隠したい場合は位置を合わせるんじゃなくて
そのウィンドウに対してVisible=Falseとやるのが普通。
ほかにも、座標を(10000,10000)にして画面の外に出してしまう手もある。

584 :デフォルトの名無しさん:2009/06/18(木) 18:05:52
Application.WindowState = xlMinimized

じゃ駄目なのかな

585 :デフォルトの名無しさん:2009/06/18(木) 18:08:12
最小化だとタスクバークリックで大きくなっちゃうけどね

586 :デフォルトの名無しさん:2009/06/18(木) 20:18:38
EXCELのバージョンは2003
画像のコピーでPicture形式と言うのはBitMapとは違うフォーマットと
言う認識で良いでしょうか?
だとしたらShapeが保持している画像のフォーマットを識別するには
どうしたら良いのでしょう?それらしきプロパティ等が見つかりません。

やりたい処理は画像フォーマットを識別して対応したコピー方法で
Shapeをコピーして行くと言う動作です。

587 :デフォルトの名無しさん:2009/06/18(木) 20:47:19
>>585
UserFormがShowされていればタスクバーをクリックできないのでいいと思った

>>586
無理やりBitmapでコピーするとか
Shape.CopyPicture xlScreen, xlBitmap

588 :デフォルトの名無しさん:2009/06/19(金) 00:28:34
ユーザーフォームで、セルに日時&時刻を自動入力したいのですが
Microsoft Date And Time Picker Control を使って
時間のデータを取得することは可能でしょうか?

神様!ご教示をお願い致します!

589 :デフォルトの名無しさん:2009/06/19(金) 00:31:26
すみません。
OS=XP SP3
Office2003
です。


590 :デフォルトの名無しさん:2009/06/19(金) 01:52:17
ここは人間しかいません

591 :デフォルトの名無しさん:2009/06/19(金) 06:13:15
DTPickerの話はスレ違い






たぶんできない

592 :デフォルトの名無しさん:2009/06/19(金) 07:07:10
>>591

ありがとうございます。

ユーザーフォームでの時刻入力の他の方法や
関連部品のありか等、ご存知の神様は、
いらっしゃいませんでしょうか?

VBAの参考書を買いに行きましたが、
ユーザーフォームについて詳しく載っている
本は、なかなかないですね。


593 :デフォルトの名無しさん:2009/06/19(金) 07:18:06
>>592
txtbox1.text = Format$(now,"hh:mm:ss")

594 :デフォルトの名無しさん:2009/06/19(金) 10:56:06
>>593

ありがとうございます。
ヒントになりました。

これにスピンボタンをつけて任意の日時を
入力できるようにしたいと思っています。

できれば「日付と時刻のプロパティ」に似たフォームで
入力できるようになるのが理想なんですが。

595 :デフォルトの名無しさん:2009/06/19(金) 12:31:43
がんばって (^_^)

596 :デフォルトの名無しさん:2009/06/19(金) 18:03:48
質問です 
行全体や列全体を指定して罫線を引くにはどうしたらいいですか?
(セルのborderではなく)

597 :デフォルトの名無しさん:2009/06/19(金) 18:37:48
>>596
こういうこと?

Sub sanple()
  With Rows(10) '10行目全体の上下に罫線
    .Borders(xlEdgeTop).LineStyle = xlContinuous
    .Borders(xlEdgeBottom).LineStyle = xlContinuous
  End With
  With Columns(10) '10列目全体の左右に罫線
    .Borders(xlEdgeRight).LineStyle = xlContinuous
    .Borders(xlEdgeLeft).LineStyle = xlContinuous
  End With
End Sub

598 :デフォルトの名無しさん:2009/06/19(金) 19:15:08
このスレ見てていつも思うのは質問者に対し回答例を出しても反応が遅いな
回答もらっても礼すらしないケースもあるし

599 :デフォルトの名無しさん:2009/06/19(金) 19:41:44
きも

600 :デフォルトの名無しさん:2009/06/19(金) 19:42:41
あんきも

601 :デフォルトの名無しさん:2009/06/19(金) 20:58:49
お礼なんざいらんよ。
中途半端にタメ口で表面面だけのお礼もらうなら、
無視された方がまし。

602 :デフォルトの名無しさん:2009/06/19(金) 21:59:51
「いきもの」の おなか の なか には「きも」が はいって る んだね

603 :596:2009/06/19(金) 22:28:40
>>597
ありがとうございました

604 :デフォルトの名無しさん:2009/06/19(金) 22:55:30
必要な情報があれば拾うし、なければ記憶に留めない。ただそれだけ。

605 :デフォルトの名無しさん:2009/06/19(金) 23:19:12
>>598
そんなこたーよくあること。
それに質問者ばかりとは限らんね。
回答者で間違いを指摘されてもお礼言わないでむすっとしてる人もよくいるな。

606 :デフォルトの名無しさん:2009/06/20(土) 00:48:04
お礼なんてどうでもいいから、結果報告をきちっとしてほしいね

一番嫌なのは「自己解決しました」って奴だな。
どうやって解決したのかぐらい書けばいいのにな。

607 :デフォルトの名無しさん:2009/06/20(土) 01:14:08
こんばんははじめましてよろしくお願いします。

ある列にyyyy/mm/ddの形式で入ってるんですが、事情により日付と文字列が混在してます。
それを日付順に昇順で並び替えたいのですが、うまくいきません。

DataOption:=xlSortTextAsNumbers にしてもだめ
並び替えかける前にすべてを数値に変換したあと、並び替えてもだめ
日付に直してもG標準に直してもまったくだめ。
どうしたらいいのかわからず悩んでます。
ちなみに、元日付のやつが先に昇順に並び、そのあと元文字列のやつが昇順に並ぶ。
という感じです。

手動でやると、
数値に変換して昇順で並べ替え
何も変換せずに”数値に見えるものはすべて数値・・云々”のメッセージにチェックを入れる
両方うまくいくのに、VBAにしたとたんできなくなります。
何がだめなんでしょう・・・

608 :デフォルトの名無しさん:2009/06/20(土) 01:46:37
日付データって変な癖がアルよね
だから、文字列に変換することを考えたら
例:20090620

609 :デフォルトの名無しさん:2009/06/20(土) 07:55:25
>>607
数値にに変換して駄目って、きちんと数値になってないんじゃないの?
区切り位置などでちゃんとシリアル値に変換してるのか?

610 :デフォルトの名無しさん:2009/06/20(土) 13:47:00
シート上にファイル名を入力し、ファイルをフォルダの中から探し、あった場合は開く、
といった操作をしているんですが、見つかったファイルがどんなファイルであっても、
普段使ってるアプリケーションを使用して開く事は可能ですか?

xlsならエクセル、txtならテキスト、bmpならペイントといった感じで、
shellでプログラムを指定することなく開けますか?

611 :デフォルトの名無しさん:2009/06/20(土) 14:23:20
>>606
文字列に変換ですね。
でも、yyyy/mm/ddを20090101みたいに変換させるプログラムって難しそう・・・(初心者なもので)

>>607
数値に変換した時点で、すべて 38568 みたいなシリアル値になっています。
でもだめなんです。シリアル値でも元日付のやつが先に昇順に並び、
そのあと元文字列のやつが昇順に並ぶんです。
まず30000番台がならんで、その次40000番台がならび、そのあとまた30000番台が並ぶ
みたいになってます。


612 :デフォルトの名無しさん:2009/06/20(土) 14:40:08
>>610
http://wiki.livedoor.jp/uepon2929/d/VBA%A4%AB%A4%E9ShellExecute%A4%F2%BB%C8%A4%A6%CA%FD%CB%A1

613 :デフォルトの名無しさん:2009/06/20(土) 18:18:29
>>611
元のデータが文字列なら"/"を空白に置換する
シリアル値なら書式でyyyymmddと、区切りを入れずに並べる

614 :デフォルトの名無しさん:2009/06/20(土) 18:45:06
RegExp.Excuteで得たオブジェクトを他のプロシージャに渡したいんだが
どうすればいい?
何型?とりあえず ObjectとVariantはだめみたいなんだが

615 :デフォルトの名無しさん:2009/06/20(土) 18:47:48
>>612
thx

616 :デフォルトの名無しさん:2009/06/20(土) 20:01:33
>>611
DateValue(Range("A1").Value)
でそのまま日付データを取得することは出来る
但し、年の表示が省略されているとパソコンの年が採用されるので、
意図しない計算結果になることもある

>>614
ちょっとぐぐった感じだと
ObjectとVariantでいけそうだけど

http://q.hatena.ne.jp/1196650964
http://qa.nou-college.net/qa4919500.html

今回だけOption Explicitを辞めるとか

617 :デフォルトの名無しさん:2009/06/20(土) 20:36:45
>>613
>>616

感謝です、ちょっとやってみます
また何かあったらきます

618 :デフォルトの名無しさん:2009/06/20(土) 21:12:53
>>614
object型で何も問題ないけど。
ダメだったのは、何がダメだったのかな。
どこでどんなエラーが出たか書かないと分からないよ。

あと、タメ語はやめたほうがいい。

619 :デフォルトの名無しさん:2009/06/21(日) 00:27:29
A     A
C
D  →  C 
E     D
G     E
      
      G

というように抜けてるアルファベッドのセルを空白にして
並び替えしたいんですが、どのような命令文書けばできますか?
OSはXPで、エクセルは2003もしくは2000です。

620 :デフォルトの名無しさん:2009/06/21(日) 00:39:31
>>618
すみませんでした

621 :>>619:2009/06/21(日) 00:44:26
そういえば、Aには6?番と言う番号がついててそれで判断できると聞いた覚えがあるのですが・・・。

622 :デフォルトの名無しさん:2009/06/21(日) 00:54:10
なんかここが2ちゃんねるだってことが分ってないやついるみたいね。
今までの数々の勘違い発言が分ったような気がする。

623 :デフォルトの名無しさん:2009/06/21(日) 00:56:57
object型で何も問題ないですけど。
ダメだったのは、何がダメだったのですか?
どこでどんなエラーが出たか書かないと分からないですよ。

あと、タメ語はやめたほうがいいですよ。


624 :デフォルトの名無しさん:2009/06/21(日) 01:29:54
>>619
Asc("A")
で文字コードが分かる

s = "ABCDE.....XYZ"
instr(s, Range("A1").value)
で順を探してもよさそう

625 :デフォルトの名無しさん:2009/06/21(日) 01:35:24
>619
これでいいと思うけど。環境は同じです。(excel2003)
Sub 並べ替え()
  TATE = 1
  For I = Asc("A") To Asc("A") + 25
    If Asc(Cells(TATE, 1).Value) = I Then
    Else
      Rows(TATE).Insert
    End If
    TATE = TATE + 1
  Next I
End Sub


626 :デフォルトの名無しさん:2009/06/21(日) 02:02:39
>>624
>>625

ありがとうございます。助かりました。

627 :デフォルトの名無しさん:2009/06/21(日) 03:10:23
>>625
    If Asc(Cells(TATE, 1).Value) = I Then
    Else
      Rows(TATE).Insert
    End If
何この高度なつり餌

628 :デフォルトの名無しさん:2009/06/21(日) 04:11:38
こういう行や列の挿入・削除は後ろからするもんだよな

629 :デフォルトの名無しさん:2009/06/21(日) 07:13:52
>>628
挿入・削除は普通やらないな。
大体>>625は最後はエラーで止まるわな。
配列にためこんで吐き出した方がいいな。

630 :625:2009/06/21(日) 09:00:12
>629
自分で試したときはエラーにならなかった。
エラーになりますか? ループ件数は上限決まってるし。
アルファベットが昇順になってなければ変になるけど。

631 :デフォルトの名無しさん:2009/06/21(日) 09:53:27
>>629
詳しく教えてもらえませんか?

632 :デフォルトの名無しさん:2009/06/21(日) 10:19:48
>>619
A A
C C
D D
E E
G G
B
F
こんなデータを用意して2列目でソートすればいい。

633 :632:2009/06/21(日) 10:21:22
ごめん。1列目でソート。

634 :デフォルトの名無しさん:2009/06/21(日) 11:03:26
Sub test()
Dim i, r, wr(1 To 26)

For Each r In Range("A1:A26")
 wr(Asc(r.Value) - 64) = r
Next r
For i = 1 To 26
 Cells(i, 1) = wr(i)
Next i
End Sub

"a"だと97なのでエラーになるよww

635 :デフォルトの名無しさん:2009/06/21(日) 11:06:09
wr(Asc(UCase(r.Value)) - 64) = r

636 :デフォルトの名無しさん:2009/06/21(日) 12:25:17
>>630
空白セルでAsc(Empty)がエラーにならないか?
2007だとエラーで止まるんだが。

637 :634:2009/06/21(日) 12:44:03
For Each r In Range("A1:A26")

For Each r In Range("A1:" & Range("A1").End(xlDown).Row)

638 :デフォルトの名無しさん:2009/06/21(日) 15:05:34
速度を考慮しなくて良いならこんな感じじゃね?

    Const alfCount As Integer = 25 ' なぜかAsc("z") - Asc("a")をコンパイル時に評価してくれない
    Dim indexFlags(alfCount) As Boolean  'Asc("a") To Asc("z)じゃないのは
    '0から始まらない配列は扱いが面倒だから
    Dim data(alfCount) As Variant
    Dim i As Integer
    Dim outBaseCell As Range
    Dim indexCol As Range
    Dim currentCell As Range
   
    Set outBaseCell = Sheet1.Range("A1")
    Set indexCol = Sheet1.Range("A:A")
   
    'Dim a(alfCount)はalfCount+1個の要素が用意されることに注意(alfCount番目の要素もあると言うこと)
    For i = 0 To alfCount
        Set currentCell = indexCol.Find(Chr(i + Asc("a")), LookAt:=xlWhole)
        indexFlags(i) = Not currentCell Is Nothing
        If indexFlags(i) Then data(i) = currentCell.Offset(0, 1).Value
    Next i
   
    For i = 0 To alfCount
        outBaseCell.Offset(i, 0).Value = Chr(i + Asc("a"))
        outBaseCell.Offset(i, 1).Value = data(i)
    Next i

639 :デフォルトの名無しさん:2009/06/21(日) 15:24:20
こんなソース読みたくない

640 :625:2009/06/21(日) 15:43:22
>629、636
失礼しました。テストデータに Z を付け加えてたのでエラーにならなかった。


641 :デフォルトの名無しさん:2009/06/21(日) 16:06:57
>>631
大文字のA〜Zのみなら

Sub foo()
Dim rng As Range
Dim v As Variant
Dim strBuf() As String
Dim temp As Variant
Set rng = Range("A1", Range("A" & Rows.Count).End(xlUp))
v = rng.Value
ReDim strBuf(Asc("A") To Asc("Z"), 0)
If Not IsArray(v) Then
  v = Array(v)
End If
For Each temp In v
  If temp Like "[A-Z]" Then
    strBuf(Asc(temp), 0) = temp
  End If
Next
With rng.Resize(UBound(strBuf, 1) - LBound(strBuf, 1) + 1)
  .ClearContents
  .Value = strBuf
End With
End Sub

>>638
「なぜかAsc("z") - Asc("a")をコンパイル時に評価してくれない」 なんて定数なんだから当たり前だよ。


642 :デフォルトの名無しさん:2009/06/21(日) 16:41:01

("z")



("a")

が顔文字に見えてしまう漏れは重症

643 :デフォルトの名無しさん:2009/06/21(日) 18:11:10
B列に
=IF(ISERROR(MATCH(CHAR(ROW()+64),A:A,0)),"",CHAR(ROW()+64))

644 :デフォルトの名無しさん:2009/06/22(月) 11:04:06
>>619
データの先頭が半角大文字のアルファベット限定
Sub a()
  For r = 1 To 26
    x = Cells(r, 1)
    If x <> "" Then Cells(Asc(x) - 64, 2) = x
  Next
End Sub

645 :デフォルトの名無しさん:2009/06/22(月) 12:19:34
ドラッグしたファイルの情報を取得ってどうやりますか?

[フォーム]

↑のフォームに、選択したファイルをマウスでドラッグして、パスと名前を取得したい

646 :デフォルトの名無しさん:2009/06/22(月) 15:12:17
>>645
VBAだけでは無理。
まずは参照設定を開いて、その中に
Microsoft Visual Basic for Applications Extensibility
ってのがないか確認して。

647 :デフォルトの名無しさん:2009/06/22(月) 15:17:22
>>645
フォームへのドロップはVBAではサポートされてない。
エクセルで開ける形式限定なら、フォームじゃなくてブックへドロップすれば
ファイル名が取得できる。(新たに開いたブックの名前を見ればいいだけ)

648 :デフォルトの名無しさん:2009/06/22(月) 17:08:56
なるほど

>464
家帰ったら確認してみます


取り敢えずリストビューを使ってファイルのゲットは出来るんですが
テキストボックスにドロップして、何度か追加操作に対応させたいのです

649 :648:2009/06/22(月) 18:13:01
>646
バージョン 5.3をハケーン

現在ユーザーフォームにリストビューを追加して、次のコードを使いシートにドロップしたファイル名を書き出してます

Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
Dim myF() As Variant
Dim myI As Long
Dim myN As Long
Dim obj As Object

Set obj = CreateObject("scripting.filesystemobject")

myI = 0
myN = 0

myI = Data.Files.Count
ReDim myF(myI - 1) As Variant

' ↓の処理は,ボタン押してからすべきな気がするんだけども

For myN = 1 To myI
myF(myN - 1) = Data.Files(myN)
Sheets("処理").Cells(myN + 2, 1) = obj.getparentfoldername(myF(myN - 1))
Sheets("処理").Cells(myN + 2, 2) = obj.getfilename(myF(myN - 1))
Sheets("処理").Cells(myN + 2, 3) = u.l.Caption
Next

Set obj = Nothing
u.c.SetFocus
End Sub

650 :デフォルトの名無しさん:2009/06/22(月) 18:31:43
>>645
ラベルでもOKだが・・・Listの方が良いの?例えばCSV判定。
他にもfsoやAPIでファイルチェックすればよくね?

Private Sub Lbl_FileDD_OLEDragDrop(data As DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
Dim filePath As String

filePath = data.Files.item(1)

'エラーチェック
If (0 >= InStr(UCase$(filePath), "CSV")) Then
Me.Lbl_FileDD = ""
Else
Me.Lbl_FileDD = filePath
End If
End Sub

651 :デフォルトの名無しさん:2009/06/22(月) 18:40:53
他にもdirを用いて、指定フォルダのファイル一覧を取得可能

Dim folderPath As String
Dim filePath As String

filePath = Dir$(folderPath, vbNormal)
Do While filePath <> ""
「セル」 = filePath
filePath = Dir$ '次のファイルパス取得
Loop

652 :デフォルトの名無しさん:2009/06/22(月) 18:51:41
長々とスマソ。フォルダとファイルの判定はfsoを用いて、
Set hFso = New FileSystemObject
If hFso.FileExists(inPath) Then 'ファイルの処理

If hFso.FolderExists(inPath) Then ' フォルダの処理

Set hFso = Nothing

それよりも、ファイル or フォルダダイアログで選択させるか・・・

653 :デフォルトの名無しさん:2009/06/23(火) 07:00:51
しかし変数のつけかたどうにかならんかなぁ。

654 :デフォルトの名無しさん:2009/06/23(火) 07:09:18
フォルダ内のファイルフォルダを取得する場合、どうせFSO使うならDir関数と組み合わせてFileExistsやFolderExistsで
処理分けするのではなく、最初から.Filesや.SubFoldersでファイルのみ、フォルダのみを取得した方がいい

あと、Dir関数やGetAttr関数でもファイルかフォルダかの判定は出来る
場合によってはFileExists等の方が都合がよいこともあるが、この件ではわざわざ外部のFileSystemObjectを
使わずとも、組込関数のそれらで十分
しかも、Dir関数の第二引数にvbNormalのみ指定なら、フォルダは取得されないのに処理分けする必要自体が無い

ついでに言うとDir関数で取得されるのはfilePathではなくfileNameな
変数名をどう付けようと動作に問題は無いが、勘違いを引き起こしかねない(読解性が悪い)ので注意な

長々とスマソ

655 :デフォルトの名無しさん:2009/06/23(火) 07:13:39
うむ。
朝っぱらからご苦労。

656 :デフォルトの名無しさん:2009/06/23(火) 08:22:28
いえいえ

657 :デフォルトの名無しさん:2009/06/23(火) 08:42:54
With Worksheets(シート名)
Range(”X1").Formula = Application.WorksheetFunction.統計関数(range(データレンジ))
End With

これだと、統計関数のプロパティが取得できねぇとか言いやがってダメなのな。
結局Worksheets(シート名).activateしろってことか?



658 :デフォルトの名無しさん:2009/06/23(火) 09:45:21
>>657
無意味なWithは何かのおまじない?

659 :デフォルトの名無しさん:2009/06/23(火) 11:28:18
>>657
統計関数のプロパティが取得できねぇってのは、その統計関数が.WorksheetFunctionでは使えないやつなんだろ?
それに仮に使えたとしてもFormulaじゃなくてValueだわな。
動くからそれでいいってわけにはいかん。

660 :デフォルトの名無しさん:2009/06/23(火) 13:55:06
>>650
ラベルの上にドロップするプロジェクトでいいんだよね
やってみたけど動かない……
エクセル2000なんだけどもが

661 :デフォルトの名無しさん:2009/06/23(火) 14:49:50
だから、VBAではラベルやテキストボックスにはドラッグ&ドロップできないんだってば。
不可能ではないけど、そんなに簡単じゃない。

で、手っ取り早くやるには、まずVBAウィンドウのツールメニューのその他のコントロールを開く。
その中に利用可能なコントロールってのがずらっと並んでるから、その中から
ドラッグ&ドロップ可能なコントロールを選んで追加する。

定番はリストビュー。「Microsoft ListView Control, version 6.0」ってやつ。バージョンは問わない。
こいつにチェックを入れてやると、ツールボックスにListViewってのが追加される。

フォームにリストビューを貼り付けたらリストビューのプロパティを1カ所変更する。
OLEDropMode を 1 - ccOLEDropManual にする。これで準備完了。

サンプル。実行してリストビューにファイルをドロップしてみ。

Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
  Filename = Data.Files.Item(1)  '1番目のファイル名を取り出す
  MsgBox ("ドロップされたファイル名は" + vbCrLf + Filename + vbCrLf + "です。")
End Sub

662 :デフォルトの名無しさん:2009/06/23(火) 15:28:10
それVB6の開発ライセンスが必要だろ

663 :デフォルトの名無しさん:2009/06/23(火) 15:51:34
基本的にリストビューを使ってドラッグドロップすると
ただ、リストビュー以外にもドロップさせられるコントロールがあって、ラベル形式にも対応してい


るかどうかは置いとくか
ファイル取得したら、テキストボックスコントロール追加とかイベント処理でリストビュー再表示とかすればいいだけだな、把握した

664 :デフォルトの名無しさん:2009/06/23(火) 16:07:19
開発じゃなくて頒布ライセンスな
個人使用なら無問題

>>663
どうしてもドラッグドロップできるラベルが欲しいなら、
リストビューのサイズを1行1列に固定してラベルに見せかければいい

665 :デフォルトの名無しさん:2009/06/23(火) 16:15:06
無理にVBAでやらずにフリーのVB使えよ
めんどくさいことしなくても普通にドラッグ&ドロップに対応してるぞ
ワークシートが使いたいんならVBからExcelオブジェクトを使えばいい

666 :デフォルトの名無しさん:2009/06/23(火) 16:42:34
頒布じゃなくて開発ライセンスな

667 :デフォルトの名無しさん:2009/06/23(火) 17:40:54
細かいことを言えばMSの言語製品は開発「者」ライセンス
だからパソコンが何台あっても1ライセンスでインスコできる
「開発ライセンス」のが検索のヒット数が多いけどな
で、無料のVS2008EEでもライセンス条件は大差なかったような

668 :デフォルトの名無しさん:2009/06/23(火) 17:43:05
一回買えばずっと使えると言うことなのか……知らなかった

669 :デフォルトの名無しさん:2009/06/23(火) 17:50:41
ライセンスキーのインストールが必要
KB318597

670 :デフォルトの名無しさん:2009/06/23(火) 18:02:45
3行で

671 :デフォルトの名無しさん:2009/06/23(火) 21:36:43
がんばればできる
ttp://www.moug.net/faq/viewtopic.php?t=39255

672 :デフォルトの名無しさん:2009/06/23(火) 22:32:42
>>671
難しいことはそこで聞けばいいじゃん

2chになにを求めているんだい

673 :デフォルトの名無しさん:2009/06/23(火) 23:07:52
質問です。

マクロでユーザー設定リストを追加&ソートを行う為に下記を実行しました。
Dim list_num As Integer

Application.AddCustomList ListArray:=Array("あ", "い", "う", "え", "お")
list_num = Application.GetCustomListNum(Array("あ", "い", "う", "え", "お"))

Range(Rows(1), Rows(100)).Select
Selection.Sort Key1:=Range("A1"), ORDER1:=xlAscending, Header:=xlGuess, _
OrderCustom:=list_num, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin

Application.DeleteCustomList ListNum:=list_num

しかしソートした結果は
あ、い、う、え、お」は降順、その後ろに「あ、い、う、え、お」以外は昇順 となってしまいます。

どのようにすれば「あ、い、う、え、お」を昇順でソートし、その後ろに
「あ、い、う、え、お」以外を昇順にソートできるのでしょうか。

よろしくお願いします。

674 :デフォルトの名無しさん:2009/06/23(火) 23:37:04
list_numを使わずに普通にソートしたらいいんとちゃう?

675 :デフォルトの名無しさん:2009/06/24(水) 01:09:22
質問です

A@ABCD
B○○○○○
C○○○○○
D○○○○○    
E○○○●○     
F○○○○○

こう言う表を作製して、たとえば「C、E」と入力したら●がある場所の文字が
指定した所に出るようにしたいのですが、どうしたらいいのでしょうか?     

676 :デフォルトの名無しさん:2009/06/24(水) 01:34:13
Aの@を基準して、オフセット使えばいいか
英語はアスキーか何かで数字データに置き換え

セット 変数 = A@のレンジ.オフセット(英,数)
出力先 = 変数

変数と処理先を配列にすれば多元処理出来る

詳しいコードは誰かが書く

677 :デフォルトの名無しさん:2009/06/24(水) 01:59:57
>>675
ワークシートのこの位置にデータが入っていたとすると

 .A.B C D .E .F
1 A@ABCD
2 B○○○○○
3 C○○○○○
4 D○○○○○
5 E○○○●○
6 F○○○○○

=INDEX(A1:F6,MATCH("E",A1:A6),MATCH("C",A1:F1))

678 :デフォルトの名無しさん:2009/06/24(水) 02:08:37
>>676
>>677
ありがとう。なんとなくだけどわかった気がする

679 :デフォルトの名無しさん:2009/06/24(水) 02:17:52
>>673
降順てのがわからんね
ARRAY(”あ”,〜”お”,”*”)
にすれば、取り敢えず
あ い う え お 1 5 か き く

とかなるんじゃ

リストにランダムな文字設定してどう並び変わる

680 :デフォルトの名無しさん:2009/06/24(水) 07:22:30
>673
SortMethod:=xlPinYin は必要ですか?

やりたいことっていうのが
「1バイト文字や2バイト文字の英数字よりもひらがなの あ〜お を優先したい」
ってことなのかな?

681 :デフォルトの名無しさん:2009/06/24(水) 09:04:43
>>664
頒布(再頒布)ライセンスは、自作のアプリにMS作のランタイムを同梱する場合に必要な物
これが無い場合、「ランタイムは別な場所から落として導入してください」ってことになる
VBやVSの下位エディションはこれが無く、上位エディションには頒布ライセンスが付いてくる

OfficeVBAからVBランタイムを使用する場合に必要なのは開発ライセンス(VB6等の使用ライセンス)
個人利用なら頒布ライセンスは関係ないので下位エディションでも問題ない
VBランタイムは「VBで作成されたアプリから使う」場合に限り無償で使える物なので、
VB開発環境のライセンス無しにランタイムだけ入れてVBAから使うのは個人利用でも不正行為

682 :デフォルトの名無しさん:2009/06/24(水) 11:26:03
タダなんだしVSEE入れとけ

683 :デフォルトの名無しさん:2009/06/24(水) 12:48:36
暇だし未解決の質問あったら考えてみる

684 :デフォルトの名無しさん:2009/06/24(水) 15:13:50
>>682
それ、何の意味があるの?
VSEE(.NET以降)には、VB6以前用のActiveX系ランタイムの
自由使用権利は含まれないんだけど
無料のVB5CCEも然り

とにかくVBランタイムをVBAで使う権利は、無料では手に入らない

685 :デフォルトの名無しさん:2009/06/24(水) 15:38:01
>>681
ソースは?

ちなみに、
http://msdn.microsoft.com/ja-jp/vbasic/cc707268.aspx
では、そのようなことは書かれてないけど。

686 :デフォルトの名無しさん:2009/06/24(水) 15:45:33
とりあえず潔癖くんには内緒で使え
いろいろうるさいから

687 :デフォルトの名無しさん:2009/06/24(水) 15:49:42
>>683
今まさに、ライセンスについて未解決
主張はあるが根拠が示されてない
事実ならmsdnのどっかに書いてあるはず
検索してリンクを貼ってくれ

688 :デフォルトの名無しさん:2009/06/24(水) 15:53:51
FUDじゃないの?

689 :デフォルトの名無しさん:2009/06/24(水) 17:56:09
何見当違いなリンクはってるんだろう?

690 :デフォルトの名無しさん:2009/06/24(水) 18:41:39
>>689
ぐだぐだ言わずにソース貼れ、アホ

691 :デフォルトの名無しさん:2009/06/24(水) 18:48:33
Excelのバージョンの違いの影響で
VBAでセルの書式を設定する時にエラーになるとしたら
どんなエラーが考えられますか?


692 :デフォルトの名無しさん:2009/06/24(水) 19:23:56
95と2007を比べて?

693 :デフォルトの名無しさん:2009/06/24(水) 19:41:56
>>692
いえ、2003用に書いたマクロを2000で実行する場合です。

694 :デフォルトの名無しさん:2009/06/24(水) 20:13:44
>>693
マシンが変わると使えるフォントが変わる

695 :デフォルトの名無しさん:2009/06/24(水) 21:12:47
ネットワーク上のフォルダを指定して、
FileSearchを使うとパス名がバグるんですが、何故でしょう?

\\168.192.10.1\フォルダ1\…の、
フォルダ1の部分が文字化けしてしまいます。

理由と回避方法をご教授願います。

696 :デフォルトの名無しさん:2009/06/24(水) 21:45:26
ネット上のしかも2バイト文字ということはUTFなんとかのことかな?

697 :デフォルトの名無しさん:2009/06/24(水) 22:10:16
>>696
なんの事でしょう・・・?
後ろの…の部分は普通にただのフォルダなんですが、
フォルダ1ってのはネットワーク上に更に名前の付けられた部分です。

マイコンでネットワークドライブの割り当てをすると、「168.192.10.1のフォルダ1」となる部分なんですが。。。

698 :デフォルトの名無しさん:2009/06/24(水) 22:16:17
FileSystemObject、文字化け でググってみると同様の質問がいろんなところでされてます。
今検索中。

699 :696,698:2009/06/24(水) 22:17:30
例えばここにも
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200812/08120029.txt

700 :696,698,699:2009/06/24(水) 22:25:00
これも
http://www.excel.studio-kazu.jp/kw/20081114170632.html
ここで紹介されているのがこれ↓
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1310972723?fr=rcmd_chie_detail

701 :デフォルトの名無しさん:2009/06/24(水) 22:48:18
フォルダ名を半角英数字にすればいいでないの

702 :デフォルトの名無しさん:2009/06/24(水) 22:56:05
listview張り付けて使えるならライセンス持ってるってことだし
エラーになれば持ってないってこったな

703 :デフォルトの名無しさん:2009/06/24(水) 23:08:15
>>695
フォルダ名をUTF-7にすればいいんでないの

704 :デフォルトの名無しさん:2009/06/25(木) 00:02:26
>>702
ホントかどうかは知らんが、
別のアプリの一部だから勝手に横から使っちゃダメなんだとさ

705 :デフォルトの名無しさん:2009/06/25(木) 00:03:12
%81%40
みたいな形式にエンコードする

706 :デフォルトの名無しさん:2009/06/25(木) 00:22:57
   A | B | C |   D   |    E    |   F
1 品名|店舗|数量| 貸出日  |返却予定日 |2009/6/10
-----------------------------------------
2 QQQ|三重| 1 |2009/3/25 |2009/6/8
3 CCC|富山| 1 |2009/5/18 |2009/6/8
4    |   |   |       |
5 DDD|愛知| 1 |2009/5/18 |2009/7/1


* 4行目は返却済でブランクになっています。
こんな感じの表から、F1(調査日)の時点で返却予定日を過ぎているものを
同じシートの501行目以降に抽出したいです。
並びはそのまま、空白行を詰めて該当するデータを抜き出すにはどう書けば良いですか?
Excel2000/2003です。
宜しくお願いします。




707 :デフォルトの名無しさん:2009/06/25(木) 01:08:08
>>706
これでいいの?

Sub a()
  予定日 = Range("F1")
  Set コピー先 = Range("A501")
  For r = 2 To 500
    If Cells(r, 5) < 予定日 Then
      Cells(r, 1).Resize(1, 5).Copy Destination:=コピー先
      Set コピー先 = コピー先.Offset(1, 0)
    End If
  Next
End Sub

こういうのはVBAでやるんじゃなくて、F列に期限を過ぎたかどうか調べる式を入れて
オートフィルタで取り出すのがExcel本来の使い方なんだけどね。

708 :デフォルトの名無しさん:2009/06/25(木) 02:02:02
>>704
ぼけ、そのためのライセンスキーだろが
不正にライセンスキーを操作してなければ、
使える=ライセンスを持ってるってことだろが

709 :デフォルトの名無しさん:2009/06/25(木) 02:07:05
あれか
ソフトにはいってるけど、課金しないと解除できないコスプレゲームみたいな
だから解除したもんを配布するなという箱的な何かなのか

710 :648:2009/06/25(木) 02:10:50
なんか
使いやすくてすっごいソフトで安いエクセルがあるっていうから調べたんだけど
エクセルソフトピュアっていう

トイレットペーパーだった

711 :デフォルトの名無しさん:2009/06/25(木) 02:12:53
何で名前抜いてないんだよ!!!

712 :デフォルトの名無しさん:2009/06/25(木) 08:43:19
>>707

最初のリストが個人管理のエクセルファイルの一部を取り出しているものなので
この方法のほうが助かります。
ありがとうございます。

713 :695:2009/06/25(木) 08:52:39
ありがとうございます。

ネット上のフォルダなので、自分が名前を変える事はできません。
その2バイト文字をうまく戻す方法とかありますか?
.SubFolderを使って下の階層のフォルダを走査してますが、
ルート+見たフォルダで値を返せばいいのかと思うんですが、
方法が思い当たらず、、、

714 :デフォルトの名無しさん:2009/06/25(木) 09:04:05
>>681
早くソース出せ

715 :デフォルトの名無しさん:2009/06/25(木) 12:11:19
ネットワークドライブで「フォルダ1」が化けるって、
うちじゃ再現しないお
鯖がWindowsだと大丈夫なのかなあ


716 :デフォルトの名無しさん:2009/06/25(木) 13:46:00
>>695 >>699みろよぼけ


717 :デフォルトの名無しさん:2009/06/25(木) 13:55:23
>>714
>>681は常識だろぼけ
>>685はサポートの話でライセンスの話じゃないだろぼけ
ライセンスのことは>>669をみろぼけ

718 :デフォルトの名無しさん:2009/06/25(木) 14:27:55
MSが勝手に決めたルールについて聞いてるんだから、
「常識だろ」ではなんの説明にもなっていない。
明文化されたソースがないのであれば、
そりゃ単なるFUDじゃないかと疑いたくもなる。

719 :デフォルトの名無しさん:2009/06/25(木) 14:39:50
そーすか?

720 :デフォルトの名無しさん:2009/06/25(木) 14:41:51
>>717
なに見当違いのKB貼ってんだよ
はよ>>681のソース出せ、馬鹿

721 :デフォルトの名無しさん:2009/06/25(木) 16:25:20
>>717
少なくとも>>685では、VistaでVBAからVB6のコンポーネントを使う場合に何か制限があるとは
書かれていない。
VistaでもXPでもどちらでも良いので、使ってはいけないことが書かれているソースplz

722 :デフォルトの名無しさん:2009/06/25(木) 16:26:34
http://support.microsoft.com/kb/409857/ja
不明な項目については、コントロールの使用許諾契約書をご覧ください。
"All Rights Reserved" は、契約書に明記されている項目についてのみ権利があるということを意味するものです。
使用許諾契約書で許可されていない (または許可されているかどうかが不明な) 行為は、ライセンス違反と見なします。
注意 : Visual C++ および Visual Basic に付属する ActiveX コントロールもライセンスされています。
これらを HTML ページで使用する場合にも上記の手順に従ってください。

だってさ。使用許諾契約書で許可されてんのか?ぼけ

723 :デフォルトの名無しさん:2009/06/25(木) 16:32:06
おれっちのC:\Windows\System32\には
MSCOMCTL.SRG
があるからライセンス持ってるってことだな

724 :デフォルトの名無しさん:2009/06/25(木) 16:35:20
>>722
そのすぐ下に、「ここに書いてある内容は正しいとは限らないよ」(意訳)
って書いてあるんだよなあ。
どうしよう?

725 :デフォルトの名無しさん:2009/06/25(木) 16:36:26
「俺は嘘しか言わない」

726 :デフォルトの名無しさん:2009/06/25(木) 16:39:06
>>724
その下に問い合わせってのがあるだろ?

727 :デフォルトの名無しさん:2009/06/25(木) 16:41:24
この資料は以下の製品について記述したものです。
Microsoft ActiveX SDK

それ以外のルートで入手したOCXはどうなんだろう

728 :デフォルトの名無しさん:2009/06/25(木) 17:13:11
>>722
なんで回りくどいKBしか貼れないかなー。

今問題になってるのは、VBAでmscomctl.ocxを使用するときに、VB6の開発者ライセンスが
必要かどうかなんだけど。

早く、それをしてはいけないというソース貼れよ

729 :デフォルトの名無しさん:2009/06/25(木) 17:18:49
MSに聞けよばか

730 :デフォルトの名無しさん:2009/06/25(木) 17:26:32
>>681は思い込みでした、ごめんなさい

ってことでFA

731 :デフォルトの名無しさん:2009/06/25(木) 17:28:24
ぶっちゃけどっちでもいいけど、>>681が気にくわないw

732 :デフォルトの名無しさん:2009/06/25(木) 17:30:36
Vistaでは、デフォルトでmscomctl.ocxが入ってるそうだし、使おうとするときにライセンスが必要だって言う
警告が出なければ、使っていいんじゃないの?
XPでは知らんけど。

733 :デフォルトの名無しさん:2009/06/25(木) 17:55:56
>>729
ついでにKBに追加するよう言っとけよ。ほかにもばかがいそうだ

734 :デフォルトの名無しさん:2009/06/25(木) 21:08:12
警告出なけりゃ使っていいとか
どんだけ俺様ルールなんだよw

735 :デフォルトの名無しさん:2009/06/25(木) 22:34:15
なんで荒れてるように見せかけて待ったり雑談してやがんだよksg

質問スレなんだから誰かの常識とか言う回等が意味を成すと思ってんの課ksg

736 :デフォルトの名無しさん:2009/06/25(木) 23:13:30
エクセルでテトリス作ってみた
http://www42.atwiki.jp/syugyou/pages/186.html

737 :デフォルトの名無しさん:2009/06/26(金) 00:00:34
>>734
不正にライセンスキーを操作しない限り、ライセンスキーで守られているってことだろぼけ

738 :デフォルトの名無しさん:2009/06/26(金) 11:39:35
ksg=かすが=春日=ハルヒ

京アニ儲の暗号ですね

739 :デフォルトの名無しさん:2009/06/26(金) 12:32:50
そこは大阪だろ

ちゃうねん

740 :デフォルトの名無しさん:2009/06/26(金) 14:05:26
>>681
ソースまだぁ?

741 :デフォルトの名無しさん:2009/06/26(金) 14:26:00
まだやってんの?

742 :デフォルトの名無しさん:2009/06/26(金) 14:48:51
商用で使用する場合や、無制限配布する必要が出てきたら、MSに聞けばいいじゃん。

743 :デフォルトの名無しさん:2009/06/26(金) 18:54:37
総好かん

744 :デフォルトの名無しさん:2009/06/26(金) 23:56:45
A1〜A4500にすべてデータが入力されていて、B列は空白の場合
B1〜B4500を選択するにはどうするべき?
つまりA1〜データのある一番の行までを選択して、それをそのままを右に1列ずらす形なんですが

745 :デフォルトの名無しさん:2009/06/27(土) 00:00:14
>>744
Range("A1:A4500").Offset(, 1).Select

746 :デフォルトの名無しさん:2009/06/27(土) 00:47:04
たぶん最後のセルを選択させたいんじゃね

747 :デフォルトの名無しさん:2009/06/27(土) 09:40:15
Range("B1:B" & Range("A1").End(xlDown).Row).Select

748 :デフォルトの名無しさん:2009/06/27(土) 17:03:44
イベントプロシージャを作成中のエラーなんですが、
Worksheets_Change でTarget.valueによって条件分岐したいのですが、
Targetがセル範囲で、さらにChangeの内容がClearContentsの場合、
「型が一致しません」(Selectの選択肢と)というエラーが出ます。

おそらく、ClearContentsによって更新された(消された)後の
セルのデータ型が問題なんですが、
@このときのデータ型は何?(ちなみに書式設定は「標準」です)
ANullでも""でもダメなので、どういう選択肢を設ければ良いのか?
以上、分かる方、お願いします。

Excel2003使用です。

749 :デフォルトの名無しさん:2009/06/27(土) 17:06:18
とりあえずVariant型にSetしてみるというのは?
それでブレークポイントかけて中身確認とか。

750 :デフォルトの名無しさん:2009/06/27(土) 17:23:28
Target.ValueをVariantにするということですね?
そうすると、もしTargetがセル範囲だと、配列になってしまって
条件分岐は難しくなりますね。

セル範囲をClearContentsする場合って、内部的には
ひとつずつ処理するんですかね?
それだと、複数のデータ型が混じっちゃうこともありえますが。
一応、条件分岐の最初で、If IsNumeric(Target.Value)でひっかけては
いるんですが。
Targetがセル範囲か単独セルか(If Target.Columns = 1 の構文はダメ
でした)判定する方法はありますか?

751 :デフォルトの名無しさん:2009/06/27(土) 17:34:53
関数の中で例外が発生した場合の処理ってどうやって書くの?
たぶん、参考書かなんかで推奨しているのはVBAの例外棋王を使うことだと思うけど
なんか、頼り泣くね?というかON ERRER割り込みとか使いにくくね?

例外が発生したときの戻り値をEmptyにして返して
呼び出し元でIsEmptyでチェックしてたら、IsEmpty(Empty) = Falseになるので使い物にならない。
たぶん、戻り値の型のIntegerやStringがEmptyを許容出来ない、Empty値として格納できない型だからIsEmptyが常に技になるんだと思う
(だったら、代入するときにエラー出せよ)

一応現在は、integerなら-1、stringなら""を返して、エラーチェックしてるが
どうすれば良いんだ?

752 :デフォルトの名無しさん:2009/06/27(土) 17:54:31
>>750
IsEmpty(Target)で空かどうか調べる。
Target.Cells.Countでターゲットが1つのセルかセル範囲か分岐する。
面倒だけど1つずつチェックしていくしかない。

753 :デフォルトの名無しさん:2009/06/27(土) 17:58:11
>>751
関数の戻り値はエラーかどうかの結果にして
処理したい変数はByValで渡す

754 :デフォルトの名無しさん:2009/06/27(土) 19:34:49
>>750

Sub test()
a = Range("A3:B5")
MsgBox UBound(a, 1)
MsgBox UBound(a, 2)
End Sub

755 :デフォルトの名無しさん:2009/06/28(日) 01:20:07
初心者質問でなんですが
textboxに数値データ以外打ち込めないようにするには
どう入力すればいいんでしょうか?それともプロパティで可?
OSはvistaでExcel2007です

756 :デフォルトの名無しさん:2009/06/28(日) 02:37:19
>>755
プロパティで出来るかどうかぐらい、リファレンス見れば分かるだろ

オーソドックスなのはOnKeyPressなりで入力させたい文字だけスルーして、入力させたくない文字をKey = 0 というように書き換えればおk

757 :デフォルトの名無しさん:2009/06/29(月) 06:07:15
各シートに製品のデータを格納して
各評価方法で、任意の製品の評価値を求めたい

この場合、評価値を算出するコードはシートに書いた方が良い?
それとも、シートのほかに標準モジュールを作って、それに書いた方が良い?

シートにコードを直接添付させると、データとその処理方法の関連性を持たせやすい。
また、Worksheet名を省略できるので、多少スマートにかける。という2つのメリットがあると思われるが
どうやらシートに直接コードを書くと、デバッグ時にエラーの発生したコードを特定しにくい(デバッガが特定してくれない)ということもあるようで
コードは標準モジュールに書かないとイケナイのかな〜と悩んでます

758 :757:2009/06/29(月) 06:29:56
やりたい処理内容が分かりにくかったので具体的に説明します。

シートAには製品の人気が、シートBには製品の体積が載っています。

各シートには独自の評価用の関数があります(形は以下のよう)
Function SheetA.GetValue(pid as integer) as double (Bも同様)
この関数の内部では、シートの情報(人気など)に基づいてシート独自の計算式により評価値が算出されます。

最終的に、評価値の平均をとるなり、合計をとるなりで総合評価を求めます。
--- 目的はここまで

各シートごとに評価するための方法が違うので、別々にコードを書く必要があり
そのコードをどこに書くかで悩んでます。
シート上に書くメリット: コードを参照しやすい、コードがシンプルになる
デメリットト: デバッグがしにくい(?)

それと、もう一つ質問なんですが
クラスモジュールを使ったところで、クラスの派生が出来ないので、
抽象クラスなりインターフェースなりを作っておき。
それに基づいて、各サブクラスを実装する…ということは出来ませんよね?
(正直、クラスモジュールの使い道が分からない。構造体+関数?)

759 :デフォルトの名無しさん:2009/06/29(月) 07:08:38
好きなほう

俺個人ならば、シートに記述出来るならそうする
出力先が今後不透明になるならコードで出力する

760 :757:2009/06/29(月) 08:16:06
>>759
なんか勘違いされてるようなので捕捉

>>757 >>758 をよく読めば分かりますが、VBAを使う・使わないという話ではありません。
コードをどこに書くかという問題です。
http://www1.axfc.net/uploader/Img/so/50369.png
また、シートに記述したコードは例外の発生箇所を特定することが困難になるようです
http://www1.axfc.net/uploader/Img/so/50370.png
http://www1.axfc.net/uploader/Img/so/50371.png
なぜ、このような仕様になっているのか謎ですが、設定で調節できるものなら
設定を変えて、シートにコードを書きたいと思ってます。
(別のアドオンなどで発生したエラー箇所を隠蔽するため?
隠蔽する理由はアドオンユーザーへの報告を簡略化するため?
だとしたら、発生した例外をトラップして、より詳しいメッセージを伝える機構を用意すべきでは?
0で割るかどうかチェックするよりも、0で割ったかどうかをチェックした方がコードは簡略になるし…
これはVBAの例外機構が貧弱なため起きること?)

761 :デフォルトの名無しさん:2009/06/29(月) 10:25:51
画像全部消えてるし


762 :デフォルトの名無しさん:2009/06/29(月) 10:32:28
>>761
(,,゚Д゚)!
って確かめたら消えてないか。センブラのポップアップでは表示してくれないみたいですね。

とりあえずほかのロダにもあげときますね
http://lovestube.com/up/src/up10221.png
http://lovestube.com/up/src/up10222.png
http://lovestube.com/up/src/up10223.png

763 :デフォルトの名無しさん:2009/06/29(月) 11:19:05
今携帯だから見れない

部品化したモジュールをシートから呼び出す処理をしたらどうか?
引数でも関数でもいいし、怪しげな部分を丸投げしてもいい

764 :デフォルトの名無しさん:2009/06/29(月) 11:40:25
良く読むのめんどくさいので勘で。
シートにはコードはなるべく入れない。なぜなら、同じ機能を持ったシートをコピーor追加したときに困るから。

>クラスモジュールを使ったところで、クラスの派生が出来ないので、
>抽象クラスなりインターフェースなりを作っておき。
>それに基づいて、各サブクラスを実装する…ということは出来ませんよね?
できる。vba implementsでググれ。
実装の継承は出来ない。

あと、良くわからんけど、raiseとかwith eventsとか調べとけ

765 :デフォルトの名無しさん:2009/06/29(月) 11:42:49
witheventsダナ

766 :デフォルトの名無しさん:2009/06/29(月) 12:42:19
>デメリット: デバッグがしにくい

ひとつの案だけど、デバッグの必要なときはデバッグしやすい形にして、
実行時は実行しやすい形にする、ってどうよ

個人的に、シートにはなるべく書かないようにするけどね

767 :デフォルトの名無しさん:2009/06/29(月) 18:46:32
>>766
計算式関数が専用モジュールにまとまっていれば、
それはそれでデバッグしやすいと思うんだけどなぁ?
シートにコードがあると第三者にコピペされた時超面倒


768 :757:2009/06/29(月) 19:21:56
>>764
>シートにはコードはなるべく入れない。なぜなら、同じ機能を持ったシートをコピーor追加したときに困るから。
むしろ、同じコードごとコピーされるので都合が良いのでは?
作成するシートが6,10程度であれば
コピー先の変更をコピー元にフィードバックさせたいときには手動でコピペしても良いですし
コピペできないほどの数のシートをExcelで扱うのは厳しそうですしね。

クラスモジュール化して、インスタンスごとにシートを割り当てることを考えても
処理を少し変えたいだけで別のクラスとしてコピペする必要があります。


>implements
なるほど、抽象関数とその実装はVBAでも出来るんですね。
実装済みの関数の処理の追記は出来ないと…
むしろ、すべての関数を上書きする必要があるんですか…

一度、クラスモジュールでくめるか考えてみます。
(Dim/Setの行がまた増えそうです orz
何で宣言と同時に代入が出来ないんだ…
そもそも、LetもSetも出来る型なんて無いんだから、使い分けなくて良いだろうに)

しかし、自分のメンバの関数を呼び出すときに
いちいちAbstractClass_Methodとするのもかっこわるいようなw


>raise
エラーメッセージも送ることが出来るんですね。
定義済みのエラー番号しか送れないかと思ってました。

が、On Errorで受け取る気にはなれないので、自発的に例外を発生させることはないと思います。

769 :757:2009/06/29(月) 19:22:57
>raise
エラーメッセージも送ることが出来るんですね。
定義済みのエラー番号しか送れないかと思ってました。

が、On Errorで受け取る気にはなれないので、自発的に例外を発生させることはないと思います。


>WithEvents
なるほど、そういうことも出来るんですか。覚えておきます。
しかし、今回の目的には利用できなさそうです。

>>766
それも考えたんですが、実用的ではありませんでした。

たとえばSheet1にRange("A:A")と書くと、Sheet1.Range("A:A")ですが
Module1にRange("A:A")とかくと、それはActiveSheet.Range("A:A")になります。

なので、thisWorksheet.Range("A:A")のようにオブジェクトを明記する必要がありますが
シートにしろモジュールにしろ、thisWorksheetに代入・初期化するタイミングがないんですよ。

クラスモジュールなら、_Initialize時に代入できますが
シートに転記する際には代入できなくなりますね。

それに、例外の発生するときだけ別の場所に写すなんて出来ませんし
それなら、完全にクラスモジュールとして書くか、地道にトレースした方が楽そうですしね。

また、VBAでクラスを扱う際に出た疑問ですが

各クラスモジュールの親クラスはClassModuleに成るんでしょうか?
プロパティドックにはClassModuleとありますが
オブジェクトブラウザでは検索に引っかからないんですよ。

770 :757:2009/06/29(月) 19:49:15
また、静的関数の呼び出しはどうすればいいインでしょうか?
静的関数の宣言はエラーになってませんが、(Public Static Function test() as integer)
呼び出す際に、静的関数として呼び出すことが出来ません。エラーになります

Dim c as Class1
Debug.Print Class1.test 'コンパイル時 エラーになる
Debug.Print c.test '実行時エラーになる
Set c = new Class1
Debug.Print c.test '実行される

class::methodのような特殊な呼び出し方かと思い、検索してみましたが
そもそも、静的メソッドに関するページが見つからない。

できるだけ短くまとめたつもりですが、長くなってしまいました
長文失礼します

>>766
モジュールに書いた方がエラーの特定がしやすいため、
デバッグはしやすくなると思います。

また、第三者の手に渡ったときには、私は絶対に手を出さないので
その点は(・ε・)キニシナイ!!  つもりです。

結局、シートに書きたいことは、シートのデータへのインターフェースを書きたいだけだから
そのコードはソノシート内で完結していて、シートをコピーする事による副作用は無いと考えて良いと思います。

771 :デフォルトの名無しさん:2009/06/29(月) 20:26:46
実装の継承はできないって書いてるだろうが。よく読め。そして調べろ。

>しかし、今回の目的には利用できなさそうです。
初心者のくせに簡単に判断してんじゃねーよ。

つーか、もっと調べてから質問しろ。
頓珍漢すぎて答える気にならんわ。

772 :デフォルトの名無しさん:2009/06/29(月) 20:30:55
メンバ変数にシートを持たせるとか、関数の引数にシートを渡すとか、いろいろあるだろ。

773 :デフォルトの名無しさん:2009/06/29(月) 20:38:04
>>757
評価クラス&strategy pattern

774 :デフォルトの名無しさん:2009/06/29(月) 20:43:50
エラートラップのオプション変えろ馬鹿

775 :デフォルトの名無しさん:2009/06/29(月) 21:06:15
>>757はプログラマじゃないみたいだから、そうつらくあたるなよ。
コピペでいいじゃない。

776 :デフォルトの名無しさん:2009/06/29(月) 22:04:41
マクロの記録だとSelectionがよくでてきますが
selectとどう違うのでしょうか?



777 :デフォルトの名無しさん:2009/06/29(月) 22:22:40
selectしたものがselection

778 :デフォルトの名無しさん:2009/06/29(月) 22:41:30
>>771
>実装の継承はできないって書いてるだろうが。よく読め。そして調べろ。
ええ、それは理解しているつもりです。
実装済み〜上書きする の節は不要でしたね。
実装の継承がされないのですから、元クラスの実装部の有無に関わらず
実装クラス(implements〜がかかれているクラスモジュール) で実装しなければならないのは当然のことです。

>初心者のくせに簡単に判断してんじゃねーよ。
Worksheetで発生したイベント(*1)を処理したいとは考えていません。
ですのでWithEventsは要となるようなキーワードではないと思います。

抽象クラス・インターフェースがつかえることが分かったので
最低限必要な機能を洗い出して、抽象クラスとしてまとめるつもりです。
その際にイベントを定義することはあるかもしれません。

*1: Worksheets.SelectionChange など

>>772
>メンバ変数にシートを持たせる
そのメンバ変数に代入するタイミングがない。
(毎回、空かどうか調べて、Setするのもありかもしれませんが・・・)

>引数に
それをするくらいなら、ほかの方法(クラスモジュール化するとか)をとった方がスマートです。

>>774
変えましたよ。シート内で発生したエラーも捕捉できるようになりましたよ。
すでにシートにコードを書く気は失せてましたけど、

779 :デフォルトの名無しさん:2009/06/29(月) 23:01:05
>>778
切れてたので追加

>>774
変えましたよ。シート内で発生したエラーも捕捉できるようになりましたよ。
すでにシートにコードを書く気は失せてましたけど、
一瞬、「やっぱりシートにコードかいても良いかな」とか考えましたよ。

どうせ書きたいコードはインスタンス化する必要のない
静的なものですから、クラスを使うメリット無いなとか
シートにImplements IClass とかつければ、IClassとして扱えるようになって
すべて問題は解決したんじゃないかとか考えてしまいました.



780 :デフォルトの名無しさん:2009/06/30(火) 09:52:35
クラスって使ったことないけどいつ使えばいいの?
メリットはなんぞ?

781 :デフォルトの名無しさん:2009/06/30(火) 11:36:43
>>780
VBA使ってれば、知らないうちにクラスのお世話になってる

782 :デフォルトの名無しさん:2009/06/30(火) 11:48:26
>>778
> >初心者のくせに簡単に判断してんじゃねーよ。
> Worksheetで発生したイベント(*1)を処理したいとは考えていません。
> ですのでWithEventsは要となるようなキーワードではないと思います。

classにイベントを定義して、withevents付きでインスタンス化すれば、クラスのイベントを一括して
ハンドリングできたりする。

それと、インスタンス化する関数の引数にシートを渡せばいいじゃん。いやなの?



783 :デフォルトの名無しさん:2009/06/30(火) 11:59:41
そのシートでしか使わなくて、拡張性や再利用なんかを考えなくていいみたいだから、
そのままシートにコードを書くのが一番簡単だろ。
悩むことなんか無いのに。

784 :デフォルトの名無しさん:2009/06/30(火) 14:40:07
どこでエラーが起こったかわからない問題は解決したんでしょ?
ならば、そのままシートにマクロ書けばいいと思うけど、なんか問題あるの?

785 :デフォルトの名無しさん:2009/06/30(火) 15:35:48
質問します

ユーザーフォームにリストボックスとコマンドボタン(とラベル)を1つずつ作りました
リストボックスには他のシートの名前が入っています

Private Sub UserForm_Initialize()
Start_Sheet_1.ListBox1.AddItem "Sheet1"
Start_Sheet_1.ListBox1.AddItem "Sheet2"

ここまでは記述したのですが、コマンドボタンを押したとき
選択したシートに移動するコードはどうすればいいのでしょうか

初心者の質問ですみません
お答えお願いします


786 :デフォルトの名無しさん:2009/06/30(火) 15:53:30
if listbox1.listindex >= 0 then
worksheets(listbox1.list(listbox1.listindex)).select
end if

787 :785:2009/06/30(火) 16:13:27
質問しておきながらすみませんが、
リストボックスよりコンボボックスのほうが使いやすそうでコードもできました
すいませんでした

788 :デフォルトの名無しさん:2009/06/30(火) 17:27:09
なんとすがすがしい質問者なのだろう。

789 :デフォルトの名無しさん:2009/06/30(火) 17:54:53
環境WinXP Pro SP3、Excel2003SP3

ピボットテーブルの区切り文字が時々勝手に変わる(ように見える)
のですが、何が原因でしょうか…

月次で帳票を作成していて、5月分は
データーフィールドが
合計 : Salary
と表示され
6月分は
合計 / Salary
と、コロンがスラッシュに勝手に変わっているのです

な… 何を言ってるのか わからねーと思うが
おれも何をされたのかわからなかった…
という気分です

790 :デフォルトの名無しさん:2009/06/30(火) 17:58:28
スレ違い

791 :デフォルトの名無しさん:2009/06/30(火) 18:11:12
おいぃ……
スレチなら誘導くらいしてやろうぜ……?

792 :デフォルトの名無しさん:2009/06/30(火) 21:41:32
VBAで何かしら取得したデータを
保存していないtxtファイルを新規で立ち上げて
そこに出力したいのですが

いまいちわからないのですが教えてください
保存しているファイルを立ち上げてとかならググったりして見つかるのですが

793 :デフォルトの名無しさん:2009/06/30(火) 21:56:58
>>792
それはVBScriptやVB6でも出来ることで
VBAの分野の話ではないからスレ違い(>>4参照)

待ってれば半端な知識をひけらかしたい奴が
答えてくれるかも知れないがなw

794 :デフォルトの名無しさん:2009/06/30(火) 22:09:22
>VBAで何かしら取得したデータを
と言ってるんだからVBAだろ

>VBAで何かしら取得したデータを
VBScriptやVB6に渡せないことはないが

795 :デフォルトの名無しさん:2009/06/30(火) 22:11:38

with range("A1:F8")
.clearcontents
.unmarge
.marge
end with

range("A1").borders(xldaigup).linestyle = xlconteinue


このコードだとエラーでるんですがどこが駄目なんでしょうか?
 
上のコードでやろうとしてることは
A1からF8までの文字列を消してから
A1からF8内の部分的に結合されている所を解除して
次にA1からF8までをすべて結合してひとつのセルにしてから
罫線を引いてみてます。

ちなみにコードのスペルミスはご容赦ください。 いま手元にエクセルがないので
記憶で打っているので細かいスペルがわからんのです。


796 :デフォルトの名無しさん:2009/06/30(火) 22:14:21
>>795
マクロの記録でできそうだけど

797 :デフォルトの名無しさん:2009/06/30(火) 22:17:45
もともとはマクロの記録からやってて
いじくりながら勉強してるとこなんです。

798 :デフォルトの名無しさん:2009/06/30(火) 22:29:29
>795
試してはいないけど、罫線引くときのセルの指定は.margecellsを加えて
「a1セルを含むセル範囲」っていう感じにしなきゃいけなかったような。
ちょっと今から試してみる。

799 :798:2009/06/30(火) 22:36:12
>795
肝心の綴りから違ってますよ。
×unmarge  ○unmerge
×marge   ○merge


800 :798:2009/06/30(火) 22:40:15
>795
xlconteinueも綴り間違いみたい。F1キー押しても「キーワードが見つかりません」て出る。

801 :798:2009/06/30(火) 22:51:57
これでちゃんとうごきましたよ。(斜め線でいいんですよね?)
Sub テスト2()
With Range("A1:F8")
.ClearContents
.UnMerge ←訂正済み
.Merge ←訂正済み
End With
Range("A1").Borders(xlDiagonalUp).LineStyle = xlContinuous ←2カ所訂正済み
End Sub

×xldaigup    ○xlDiagonalUp
×xlconteinue   ○xlContinuous
少なくとも、マクロの記録をしてたら間違うはずないんだけど。

802 :デフォルトの名無しさん:2009/06/30(火) 23:33:20
> >VBAで何かしら取得したデータを
> と言ってるんだからVBAだろ
最初にVBAでデータ取りしたら
その後のExcelに係わらない処理まで全て
VBAの範疇になるなんてことは無い

803 :デフォルトの名無しさん:2009/07/01(水) 07:53:44
スレ違いだと思うならスルーすればいい
そうでないと思う奴が答えればいい
中途半端だろ

804 :デフォルトの名無しさん:2009/07/01(水) 09:36:23
>>802
VBS、VB6にデータを渡して処理するのが正解?

805 :デフォルトの名無しさん:2009/07/01(水) 12:44:28
開いたテキストファイルのレコード操作ってどーやんの?

806 :デフォルトの名無しさん:2009/07/01(水) 12:57:10
>>792
>保存していないtxtファイルを新規で立ち上げて
これってメモ帳とかを起動してそこに書き込みたいってこと?
だったら確かにスレ違いだ

やり方があるとすれば
1.メモ帳を起動してプロセスIDを取得しておく
2.書き込みたいデータをクリップボードに入れる
3.プロセスIDを使って起動したメモ帳に貼り付ける
大雑把に言うとこんな感じになると思う
API使ったりすることになりそうだが
細かいことはスレ違いだしググレ

807 :デフォルトの名無しさん:2009/07/01(水) 13:59:55
多アクセスに対応するために、ブックじゃなくてテキストファイルを醤油にしてるけど、軽いし保存が楽だし
エクセル使うためにテキスト制御するならスレチってわけでもないんじゃね
そもそもFSOだとかなんとかはエクセルVBAに装備されてるし、CSVなんてのもあるし

具体的にはググれ

808 :デフォルトの名無しさん:2009/07/01(水) 14:01:43
プライベートファンクションとは何?

809 :デフォルトの名無しさん:2009/07/01(水) 14:09:30
>>806
アフォだなぁ。
新規.txtを作って、それを実行すればいいじゃん。

810 :デフォルトの名無しさん:2009/07/01(水) 14:12:44
>>793のせいか知らんが、誰もコードを書かないなw

811 :デフォルトの名無しさん:2009/07/01(水) 14:17:20
「txtを立ち上げ」とか、意味がわからん
共通語で書いてくれればスレチでもコードぐらいいくらでも書く

812 :デフォルトの名無しさん:2009/07/01(水) 14:18:14
>>808
そのモジュールの中だけで使えるファンクション

813 :デフォルトの名無しさん:2009/07/01(水) 14:33:28
>>809
確かにそう最初はそう思った
でも「保存していない」って書いてある以上
VBAでファイルを作ってどうこうなんて論外だと思ってこう書いた



814 :デフォルトの名無しさん:2009/07/01(水) 15:31:31
>>811
立ち上げ、じゃなくて、実行ね。
キミひょっとして、.txtをオープンするのに、プログラム名指定したりしてんの?

815 :デフォルトの名無しさん:2009/07/01(水) 15:32:32
あーごめん、俺宛のレスじゃなかったのか

816 :デフォルトの名無しさん:2009/07/01(水) 15:33:28
IDでないから誰に誰が言ってるのかさっぱりわからん

817 :デフォルトの名無しさん:2009/07/01(水) 15:40:49
まぁ>>806が正解だろうね。
俺はスレチとは思わんが、コードは書かない。

818 :デフォルトの名無しさん:2009/07/01(水) 15:54:30
>>816


819 :デフォルトの名無しさん:2009/07/01(水) 16:18:17
ここまで俺の自演

820 :デフォルトの名無しさん:2009/07/01(水) 17:36:52
どこから?

821 :デフォルトの名無しさん:2009/07/01(水) 17:42:39
じゃあここからは俺が

822 :デフォルトの名無しさん:2009/07/01(水) 18:47:00
横でスマンが、>>807
>ブックじゃなくてテキストファイルを醤油にしてるけど、

醤油にしてるっつーのはどういう意味?


823 :デフォルトの名無しさん:2009/07/01(水) 19:06:52
データソース→(中略)→醤油
だと思われ

824 :デフォルトの名無しさん:2009/07/01(水) 19:08:25
しょうゆこと

825 :822:2009/07/01(水) 19:12:49
しょうゆうことっすか w ありがと

826 :デフォルトの名無しさん:2009/07/02(木) 14:13:34
なんかないの

827 :デフォルトの名無しさん:2009/07/02(木) 23:14:11
sub 凶悪ループ()

do

msgbox ">>1乙"

loop

end sub

こーゆー連続でメッセージボックスが出るマクロってESCキーで止まんないんだけど
どーやって止めんの?

828 :デフォルトの名無しさん:2009/07/02(木) 23:15:53
タスクマネージャー開いてエクセル落とせばいいんじゃね?

829 :デフォルトの名無しさん:2009/07/02(木) 23:48:25
ctrl+Breakでとまる。

830 :デフォルトの名無しさん:2009/07/03(金) 01:10:42
電源おとせばいいんじゃね?

831 :デフォルトの名無しさん:2009/07/03(金) 02:03:59
ブレーカー落とせばいんじゃね?



832 :デフォルトの名無しさん:2009/07/03(金) 02:32:44




|  ↑
|┌┘  ┌─→
└┴─┬┘  ∧_∧
      └─┐ ´・ω・`)
←┐    ┌┘   /U
┌┴──┼────→
|      ↓


833 :デフォルトの名無しさん:2009/07/04(土) 10:30:09
このスレで質問するのが適切か分かりませんが、質問させてください
今年より社会人として働きはじめました。
業種は平たく言えばリース会社です。
新入社員教育として、ひたすらレポート、書類作成をしてきました。
エクセル自体余り使ったことがなく、書類はエクセルで書いたほうが便利なのかぁ〜っと、先輩から教わりつつ、業務教育を受けていました。
今月に入り突然上司より、VBAでツール作ってもらうからっと言われました。
プログラムなんて完全に未経験ですし、エクセルでもようやく文章をかけるようになった程度です。
そこで質問なのですが、初心者向けの参考書や、勉強法などありましたら、教えてください。
今はエクセル VBAで検索をし、上位に表示されるサイトを参考に勉強しています。
ツール自体どんなものを作るのか不明で、確認をとってみても勉強しといての一点張りです。
恐らく在庫管理かなにかで利用するツールではないかと思うのですが……
長々となってしまい、また質問内容も明確でないかも知れませんが、よろしくお願いします。
ちなみに私以外ほぼ客先に出ているため、社内で教えてもらうのは不可能です。
自分高卒なんで、会社も属に言うブラックなのかもしれません。

834 :デフォルトの名無しさん:2009/07/04(土) 10:51:08
>>833
参考書等:ググル、本屋のVBA本。何でも可。まずやってみる。
ツールの方向性:
◎レポート作成機能:グラフ付きの売り上げ月報をイメージして
 ・1エクセルで完結
  ・各シートに拠点毎の売り上げデータがあるとして・・・
  @集計機能
  A抽出機能
  Bレポート/分析/グラフ作成(拠点毎、グループ毎など)
 ・複数エクセルの連携
  ・上記と同じ。各エクセルファイルに拠点データがあるとして・・・
◎最終的にアクセスとの連携

何かしらの大量データを分析して、グラフ報告書を作れるようになれば
大抵の機能は作れるようになっていると思われ。
そこまで行くと、多言語実装やアクセス等のDB連携を視野に入れるようになるのでは?
頑張ってね〜

835 :デフォルトの名無しさん:2009/07/04(土) 11:05:07
それと勉強の方針としては、次のようにやってみれば?
つねに頭に置いておくのは「自動化」。いかにワンタッチで実装するかがポイント。

@9x9表の表示(反復と表示方法)
Aシート入力でnxn表の表示(シート入力方法)
BAを偶数 or 奇数のみ表示(選択方法)
CBの色塗りとか罫線とか(表示方法)
DCを別シートや別エクセルに出力(出力方法)

あとは小奇麗にまとめればレポート作成機能になりそうじゃね?
イメージできるかいな?

836 :デフォルトの名無しさん:2009/07/04(土) 12:03:27
>>833
Webで勉強するなんてもっとも非効率で全くおすすめできない。

とにかくどでかい本屋(http://www.computerbook.jp/cpu/archive/2009/06/26/5506.aspx参照)に
行って、最も簡単そうでピンときた奴を買ってきて、一冊通読しろ。
それが一番手っ取り早い。

837 :デフォルトの名無しさん:2009/07/04(土) 13:21:26
こんにちは、よろしくお願いします。
特定のセルが空白なら・・・という例はよく見かけますが、
特定の範囲が空白なら・・・というのが見つけられなくて困っています。
当方Excel2007です

Dim ran
Set ran = Range("A1:E5, A9:T18, A21:T31, A35:T44, A48:T57, A60:T69, A72:T81")
If ran.Value = Empty Then

とすると、set ran〜の部分で13エラーが出てしまいます。
正しいコードを教えていただけませんか?

838 :デフォルトの名無しさん:2009/07/04(土) 13:25:54
ループして中身全部見ろ

839 :デフォルトの名無しさん:2009/07/04(土) 13:36:23
すみません、エラーが出るのは
set ran〜の部分ではなく
if ran.vakue〜の部分でした。

loop、でプログラミングしてみたらいいのでしょうか?


840 :デフォルトの名無しさん:2009/07/04(土) 13:56:29
for each c in ran
if c ...
next

841 :デフォルトの名無しさん:2009/07/04(土) 14:41:29
>>834-836
親身になりアドバイスを頂き、ありがとうございます。
まず入門向けの参考書を買い勉強
その後サンプル集を買うまたはネットから手に入れマスターしたいと思います。
本当に途方にくれていました。ありがとうございます。
参考書はカラーで絵が多いものが経験上長続きします。
その辺りを考慮し選んできます

842 :デフォルトの名無しさん:2009/07/04(土) 15:19:14
>>841
大量データが欲しかったら、適当なHPで株式データを1ヶ月分くらい入手してみ。
個人だと大量データ入手が大変だから。会社データは色々とまずいだろうし。
んで、最初は手作業でいいから移動平均線のグラフとかを出せるようにして、
最終的にはワンタッチで自動更新できるようにするのがよろしいかと。

843 :デフォルトの名無しさん:2009/07/04(土) 15:38:06
家計簿や体重なんかのデータも身近でいいな

844 :デフォルトの名無しさん:2009/07/04(土) 16:40:06
>>840

できました!ありがとうございました

845 :デフォルトの名無しさん:2009/07/04(土) 21:44:30
意味のあるデータが大量に欲しいなら、
気象庁へ行けば過去の気温とか置いてあるよ

846 :デフォルトの名無しさん:2009/07/04(土) 22:00:47
架空のデータをでっち上げてくれるよ

なんちゃって個人情報
http://kazina.com/dummy/index.html


847 :デフォルトの名無しさん:2009/07/04(土) 22:07:43
>>846
これ面白いなw初めて知ったわ

848 :デフォルトの名無しさん:2009/07/04(土) 22:15:01
カレーの食べ方に名前があったなんてw

849 :デフォルトの名無しさん:2009/07/04(土) 23:50:12
Excelで一覧を作った時に
たとえば3行目がタイトル行だとして、
タイトルにはA列は年齢、B列は名前、C列は出身とかあるのですが、
あらかじめ指定されたタイトルを検索して、
その列のタイトル次の行から、一番下の行まで選択するにはどうすればいいのでしょうか?

たとえば変数か何かで「名前」と指定すれば、
B4からその列の一番下の行まで選択したいのですが
やり方がいまいちわかりません
教えてください

850 :デフォルトの名無しさん:2009/07/05(日) 00:22:29
>>849
ヒント: ctrl+↓
これをマクロで書いてみ (ただし途中に空欄がある時は誤動作するけど)
最終行(65535?)からctrl+↑でも似た動作するよ

データが何行目まであるか決めといた方が、もっとスマートに書けると思うよ


851 :デフォルトの名無しさん:2009/07/05(日) 00:23:09
>>849
プログラムを作る時は、手順を分解して1つずつ考えるんだよ
この「分解する」ってのが初心者には難しい。
知識と経験がないと、どうやって分けたらいいのかわからないし、
うまく分解できないと検索してもヒットしない

1. タイトルのある行を特定する
2. 検索する文字列を指定する
3. タイトル行から指定された文字列を検索する
4. 一番下の行を調べる
5. タイトルの次から一番下まで選択する

852 :デフォルトの名無しさん:2009/07/05(日) 00:32:07
>>846
たった5000件までかよ。
いつもいまいちな回答してるやつ5000件で試してるのかも知らんな。

853 :デフォルトの名無しさん:2009/07/05(日) 00:38:02
>>852
文句があるならお前が教えてやれよwww
初心者なんだから5000件でも多いだろwwwwwwww

854 :デフォルトの名無しさん:2009/07/05(日) 00:50:54
>>849
面倒だから書かないが
http://officetanaka.net/excel/vba/cell/cell11.htm
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html
これを組み合わせればできるはず


855 :デフォルトの名無しさん:2009/07/05(日) 01:20:57
>>853
配列数式厨には多すぎるくらいのデータだわな。
配列数式厨は>>846使って答えるべし。
5,6件のデータを想定するんじゃねーぞ。

856 :デフォルトの名無しさん:2009/07/05(日) 01:52:41
アルゴリズムとデータ構造覚えるなら10件程度でよくね?
学校ではそっから始るんだからさ。
まずはVBAより、変数とか配列とかのプログラム自体に慣れるのが吉。

857 :デフォルトの名無しさん:2009/07/05(日) 02:37:26
>>856
一般的になプログラミングになれたら、VBAで通用しなかったでござるの巻

858 :デフォルトの名無しさん:2009/07/05(日) 02:38:04
理論と実践は違うからなあ
大量のデータを高速に処理しようと思ったら、教科書に載ってる一般論なんて役に立たないし

859 :デフォルトの名無しさん:2009/07/05(日) 03:44:58
>>858
データに偏りがあったり、ある法則、特性があるなら
その特性にあった方法をとるアルゴリズムが早くなることは十分にありえる。

必ずデータが1つ以外きれいに並んでいて、その一つのデータのためにソートするなら
クイックソートなんよりバブルソートの方が早いかもしれない。

860 :デフォルトの名無しさん:2009/07/05(日) 08:15:35
row = 1次元
row column = 2次元
sheets row column = 3次元
workbooks sheets row column = 4次元

て考えれば、気づいてないだけで誰でも4次元配列まで使えてるはずなんだけどね。

861 :デフォルトの名無しさん:2009/07/05(日) 08:19:39
>>860
5次元がフォルダ分けで
6次元がHDD分けかと思ったがそこから先はフォルダの階層を深くしていけばいいのか

862 :デフォルトの名無しさん:2009/07/05(日) 11:15:53
Office2000から2007に移行するのだが、ツールバーをいじるマクロって2007だと使えなくなる?
例えば新規にツールバーを作り、そのツールバーから実行するマクロなど。

863 :デフォルトの名無しさん:2009/07/05(日) 11:51:23
>>860
セルの中身を1文字ずつ分解すれば、さらに1次元プラス

864 :デフォルトの名無しさん:2009/07/05(日) 13:00:59
3次元以上の配列なんて実際に役にたつの?
逆にrow,columnの2次元でも1次元ふたつに分解したほうが扱いやすかったりするような・・・


配列使いだしたの最近だから、多次元が役立つケースあれば教えてもらえると勉強になる。

865 :デフォルトの名無しさん:2009/07/05(日) 13:27:42
>>857
基本もわからず応用をやって、結局何も出来なかったでござる巻
VBAかじった奴に多い罠。

>>864
3次元以上の配列なんてそうそう使わんから気にするな。
そうなる前に、構造体・コレクション・クラスになるよ

866 :デフォルトの名無しさん:2009/07/05(日) 14:55:18
1つの配列変数で4次元、5次元と増やすと、主に人間の頭がついていけなくなるという理由で使えなくなるけど、
シートが1枚しか使えないとかブック(ファイル)が1つしか作れない環境を考えたら、それはとても扱いづらくなるだろ?
ようするに、増えた分をどうイメージするかって問題だよ。

867 :デフォルトの名無しさん:2009/07/05(日) 15:01:16
VBAではやらないけど、構造解析とかやってると
構造データが3次元で、それに応力や温度や時間軸を増やしていったりするから
5次元とか6次元の配列は日常的に使う。

科学技術計算では多次元配列を使いまくるから、ベクトル型のスーパーコンピュータなんかは
配列(実際は行列)どうしを足したり掛けたりするための専用のハードウェアが内蔵されてて、
ループを使わなくても一発で計算できるような構造になってたりする。

868 :デフォルトの名無しさん:2009/07/05(日) 15:06:34
>>866
増えた分をどうイメージするかじゃなくて、意味のある次元の割り当て方をしていれば
何次元配列になっても混乱しないし、高次元の配列は作らないだろ

二次元配列をメンバーに持つクラスを格納するリストを用意して、実質3次元に成ることはあっても
単体の配列だけで4次元以上の高次配列に成ることはまず無いだろうな。

そもそも各次元n(i)個の要素を持つn次の行列を逐次アクセスしようと思ったら
Π[i=0,m](n(i))回ループすることになるしな。

869 :デフォルトの名無しさん:2009/07/05(日) 15:15:14
VBの配列が貧弱なだけだからOK

870 :デフォルトの名無しさん:2009/07/05(日) 15:56:41
> 1つの配列変数で4次元、5次元と増やすと、主に人間の頭がついていけなくなるという理由で使えなくなるけど、
そんな奴居ねーよw
物理次元の話と混同してないか?

物理次元なら4次元以上に付いていけない人が多いのは確かだが、
配列次元が増えることで付いていけなくなることはまずない。
少なくとも、1次元配列が理解できて5次元配列が理解できない奴は、まともな社会生活すら送れないことになる。

何故なら日本国内の住所概念が、都道府県名を第1次元とする5〜11次元配列に相当するからだ。
更に言えば、5次元配列を理解できない奴は、万単位の買い物も出来ない。
0〜99999という10万未満の数値は、0〜9という要素の5次元配列に相当する。
「お会計34567円です」と言われて、どの額面(次元)の紙幣や硬貨が何枚(要素)必要か理解できるなら
5次元配列を理解できていることになる。少なくともVB言語の配列における次元ってのはこのレベルの概念だ。

まぁ5次元配列をプログラムの中で効果的に運用できるかとなると話は別だがな。

871 :デフォルトの名無しさん:2009/07/05(日) 16:02:56
そもそもこの世界は11次元で紐(ry

次のネタマダァ-? (・∀・ )っ/凵⌒☆チンチン

872 :デフォルトの名無しさん:2009/07/05(日) 16:08:22
>>862
俺も知らんがリボン対応しないと駄目なんじゃね?

873 :デフォルトの名無しさん:2009/07/05(日) 16:26:59
>>870
だから、何をイメージするかで理解できるかどうかが変わってくるんだってば。
単純に数字を並べただけだと、それだけで拒否反応を示す人がいる。
「住所みたいなもんだと思えばいいんだよ」ってアドバイスをすれば
すんなりわかってもらえる確率がぐっと上がる。
そういうレベルの話をしてたつもりなんだけど。

874 :デフォルトの名無しさん:2009/07/05(日) 16:29:29
>>873
ずいぶん低レベルだったんだな。

875 :デフォルトの名無しさん:2009/07/05(日) 16:37:29
そう。低レベル。
初心者に説明するのは大変なんだよ。
いっぺん家庭教師とか講師とかやってみるとわかる。

876 :デフォルトの名無しさん:2009/07/05(日) 16:50:01
住所や金銭が配列って概念が新しいわw
これらはプロパティのイメージだろw

877 :デフォルトの名無しさん:2009/07/05(日) 17:31:39
学校のPCなのでバージョンは見てませんが、OSはXPのPCで、
学校の宿題として出されたのですが、ExcelのVBで奇数偶数を分けるマクロを、
調べるように言われたのですが、自分の持ってる本には書いてなくて、Excelの
基本操作でもできる物ですが、教えてください。


878 :デフォルトの名無しさん:2009/07/05(日) 17:33:17
2で割ってあまりがあったら奇数
なかったら偶数

879 :864:2009/07/05(日) 17:42:45
なんだかお騒がせしてるみたいですみません
クラスとかあまりわからないからわかる範囲で処理しようとしてかえってややこしくしてるのかもしれませんね
勉強不足ですみません

そもそも多次元が不便に感じたきっかけはredimで最終次元しか変更できないからですけど
なにか簡単な別手段ありますか?

880 :デフォルトの名無しさん:2009/07/05(日) 17:55:06
>>876
何勘違いしてるの?

881 :デフォルトの名無しさん:2009/07/05(日) 18:12:03
>877
授業で、ってなると、
2を引きまくって余りが1以下になるまで、とか
無駄にループしてるの作ってほしそうだね

882 :デフォルトの名無しさん:2009/07/05(日) 18:32:42
>>877
ふつうは、>>878さんのやり方でやるよ。
Mod使って余り出しても良いし、ビット演算子使っても出来る。

883 :デフォルトの名無しさん:2009/07/05(日) 18:55:48
   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       i
 彡、   |∪|   |      877J
/     ∩ノ ⊃  ヽ
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /

884 :デフォルトの名無しさん:2009/07/05(日) 19:11:41
mod



885 :デフォルトの名無しさん:2009/07/05(日) 19:42:48
質問させてください。
OS:Windows XP Professional SP2 Excel2003
VBA歴半月です。プログラミングはJavaをかじったことのある程度です。

一つのブックに商品別売上一覧表のシート(マスタ)と更新されたデータを含むシートがあります。
表示形式はどちらのシートも同じです。
商品コードがユニークなので、マスタにない商品コードを更新シートから検索し
マスタの最終データ行の下にデータ行を追加していくプログラムを組んでいます。
なお、商品名ごとに月別売上の小計を計算する行が一行挿入されていて
その行の商品コードのセルは空白になっています。

Dim master As Integer (マスタの行カウンタ)
Dim update As Integer (更新シートの行カウンタ)

Do while master > 最終データ行
If (マスタ)商品cdセル <> "" Then
For update = 2行目 To 最終データ行
If (更新)商品cdセル <> "" Then
If (マスタ)商品cdセル.Value <>(更新)商品cdセル.Value Then
(更新)該当データ行(データのある範囲).Copy
     (マスタ)最終データ行の一行下.Insert
End If
Next
End If
Loop

という方法で組んでみたんですが、新規データだけを拾うことができません。
分かりにくくて申し訳ありませんが、ご指摘よろしくお願いします。

886 :デフォルトの名無しさん:2009/07/05(日) 19:56:17
>>885
不明点だらけで困るが、デバッグして追ってみれば?

@マスタと更新シートのデータをきちんと拾えているか?
Aコピペするのは良いが、きちんと更新シートをコピってマスタにぺしてる?
 片一方のコピペを繰り返していないか?
B上書きしてないか など・・・

887 :デフォルトの名無しさん:2009/07/05(日) 20:23:15
>885
If (マスタ)商品cdセル.Value <>(更新)商品cdセル.Value Then
↑ここおかしくない?
マスタと更新のデータ位置が同じセルであるわけがないんだから。
matchでエラーなら挿入とかの方がいいんじゃないかね?

888 :デフォルトの名無しさん:2009/07/05(日) 20:34:10
>>887
whileとforで回してるっぽいが・・・
確かにマスタと更新の行位置更新について情報無いけどね

889 :885:2009/07/05(日) 21:16:07
>>885です。レスありがとうございます。

>>886
データは拾えてるみたいです。
更新→マスタへのデータのコピーはできるんですが
新規データだけでなく既存コードのデータまで複数件コピーされてしまっています。

>>887
マスタと更新はまったく同じレイアウトですが
新規データが追加されるので、確かにコードの位置はマスタと更新では違います。
そう思って二重ループで回してみたんですが、上記のような状態になってしまいます。
>>887さんの仰る通り、条件文が変なんだと思います。
ちなみに、matchを使って判定する場合は、
If match(マスタの商品cdセル, 商品cdのセル範囲, 0) = #N/A
というような使い方をするんでしょうか。

890 :デフォルトの名無しさん:2009/07/05(日) 21:32:01
一段階踏めば?理解してからmatchとか使わないと結局分からなくなると思うが。
@全データ突合せ。印をつけとく。(行位置確保)
Aそれからコピー

891 :デフォルトの名無しさん:2009/07/05(日) 22:07:17
>889
match使うならば、エラーが出る=matchしない→コピー必要、だから、
エラーが出たらコピー作業、になる。
かなり適用にしか書いてないからちゃんと直して。

Dim mastercode as string
Dim updaterange as range
On Error GoTo Datacopy

Set mastercode = (マスタ).Range(cd) '←cd部分"master使って表記"
Set updaterange = (更新).Range(cd) '←cd部分"update使って表記"
If Application.WorksheetFunction.Match(mastercode, updaterange, 0) > 0 Then
GoTo Nextcopy

Datacopy:
  コピー作業
Nextcopy:
  End If
  Next 〜
  Loop

892 :デフォルトの名無しさん:2009/07/05(日) 23:01:23
DBで扱うなら、SQL組み込んでいいんじゃね

893 :885:2009/07/05(日) 23:45:30
>>890
ご回答ありがとうございます。
もう一度検証してみたところ、ループの通り方がおかしかったようです。
>>885の処理だとセルの値が同じ時は違う値だけを拾えるんですが、
Else中で違う値に印をつけると、全てのセルに印がついてしまうので
コピー作業をする前に、ループ処理を見直してみます。

>>891
matchを使ったコードのご提示、ありがとうございます。
今は前段階のループでつまずいてしまっていますが、
簡単なサンプルで動かしてみて、matchの働きは大体把握できました。
参考にさせていただきます。

>>892
DBでは使わないので、SQL文は使えません…

もう一度、ループを見直して行位置確保できるよう考えてみます。
分かりずらい説明だったにもかかわらずレスくださった方々
本当にありがとうございました。

894 :デフォルトの名無しさん:2009/07/06(月) 08:43:34
>>893
簡単な素数の求め方と同じ原理
2から始まって、2の倍数削除、3の倍数削除、4は飛んで5の倍数削除(ry

895 :デフォルトの名無しさん:2009/07/06(月) 09:35:11
Clng(Date) = 40000

896 :デフォルトの名無しさん:2009/07/06(月) 13:23:33
エクセルで迷路っぽいのを作る時、ランダムに配置された部屋(セル範囲)を
すべて通りつつランダムに通路で繋げるにはどうしたらいいかな?

897 :デフォルトの名無しさん:2009/07/06(月) 14:39:21
>>896
分割統治法か動的計画法使えばいんじゃね?

898 :デフォルトの名無しさん:2009/07/07(火) 01:19:26
>>896
ほれ
http://u6.getuploader.com/SR1gou/download/26/%E3%82%BB%E3%83%AB%E3%83%8D%E3%82%B3.xls

899 :デフォルトの名無しさん:2009/07/07(火) 16:08:14
はじめまして。よろしければご教授下さい。

os:XP SP2
excel: 2003


あるデータ群のO列のあるセル(仮に("O"&i))がblankの際O列の1行上(仮に("O"&i-1))をコピー、
("O"&i)にペースト、を実行したいのですが、反応しません。

Sub test()

Dim i As Long
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
If Range("O" & i).Value = 0 Then
Range("O" & i).Offset(-1, 0).Copy Destination:=Range("O" & i)
End If
Next i

End Sub

フィルタ等を使えば可能なの程度のものかもしれませんが、
割と大きなCSVファイルを展開する途中のものなので
できれば手動では行いたくないのです。

宜しくお願い致します。

900 :デフォルトの名無しさん:2009/07/07(火) 16:19:40
>>899
F8

901 :デフォルトの名無しさん:2009/07/07(火) 16:31:29
普通に動くけど

大量データを回すならコピーじゃなくて直接値を入れたほうがいいんじゃね

902 :899:2009/07/07(火) 17:06:32
>>900-901
稚拙な質問にご回答頂き有難うございました。

>>901
>コピーじゃなくて直接値を入れたほうが
参考にさせて頂きます。有難うございました。

903 :デフォルトの名無しさん:2009/07/07(火) 17:53:23
>>896
ローグライク作りたいんだろ?
・部屋と道と分岐点のパターンを各種作成しておく
・部屋作りの前に部屋と分岐点の数を決定する
・後は部屋と道を繋げる。分岐点が足りなければ、
 部屋の位置を調整して直線でつなげる

パターンの位置調整がめんどくさいだけじゃね?
その情報じゃこれぐらいしか言えん

904 :デフォルトの名無しさん:2009/07/07(火) 21:52:06
こんばんわ、質問させていただきます。
Webの自動実行を行うマクロを作成しています。
文字列代入→ボタン押下というのを繰り返しているだけなのですが、
ボタン押下した際次の画面になるまで
Do While objIE.Busy = True Or objIE.document.ReadyState <> 4
 DoEvents
Loop
といった感じに表示待ち処理をいれています。
が、時々ボタン押下時にURLはそのままで画面のみ遷移する場合や、画面上のタブの切り替えを行った場合など
上記の表示待ち処理が終了しても画面が切り替わりきれていないことがあります。
objIE.Document.form(0).item("button1").Click ←画面遷移
表示待ち
objIE.Document.form(0).item("button2").Click  ←ここで「オブジェクトはこのプロパティまたはメソッドをサポートしていません」とでます。

2,3秒待つと普通にクリックできるようになるので現在は強制的に3秒程待機するようにしていますが、
もし他にボタンが押せるようになるまで待機ができる方法などございましたらご教授いただけませんでしょうか。
わかりにくい質問で申し訳ありません。よろしくお願いします。


905 :デフォルトの名無しさん:2009/07/07(火) 22:51:55
>>904
While .item("button2") Is Nothing 〜 でボタンが表示されるのを待つ

906 :デフォルトの名無しさん:2009/07/07(火) 22:57:59
質問です。

stringの変数の中に格納されている文字列の、
頭から指定の文字数だけ、置き換えたいのですが、どうやったらうまくいのでしょう?

文字列は、全角、半角混ざっています。

907 :デフォルトの名無しさん:2009/07/07(火) 22:58:40
>>904
On Errorでクリックできるまでループ

908 :デフォルトの名無しさん:2009/07/07(火) 23:00:11
>>906
VBAでは全角も半角も同じ1文字として数えるから、普通にLeft関数とか使えばいい

909 :デフォルトの名無しさん:2009/07/07(火) 23:22:18
leftって文字列を抜き出すんですよね?
それを置き換えるのはどうやるんでしょう?


910 :デフォルトの名無しさん:2009/07/07(火) 23:23:46
midのほうがいんじゃね

911 :デフォルトの名無しさん:2009/07/07(火) 23:27:21
sub 文字列aのc文字目までを文字列bに置き換える()
a = b & mid(a,c+1,len(a)-c)
end sub

912 :デフォルトの名無しさん:2009/07/07(火) 23:33:35
条件小出し案件の予感・・・

    Σ(゚д゚lll)

913 :デフォルトの名無しさん:2009/07/08(水) 00:00:59
置換というか、代えたい文字+残したい文字なんですね。
ありがとうございます。

914 :デフォルトの名無しさん:2009/07/08(水) 00:09:06
>>905,907
904です。ありがとうございます。早速試してみます。

915 :862:2009/07/08(水) 00:30:52
>>872
情報サンクス。
やはりリボンか・・・マクロの改変ややこしそうだ(´・ω・`)

916 :デフォルトの名無しさん:2009/07/08(水) 05:50:55
>>915
それなら普通にVSTO使えばいいんじゃね?

917 :デフォルトの名無しさん:2009/07/08(水) 06:04:36
Replace関数使えよ。
"あいうえお"から頭の"あいうえ"を"はげ"に置き換えるなら
Replace("あいうえお","あいうえ","はげ")
これで”はげお"になる。
ただExcel97だったかExcel2000からのサポートだったか忘れた。

918 :デフォルトの名無しさん:2009/07/08(水) 06:19:48
上はちょっと足りなかったか。
"あいうえあいうえお"で"はげはげお"になるな。
Replace("あいうえお","あいうえ","はげ",1,1)
これだと"はげあいうえお"になる。

変数aの頭の4文字を"はげ"に置き換えるには
Replace(a,Left$(a,4),"はげ",1,1)かな?

919 :デフォルトの名無しさん:2009/07/08(水) 12:14:57
もし同じ文字数の別の文字列に置き換えるならMidステートメントが楽だね。

920 :デフォルトの名無しさん:2009/07/08(水) 16:52:04
ありがとうございます。
midとReplaceとどちらが勝手がいいか試してみます。

921 :デフォルトの名無しさん:2009/07/08(水) 17:31:38
グラフのプロットエリアの位置・サイズ指定の方法は、Excel 2007で変更になったのでしょうか? PlotArea.Top(LeftやWidth)=数字 のようにすると 2003だと上手くいくのですが、2007だとエラーが出ます。どなたか、ご教授下さい。

922 :デフォルトの名無しさん:2009/07/08(水) 17:37:34
2元配列の入れ換えってどうするんでしょう
↓を取り敢えず考えたんですが

dim 配列i() as string
dim 配列n() as string
dim 変数i as long
dim 変数n as long

for 変数i = 1 to 任意の数
redim preserv 配列i(1,変数i) as string
配列i(0,変数i) = 任意のstring
配列i(1,変数i) = 任意のstring2
next
redim 配列n(変数i,1) as string
for 変数n = 0 to 変数i
配列n(変数n,0)=配列i(0,変数n)
配列n(変数n,1)=配列i(1,変数n)
NEXT

セル範囲 = 配列n

923 :デフォルトの名無しさん:2009/07/08(水) 17:56:06
for 変数i = 1 to 任意の数

for 変数i = 0 to 任意の数

でしたすみません

セル範囲に流し込む二元配列にデータを取得するんですが、
その配列に格納するデータが不確定であった場合
redim preservの適用範囲が配列の最終データまでしかなくて困るんです

924 :デフォルトの名無しさん:2009/07/08(水) 19:30:39
一回シートに書き出せばいんじゃね

925 :デフォルトの名無しさん:2009/07/08(水) 19:33:48
>>922
とりあえず、無意味に変数とか配列とか書くとかえって読みにくいんだけど…俺がなれてないせい?
dim a() as string
dim b() as string
dim i as long
dim j as long
dim n as long 'nは任意の数。つうか任意の数って具体的にどこの数よ?

for i = 1 to n
redim preserv a(1,i) as string
a(0,i) = 任意のstring
a(1,i) = 任意のstring2
' if 〜 then exit for とか書く予定?
next
' 大きめにとっておいて、最後にReDim preservで小さくするか
' 配列のサイズがループ前に既知なら、ループ前に1回確保するだけにとどめておいた方が…

redim b(i,1) as string ' i ->nで良いよね?

for j = 0 to i ' j -> i 、i -> nで良いのでは?
b(j,0)=a(0,j)
b(j,1)=a(1,j)
next
' 代入していないa(0,0)にアクセスしている件につい(ry
セル範囲 = b
-------------------

結局やりたいことは転置?

ひとつ、コンパイラな人に聞きたいんだが、
ループ変数をループ外で利用する、しかもループ脱出後の値をそのまま使うってのはアリなのか?
最適化の面で不利な気がする。 VBAはそのレベルの最適化はかけてなさそうだけど…

926 :デフォルトの名無しさん:2009/07/08(水) 19:44:55
とりあえず、2次元配列(ジャグ配列ではない)を転置するやつは
単純に考えればこうなるよね?

Sub Transpose(ByRef target() as Variant)
Dim input() as Variant
Dim output() as Variant
Dim x as integer , y as integer

' 既にtargetは領域確保済みで、値が入っているものとする
Let input = target '動的配列はVariantだからLetで良いんだっけ?

ReDim output(LBound(input,2) To UBound(input,2),LBound(input,1) To UBound(input,1))

for x = LBound(input,1) to UBound(input,1)
for y = LBound(input,2) to UBound(input,2)
output(y,x) = input(x,y)
next y
next x

Let target = output
End Sub
たぶん、配列はvariantだから、inputへコピーするのを省くとちょっと早くなるかもしれない。

927 :デフォルトの名無しさん:2009/07/08(水) 20:32:53
>>925
変数iはループを終えた時点でn+1になってるからダメ
For i = 1 To 10
  Debug.Print i
Next
Debug.Print i
ってやってみ

928 :デフォルトの名無しさん:2009/07/08(水) 21:50:48
変数の範囲って
@ブック内全部
Aモジュール内全部
B宣言したプロシージャだけ

の3つであってますか?

Aの場合

Dim hoge as string
DIM hoge = "ほげ"

sub test ()
msgbox = "hoge"
end sub


こういうことじゃないんですか?


929 :デフォルトの名無しさん:2009/07/08(水) 21:59:58
自己解決

宣言だけして代入はしてはいかんのですね

Dim hoge as string

sub test ()
hoge = "はげ"
MsgBox = hoge
end sub

930 :デフォルトの名無しさん:2009/07/08(水) 22:00:27
そこはDimじゃなくてprivateと書くべき。
sheet1も中身はクラスだよ。
そして何を言いたいのかわからない。

931 :デフォルトの名無しさん:2009/07/08(水) 22:06:23
privateはブック内全部って事じゃないのですか?
モジュール1でもモジュール2でも宣言した変数を使うときに
書くみたいな



932 :デフォルトの名無しさん:2009/07/08(水) 22:24:02
変数のスコープ でググると分かりやすいかも。

933 :デフォルトの名無しさん:2009/07/08(水) 23:32:47
>>931
まあ、MSDNの取説見るのが一番手っ取り早いと思うけど
private / publicはクラスの外部から見られるか、見られないかの違いしかない。
実際、モジュールに宣言して、外部からアクセスしてみれば分かる。

それ以外のルール、宣言した識別子が、どの範囲まで通用するかというのは
原則、宣言した場所よりも深いところであれば通用する。(クラスのメンバはそのクラスに属するメソッド内でつかえる)
その逆は、通用しない。(メソッドの中で宣言された物は、同クラスのほかのメソッドからはアクセスできない(つか、する必要性がないがw)


934 :デフォルトの名無しさん:2009/07/08(水) 23:45:08
>931
それはpublic

935 :862:2009/07/09(木) 21:20:14
>>916
ありがとう。でもVSTOなどのアプリケーションは事情があって
インストールできない環境なのよ。
OfficeのVBAエディタだけで対応するしかない状況。
頑張るよ。。

936 :デフォルトの名無しさん:2009/07/10(金) 04:50:39
>>935
IT奴隷 乙

937 :デフォルトの名無しさん:2009/07/11(土) 23:09:31
ネット検索のみでいままでVBAを勉強してきたのですが、
とうとう行き詰ってしまいました・・・

先生方の手助けを借りられれば幸いと思い書き込みさせていただきます。


イベントWorkbook_BeforeSaveをアドインで機能するようにしたいのですが、
WithEventsを下記のように用いてもうまく機能しません。

どのほうに表現すればよろしいのでしょうか?


以下ThisWorkbookに貼り付け。

-------------------------------------------------------------------------
Private WithEvents app As Application
-------------------------------------------------------------------------
Private Sub Workbook_Open()
Set app = Application
End Sub
-------------------------------------------------------------------------
Private Sub app_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

MsgBox "テスト"

End Sub
-------------------------------------------------------------------------

説明不足等ございましたら、お手数ですがご指摘お願いいたします。
よろしくお願いいたします。

938 :デフォルトの名無しさん:2009/07/12(日) 00:00:38
Range("1:1,3:3,4:4,6:6,7:7,11:11,13:13,15:15,17:17,27:27").Select

上記みたいに行選択をさせたく
ある行にある特定の文字列がある行だけを選択させたいのですが
Do Whileで回して
valsにほしい行をため込んでいって
aaa = "" & vals & ""
Range(aaa).Select
という記述がどうしてもうまくいきません

それが1000行近くあるので数の問題かと思っていたら
そうでもなさそうですし
うまい方法を教えてください


939 :デフォルトの名無しさん:2009/07/12(日) 00:30:57
とりあえず、aaaが目的の文字列にきちんとなっているか確認してみたら?
うまく繋げられていないだけのような気がする。

940 :デフォルトの名無しさん:2009/07/12(日) 00:40:48
>>938
Rangeの引数に指定できる文字列は256文字以下

941 :デフォルトの名無しさん:2009/07/12(日) 00:42:39
>>939
はい一応デバックで止めて中身を見てもちゃんと入っています
ダブルクォーテーション網膜は行っています
もしくは
データをいじって結果がRange("1:1,3:3").Select
という 数を少なくしてもやはりエラーになります

Range("1:1,3:3").Select
をそのまま記述すればエラーにならないのですが
どうしても
"1:1,3:3"の部分を変数にするとエラーになります

ちなみにエラーの内容は
実行時エラー1004
Rangeメソッドは失敗しました: '_global'オブジェクト

942 :デフォルトの名無しさん:2009/07/12(日) 01:17:54
>>941
まず、文字列にダブルクォートを入れたいときは
× aaa = ""
○ aaa = """"
なんだけど、ダブルクォートってのはソースリストの中で文字列の範囲を示すための物だから、
それ自体を文字列変数に入れても仕方がない
つまり
aaa = "" & vals & ""
Range(aaa).Select
じゃなくて
Range(vals).Select
だけでいいはず
あと、上にも書いたようにRangeに指定できる文字列は256文字

943 :デフォルトの名無しさん:2009/07/12(日) 01:23:11
正確には256文字未満
つまり255文字まで

944 :デフォルトの名無しさん:2009/07/12(日) 08:53:58
>>941
それ標準モジュールに書いてるのか?
シートモジュールじゃないのか?
例えばSheet1のモジュールで
Worksheets("Sheet2").Activate
Range("A1").Select
と書いても動かん。
シートモジュールなら
Range(aaa).Selectじゃなくて
Excel.Range(aaa).Selectとしてみなよ。

しかしActivateとかSelectとかほとんど必要ないんだが、そのアドレスをため込んでいく方法も感心しないな。
前スレで同じような回答したやつに指摘したら逆切れされたよ。
バカはどこにでもいるから仕方がないが。
盲愚の側溝テクニック集にも似たようのがあったかな?
あそこは駄目テクニック満載だがw

945 :デフォルトの名無しさん:2009/07/12(日) 09:03:39
>Range("1:1,3:3").Select
>をそのまま記述すればエラーにならないのですが
とあるかから上は外しだったな。

255文字を超えたんじゃないかと思うが
>データをいじって結果がRange("1:1,3:3").Select
>という 数を少なくしてもやはりエラーになります
とあるから、これも直接の原因じゃないのか。
いずれにしても1000行なら255文字は超えそうだけどな。

946 :デフォルトの名無しさん:2009/07/12(日) 09:11:19
もしかしたら余計なダブルクォーテーションが先頭と最後についてるんジャマイカ。
付けてみたら
「実行時エラー1004
Rangeメソッドは失敗しました: '_global'オブジェクト」
のエラーメッセージが出たが。

947 :946:2009/07/12(日) 09:13:59
そうか、多分>>942が当たりだな。

948 :デフォルトの名無しさん:2009/07/12(日) 10:26:25
>>937
HELPから引用

省略可能です。引数 varname が ActiveX オブジェクトによって
起動されるイベントへの対応に使われるオブジェクト変数であることを示すキーワードです。
クラス モジュール内でのみ有効です。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
キーワード WithEvents を使用して任意の数の変数を個別に宣言できます。
ただし、配列は作成できません。また、キーワード New はキーワード WithEvents と共には使用できません。


てか、「Excel WithEvents」とかでググればいっぱいでてくる
ttp://msdn.microsoft.com/ja-jp/library/cc376266.aspx

949 :デフォルトの名無しさん:2009/07/12(日) 11:41:19
>>492-497
対応ありがとうございます
やはりダブルクォーテーションが原因のようでした

>>944
一応思いつくのは方法として思いつくのが
上記のやり方か
フィルタで特定の文字の行だけを抽出して全選択ぐらいしか思いつかないのですが

他にうまいやり方とかあるのでしょうか?

950 :937:2009/07/12(日) 12:11:58
>>948
ありがとうございます。
参考URLより、うまく機能させることが出来ました。
ありがとうございました。

951 :デフォルトの名無しさん:2009/07/12(日) 14:07:15
>>949
そのまとめて処理という発想をすてて、一つ一つ処理した方が確実。
ただ一つ一つSelectして処理は駄目。
Selectしない方法を身につけないと。

952 :デフォルトの名無しさん:2009/07/12(日) 16:09:06
>>951
一つ一つ処理したら何が確実になるの?
一つ一つSelectして処理したらどうして駄目なの?

953 :デフォルトの名無しさん:2009/07/12(日) 16:21:25
横レスだけど、
1つに対して出来たら、後はforやfor eachで対象を増やすだけ。
selectしなくても直接操作できるならしない方が動作が早い。

954 :デフォルトの名無しさん:2009/07/12(日) 18:30:54
>>953
>1つに対して出来たら、後はforやfor eachで対象を増やすだけ。
例えば1行1列の行列掛け算プログラムを正しく作ったとして、
それをn行n列の行列掛け算に拡張するとする。
その拡張が正しいというのはどのように判断するの?

2行のデータをソートするプログラムを正しく作ったとして、
それをn行のソートに拡張するとする。
その拡張が正しいというのはどのように判断するの?


955 :デフォルトの名無しさん:2009/07/12(日) 18:32:11
まとめてやった方が早いかどうかは処理によるんじゃね?

956 :デフォルトの名無しさん:2009/07/12(日) 18:34:41
>>953
>selectしなくても直接操作できるならしない方が動作が早い。

早く動作させたい場合、データを一つ一つループで回して処理するより、
データの塊りをライブラリに与えるほうが速いことが多いよ。


957 :デフォルトの名無しさん:2009/07/12(日) 18:43:48
>>951
>>953
データを集合で扱ったほうが、確実(正しい処理)で速いよ。
selectがどうとかバカらしいよ。

958 :デフォルトの名無しさん:2009/07/12(日) 18:47:39
とりあえず速さがどうとか言ってる奴はサンプルを提示して、実行速度の比較結果をここに貼れよ

959 :デフォルトの名無しさん:2009/07/12(日) 20:15:54
>>954
ダミーデータ入れて検証するか、ステップアップで確認しろよw

960 :デフォルトの名無しさん:2009/07/12(日) 20:18:36
まとめて処理が速いと思ってる馬鹿どもが、例の低レベルUnion使ったりするんだろうねぇ。
なにせ普通にUnion使ったらエリア数の惨状に比例して遅くなる。

961 :デフォルトの名無しさん:2009/07/12(日) 20:21:03
高レベルのロジックを貼ってください><

962 :デフォルトの名無しさん:2009/07/12(日) 20:26:56
いちいちSelectするよりRangeオブジェクトをそのままメソッドに渡した方が速いことが多い。
これはあくまでも一般論。

Selectしたあと何をやるか質問者が一切書いてないのに先走ってケンカして、単なるアホ。

963 :デフォルトの名無しさん:2009/07/12(日) 20:28:13
>>962
Selectした後コピーして別のシートに貼り付ける

964 :デフォルトの名無しさん:2009/07/12(日) 20:32:29
>>960を受けてだが、A1:CV10000に1〜100のランダムな数値を入れて、各行の最大値のセルに色を付けるコードを書け。
ただし条件付き書式は使わないものとする。
まぁ条件付き書式でも実用に耐えるものを設定出来るやつ何人いるか分らんが。
ちなみに=A1=MAX($A1:$CV1)の条件は不合格です。

965 :デフォルトの名無しさん:2009/07/12(日) 20:37:10
>>962
実際よくUnuion使った手法を見るから>>960が書いてるように勘違いしてるやつは多い。

966 :デフォルトの名無しさん:2009/07/12(日) 20:40:53
>>962がアホと言ってるのは>>951だったか。

967 :デフォルトの名無しさん:2009/07/12(日) 20:48:14
>>964
何が不合格やねん、アホか

968 :デフォルトの名無しさん:2009/07/12(日) 20:55:04
>>959
行列計算やソートしてくれるライブラリがあるなら、そっちを使うなあ。
検証好きなんだな。お前。

969 :デフォルトの名無しさん:2009/07/12(日) 21:30:27
荒れると伸びるよなお前ら
速さの話題出るたびに検証検証言ってるのは一人だけなのか?
質問が早さを求めていない以上レスポンス云々の回答が的外れであるのは否めないが
何度もそう健勝言われてもうざいです^^q^

970 :デフォルトの名無しさん:2009/07/12(日) 21:36:34
>>951みたいなやつが出てくるとからかいたくなる。

>そのまとめて処理という発想をすてて、一つ一つ処理した方が確実。
ほうどうして?

>ただ一つ一つSelectして処理は駄目。
>Selectしない方法を身につけないと。
へえなんで?

971 :デフォルトの名無しさん:2009/07/12(日) 21:46:54
>>970は引っ込んだ方がいいんじゃねーの?
Selectしないなんてのはごく一般常識だ。

972 :デフォルトの名無しさん:2009/07/12(日) 21:52:03
>>969
質問が速さを求めてないんだから確実に動かない>>938は駄目だね。
ダブルクォーテーションの問題をクリアーしても255文字の制限で駄目なのは目に見えてる。


973 :デフォルトの名無しさん:2009/07/12(日) 22:03:17
>>971
Selectしたってちゃんとした結果が出るんならいいじゃない。
視野がせまいんじゃないの?

974 :デフォルトの名無しさん:2009/07/12(日) 22:06:28
まったく500連発級のアホがいるなw

975 :デフォルトの名無しさん:2009/07/12(日) 23:37:48
>>964
なんとなく試したら平均2秒もかかるコードしか組めなんだ。
しかも、各行の最大値は重複しないという条件で。

ところで、
>ちなみに=A1=MAX($A1:$CV1)の条件は不合格です。
は何故不合格なのか教えてもらえるとうれしい

976 :デフォルトの名無しさん:2009/07/13(月) 00:04:33
>>975
2秒だろうが10秒だろうが、手作業よりよほど速いんだから気にすんな。
Selectしようがしまいがちゃんと結果を出せるんなら実用上問題ない。

それよりも本当に最大値を間違いなく出せているのか?
それだけが重要だ。

977 :デフォルトの名無しさん:2009/07/13(月) 00:26:21
>>972
たとえば?

978 :デフォルトの名無しさん:2009/07/13(月) 08:40:05
UNIONがだめとか何言ってるの
複数のコード書いて質問者に選ばせればいいじゃん
自分のスタンスじゃないからって否定すんなよ

行選択ならrows()の組み合わせが使えるんじゃね

979 :デフォルトの名無しさん:2009/07/13(月) 10:56:58
>>977
たとえばもクソもねーよ。
255文字を超えると使えないような手法が使えるわけねーじゃん。
それこそ誰かがどこかで書いてた小売店レベルでしか使えねーな。

980 :デフォルトの名無しさん:2009/07/13(月) 11:13:42
>>975
もしかして1〜100の乱数書き込みを入れての時間?
そうじゃなかった少し古いパソコン?
Vista 2007 Core2Duo3.00GHzでおまいの書いたであろうコードを書いてみたら0.7秒だった。
重複対応のmatch使わないで配列ぶん回すやつはこれに0.1秒余計にかかるだけだった。
ちなみに普通にUnion使ったら20分だったw

981 :デフォルトの名無しさん:2009/07/13(月) 11:47:45
>>979
255文字を超えない文字数で何回かに分けて処理する方法はあるよ。
ただかなり複雑になるけど。

982 :デフォルトの名無しさん:2009/07/13(月) 12:18:52
>>980
20分てなんだそりゃw

983 :デフォルトの名無しさん:2009/07/13(月) 12:30:43
>>982
単純なUnionならそのくらいかかるよな。
>>960が書いてるとおりだ。

984 :デフォルトの名無しさん:2009/07/13(月) 12:55:21
>普通にUnion
がさっぱりわからん。

985 :デフォルトの名無しさん:2009/07/13(月) 13:26:54
>>984
Unionでも工夫すれば速くなるとかいう達人が前にいたからねぇ。
その工夫がめちゃめちゃ面倒で、俺みたいな凡人にはとても書けるものじゃなかったよ。
普通のUnionならたとえば下みたいなのじゃね?
Sub foo()
Dim r As Range, c As Range, u As Range, maxV As Double
With Application.WorksheetFunction
For Each r In Range("a1:cv10000").Rows
maxV = .Max(r)
For Each c In r.Cells
If c.Value = maxV Then
If u Is Nothing Then
Set u = c
Else
Set u = Union(u, c)
End If
End If
Next
Next
u.Interior.ColorIndex = 3
End Sub
これなら数十分かかるかもね。
配列やItemプロパティで工夫しても同じようにUnion使う限り似たような時間だろう。
>>975の重複なしのやつは多分下みたいなやつだろう。
With Application.WorksheetFunction
For Each r In Range("a1:cv10000").Rows
r.Cells(.Match(.Max(r), r, 0)).Interior.ColorIndex = 3
Next
End With

986 :デフォルトの名無しさん:2009/07/13(月) 17:03:04
エクセルに表示されている省略されているアドレスを
本来のアドレスに戻すことはできますか?

リンクの編集からリンク先のリンクがわかるのですが、
それをいちいちコピペで変換するのが大変なので。

987 :デフォルトの名無しさん:2009/07/13(月) 17:07:08
>>985
何がしたいのか知らんけど、バグってるよねそのコード

988 :デフォルトの名無しさん:2009/07/13(月) 18:26:57
>>986
マクロ使わないと無理
Range("A1").Hyperlinks(1).Address

989 :デフォルトの名無しさん:2009/07/13(月) 19:25:36
>>979
どうでもいいんだが、「小売店」の意味を勘違いしてる
まあお前が言い出したんじゃないかもしれないけど

990 :デフォルトの名無しさん:2009/07/13(月) 19:34:36
VBAだからどうでも良いって考える人が多いだろうけど、
プログラムをやるならば、他人がメンテする事も踏まえて可読性の高い、
一般的かつ美しいロジックの構文を心掛けるべきだな。

省略した方が一般的ならば省略すべきだし、
省略すると、動くけどマニアックならば省略すべきでは無い。

デフォルトプロパティの省略なんか分かりやすいかな。

991 :デフォルトの名無しさん:2009/07/13(月) 19:41:02
>>988
B列にあるアドレスということで
Range("B").Hyperlinks(1).Address
としてやってみたのですが、駄目でした。

マクロは

Sub リンク()

Range("B1").Hyperlinks(1).Address

End Sub

こんな感じになってます。最後のaddressってのが黄色く表示されます。

992 :デフォルトの名無しさん:2009/07/13(月) 19:50:24
>>990
誰への書きこ?

993 :デフォルトの名無しさん:2009/07/13(月) 20:05:40
>>990
そうだねぇ。
省略するのが一般的なものの一番はItemだな。
Set w =Worksheets.Item("Sheet1")とかやられるとかなりくどくて嫌味だな。

994 :デフォルトの名無しさん:2009/07/13(月) 20:09:20
>>987
End Withが抜けてるだけだな。
インデントつけりゃすぐわかることだ。



995 :デフォルトの名無しさん:2009/07/13(月) 20:46:53
Application.
とか普通つけないしな

996 :デフォルトの名無しさん:2009/07/13(月) 20:58:46
Microsoft Excel では、ワークシート上で =0^0 という数式を入力すると #NUM! というエラーを返すが、
同ソフトウェアに搭載されている VBA では1と定義されている。

997 :デフォルトの名無しさん:2009/07/13(月) 21:24:02
SelectしないのはSelectの省略とは言わんなぁ。
あれはつけないのが当たり前だからな。
つけたら可読性は最低レベルだ。

998 :デフォルトの名無しさん:2009/07/13(月) 21:27:25
>>996
VBAでは、0^0が1というより、n^0が1(nが負数なら-1)となる
算術演算的には0^0はエラーでいいんだが
論理演算的には1や-1になった方が都合がよいからな

999 :デフォルトの名無しさん:2009/07/13(月) 21:54:50
銀河鉄道

1000 :デフォルトの名無しさん:2009/07/13(月) 21:59:48
Windows

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

285 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)