Excel VBA質問スレ Part11
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/05/10(日) 01:05:30前スレ 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/
0002デフォルトの名無しさん
2009/05/10(日) 01:06:4101 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/
0003デフォルトの名無しさん
2009/05/10(日) 02:30:44当方一年授業で学んでオセロつくったくらいです
0004デフォルトの名無しさん
2009/05/10(日) 05:12:26VBAとは、『Visual Basic for Application』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★6 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★7 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
0005デフォルトの名無しさん
2009/05/10(日) 05:27:120006デフォルトの名無しさん
2009/05/10(日) 07:23:150007デフォルトの名無しさん
2009/05/10(日) 08:46:570008デフォルトの名無しさん
2009/05/10(日) 09:03:06ExcelVBAからADOを使ってmdbのデータを読む、なんてのは含まないんだね
0009デフォルトの名無しさん
2009/05/10(日) 09:20:46具体的なAPI詳細とかなら、専用スレに誘導すりゃ良いし。
0010デフォルトの名無しさん
2009/05/10(日) 19:54:55デバッグのステップインでF8を押して進めるとすべて問題なく処理が完了するのですが
マクロの実行でやると
実行時エラー424オブジェクトが必要です
という物が表示されてしまいます
何処の変数がオブジェクトにしないといけないとか判断する方法はないでしょうか?
0011デフォルトの名無しさん
2009/05/10(日) 22:15:31って表示された時に処理止まっているんじゃないの?
0012デフォルトの名無しさん
2009/05/10(日) 23:04:45実行でもたまに上手くいくんですが大半がエラー424になって
なんでデバックだと上手くいくのに実際だとエラーが出るんだろ、、、、と思いまして
0013デフォルトの名無しさん
2009/05/10(日) 23:27:43こまかいことは(ry
0014デフォルトの名無しさん
2009/05/10(日) 23:44:490015デフォルトの名無しさん
2009/05/11(月) 03:27:13相手の準備が出来たかどうか、データの取得が完了したかどうか
ちゃんとステータスチェックせずに次に進むと成功したり失敗したりするし、
F8連打だとそれだけで時間稼ぎになるから失敗しにくくなる。
0016デフォルトの名無しさん
2009/05/11(月) 04:58:31xxx.Value = yyy
または
yyy = xxx.Value
のxxxに問題あり?
0017デフォルトの名無しさん
2009/05/11(月) 07:31:15あるねぇ
>>15の通り、相手の準備が出来てないっての。通信に限らずオブジェクトの描画か何かでも起こった気がする
ループ使ってるならloopやnextの上の行辺りに
Sleep 100
とか入れて見ると解決した気がする
ループじゃなければちとわからん
0018デフォルトの名無しさん
2009/05/11(月) 10:23:340019デフォルトの名無しさん
2009/05/11(月) 10:46:030020デフォルトの名無しさん
2009/05/11(月) 10:46:06実行を40回ループさせても実行時エラー424オブジェクトが必要です
って表示されない、、、、
OFFICE2003が何か悪さしてるのかな、、、、
0021デフォルトの名無しさん
2009/05/11(月) 10:46:22どんな行で止まったかだけでも分からないと推測で答えるしかない
0022デフォルトの名無しさん
2009/05/11(月) 11:13:53はい昨日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オブジェクトを触ろうとすると出るということがわかりました
0023デフォルトの名無しさん
2009/05/11(月) 11:24:34うちはXPでOffice2000なんだけど・・・
Officeのバージョンとかは特に関係なくてIEが立ち上がりきっていない場合にそういうエラーでますよ。
自分はエラーハンドラで回避しているけどね。
0024デフォルトの名無しさん
2009/05/11(月) 12:40:48IE7だと重くて起動遅いとか
0025デフォルトの名無しさん
2009/05/11(月) 16:47:430026デフォルトの名無しさん
2009/05/11(月) 17:02:44ありがとうございます
エラーハンドラーっていうのがあるんですね
ちょっと調べてみようと思います
512MBのメモリのとき妙に424エラーとメモリ不足ですというのがでて
友人の2GBでは何もエラーをはかずに処理が終わる
1GB借りて512MB→1GBにしてみるとなぜか424エラーは出なくなった、、、、
気持ち悪いけどメモリ増やすと問題なく動くみたいです
0027デフォルトの名無しさん
2009/05/11(月) 17:13:16424はよく分からんがメモリ不足は後始末がちゃんとできてないと起こりやすいな
Set XXX = ○○と書いたらSet XXX = Nothing で開放しとかないとだめ
同じ変数にSetしなおしても上書きはされずにメモリを掴んだままになるらしい
やってるよな?
0028デフォルトの名無しさん
2009/05/11(月) 18:05:500029デフォルトの名無しさん
2009/05/11(月) 18:10:04グラフ等がアクティブになっているとプロパティ無しエラーになります。
On Error 以外で シートがアクティブになっているかどうかを判定する方法が
ありますでしょうか?
0030デフォルトの名無しさん
2009/05/11(月) 18:14:19そう思って書かないことが癖になると危ないと思うんだがw
っていうかあの時はマジでやばかった(謎
0031デフォルトの名無しさん
2009/05/11(月) 18:18:25TypeName(Selection)
でどうかな?
0032デフォルトの名無しさん
2009/05/11(月) 18:28:39素早い対応、有難うございます。
0033デフォルトの名無しさん
2009/05/11(月) 18:59:21確かに
Set IE = CreateObject("InternetExplorer.Application")
のあとに解放せずに
何十回もAccessYahoo(コード番号)で呼びまくってました
よくない癖は早めに直さないといけないですねありがとうございます
0034デフォルトの名無しさん
2009/05/11(月) 20:46:02Workbook.Open Filename:=URLで開くのは
どこが違うんだろうか
0035デフォルトの名無しさん
2009/05/11(月) 21:40:54非表示のIEがいっぱい残ってるんだろ
ttp://www.forest.impress.co.jp/article/2006/02/06/okiniiri.html
これで一覧してみな
0036デフォルトの名無しさん
2009/05/11(月) 21:52:38XP,Office2003で確認してみたのですが
2003はIE.quitをしなくても
自動的に消えてくれるようです
2000でも使う可能性があるのででIE.quitをAccessYahoo(コード番号)の最後に追加しました
ありがとうございます
IE.Quitはvisible をFalseにしたら不必要だと思ってました
0037デフォルトの名無しさん
2009/05/11(月) 22:12:19ウィンドウを閉じる(終了する)のと見えなくするのは違うぞ。
プロセスはちゃんと終わらせなきゃいけない。
0038デフォルトの名無しさん
2009/05/11(月) 22:24:47解放で自動的に消えてくれるかどうかは、officeやosのverより、
むしろieのverによると思うけど、うちのie8では消えないみたいよ
消えたかどうか何で確認してるの?
>>37
ieはプロセスに同居するから、インスタンス
0039デフォルトの名無しさん
2009/05/11(月) 22:57:57>>35さんが教えてくれたMenuBar.HTAで確認してみました
0040デフォルトの名無しさん
2009/05/12(火) 12:55:01やりたいと思っていることは
ログイン、画面推移までは自分でIEを立ち上げて手入力でして
チェックボックスやテキストボックスにはVBAの入力ボタンを押すと自動的に
入力されてsubmitし最終確認画面が出るようにしたいと思っています
現在IEで表示している画面の要素をIEオブジェクトに取り込むということはできるものでしょうか?
0041デフォルトの名無しさん
2009/05/12(火) 13:30:20SendKeysとか使うくらいしか思いつかんな
0042デフォルトの名無しさん
2009/05/12(火) 13:30:460043デフォルトの名無しさん
2009/05/12(火) 14:07:50なさそうですか、、、
最初からVBAでIE立ち上げて
ログインする際にID、PASSを入力待ちで手入力にして最終確認画面でmsgboxだして投稿するような方法の方が簡単そうですね
0044デフォルトの名無しさん
2009/05/12(火) 17:03:240045デフォルトの名無しさん
2009/05/12(火) 17:17:070046デフォルトの名無しさん
2009/05/12(火) 17:43:25できるかも!
参考までにソース挙げます。
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
0047デフォルトの名無しさん
2009/05/12(火) 17:55:250048デフォルトの名無しさん
2009/05/12(火) 21:28:22shell関数でIEを全画面サイズで開く処理を行うと、
会社のPCだと、どうしても全画面で開けません。
最小化でも開けず、ただ適当なサイズで開いてしまうんですが、
何かサイズ指定が不可能になる条件ってPC側にあるんでしょうか?
OSはXP、MSは2002です。
0049デフォルトの名無しさん
2009/05/12(火) 21:57:36Excel2003で、セルを右クリックして出るポップアップメニューに
独自メニューを加えたいのですが、最初のシートには
追加できたのですが(下参照)、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
0050デフォルトの名無しさん
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
0051デフォルトの名無しさん
2009/05/12(火) 22:36:02ie側の問題だと思う
iexplore -nohome
だと効くみたいだけど
0052デフォルトの名無しさん
2009/05/12(火) 22:50:59そうなんですか。。。
ありがとうございます。
0053デフォルトの名無しさん
2009/05/13(水) 12:54:29VbMsgBoxSetForegroundが最前面表示とあるので
MsgBox("確認", vbYesNo, vbMsgBoxSetForeground)
としてみたのですが
VBA実行→IEが立ち上がる→確認がIEの後ろに隠れてしまう
(奥からエクセル、確認msgbox、IEの順になってしまう)
VBA実行→IEが立ち上がる→確認がIEの手前で
奥からエクセル、IE、確認msgboxの順になるようにしたいと思っています
0054デフォルトの名無しさん
2009/05/13(水) 15:12:060055デフォルトの名無しさん
2009/05/13(水) 15:31:48APIでエクセルをアクティブにしてからメッセージボックスを出すとか
0056デフォルトの名無しさん
2009/05/13(水) 15:55:24VBAとは、『Visual Basic for Application』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
0057デフォルトの名無しさん
2009/05/13(水) 16:08:53vbSystemModal使うと「メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。」
だから都合悪いかもしれないと思ってAPI使うってアクティブにする案を出したんだが・・・
APIの使い方がわからないって言ってきたらググレカスとでも言っておくがなw
005857
2009/05/13(水) 16:10:07× API使うってアクティブにする
○ API使ってアクティブにする
0059デフォルトの名無しさん
2009/05/13(水) 16:36:250060デフォルトの名無しさん
2009/05/13(水) 19:39:10おかげでボタンが押せなくて操作不能になるアプリがたまにある。
0061デフォルトの名無しさん
2009/05/13(水) 21:37:14お返事ありがとう
その方法でもメニューが追加されるのは一枚目のシートだけ見たいです
具具っても見当たらないんですよね
0062デフォルトの名無しさん
2009/05/13(水) 23:07:23いま手元にExcelが無いのであれだが
' Set fBar = CommandBars("Worksheet Menu bar").CommandBars("Cell")
Set fBar = Application.CommandBars("Cell")
で どうかな?
0063デフォルトの名無しさん
2009/05/13(水) 23:13:16If Worksheets("Sheet1").Cells(1, 1).Font.ColorIndex <> 2 Then
MsgBox "color"
End If
みたいに書いているんですが、bookを作った最初の状態は、白ではなく、色が未設定の状態だと思うんですが。。。
0064デフォルトの名無しさん
2009/05/13(水) 23:16:580065デフォルトの名無しさん
2009/05/13(水) 23:19:21fontではなくInteriorです!
0066デフォルトの名無しさん
2009/05/13(水) 23:23:500でもxlColorIndexNoneでも同じって事ですか?
fontとInteriorはコピーする箇所を間違えました;
0067デフォルトの名無しさん
2009/05/13(水) 23:49:08Range("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
とかすると面白い?
0068デフォルトの名無しさん
2009/05/14(木) 01:13:520069デフォルトの名無しさん
2009/05/14(木) 12:35:39-4142
-4142
-4105
になったぞ by Excel97
0070デフォルトの名無しさん
2009/05/14(木) 19:53:45あと、VBAの設定で参照可能なライブラリファイルにチェックを入れとけばいいんですよね?
0071デフォルトの名無しさん
2009/05/16(土) 19:47:16って、要するにポインタのことですか?
0072デフォルトの名無しさん
2009/05/16(土) 20:27:270073デフォルトの名無しさん
2009/05/16(土) 20:34:09とりあえず、他の変数に代入してもオブジェクトそのものは
複製されない事だけ把握しとけばOK。
0074デフォルトの名無しさん
2009/05/16(土) 20:46:14やっぱり参照とポインタは微妙に違う
狭い意味だとポインタはアドレスのことだったりもするし
あとは実装次第だ
シートの行と列全てがアトランダムに塗りつぶされるはずなのですが、
実際にやってみても、全列の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
0077デフォルトの名無しさん
2009/05/17(日) 14:13:56Office2007で利用可能な桁数が大幅に増えた(16384?)のが理由。
桁数が最大256桁とか決めうちしていると、こういうことになる。
0078デフォルトの名無しさん
2009/05/17(日) 14:14:38が原因だね。
cells(row,column)
で指定しないと。
どうもありがとう
0080デフォルトの名無しさん
2009/05/18(月) 07:30:50VBAで他のアプリケーションを開くまでは色々ググって出来たんですが
そのアプリが閉じられたら、再びVBAに処理を戻したいんです。
今はファイル名のリストがフォーム上に有ってその名前で検索したファイルを開くという作業で一太郎やワード等を
ShellExecuteで開くというの作ったんですが
開いたファイルが閉じられたら更新日時を調べて変化が有れば書類の板番号を更新したいんですが
いつ閉じられたかも解らないし、ファイルを開いて処理が中断し閉じて再開すると言った事は不可能でしょうか?
0081デフォルトの名無しさん
2009/05/18(月) 09:09:25それはアプリの終了よりもファイルの更新を調べた方がいいのでは。
VBAで1秒間隔のタイマーをセットして、ファィルのタイムスタンプを1秒おきに調べるみたいな方法なら
すぐに思い付くけど。
0082デフォルトの名無しさん
2009/05/18(月) 12:00:46わかりました
それで行きます
0083デフォルトの名無しさん
2009/05/18(月) 13:17:190084デフォルトの名無しさん
2009/05/18(月) 13:20:120085デフォルトの名無しさん
2009/05/18(月) 14:53:02思い付かないんだもん
0086デフォルトの名無しさん
2009/05/18(月) 16:03:240087デフォルトの名無しさん
2009/05/18(月) 16:06:00dirname/fileb.ext
があったときに、".ext"に関連づけられているsomeapp.exeを起動したとき、
fileb.extもsomeapp.exeで更新している可能性があるので、
プロセスの終了を待ち合わせて、dirname/*を全検索して情報を更新するのが一番。
0088デフォルトの名無しさん
2009/05/18(月) 17:00:130089デフォルトの名無しさん
2009/05/18(月) 17:19:470090デフォルトの名無しさん
2009/05/18(月) 19:17:48もしそうでしたら、何らかの回避方法を教えていただきたいのですが・・・
0091デフォルトの名無しさん
2009/05/18(月) 20:21:340092デフォルトの名無しさん
2009/05/19(火) 11:12:20試して見ましたが
ファイルが開き終わるとwaitが終了し次の処理に移ってしまうようで上手くいきませんで
filepath="sample.txt"
CreateObject("WScript.Shell").Run FilePath, vbNormalFocus, True
MsgBox FilePath & "が閉じられました。", vbInformation Or vbSystemModal
これで済ませました お騒がせしました
0093デフォルトの名無しさん
2009/05/19(火) 12:11:15小数点下を含む剰余を返すようにしたいのですが、ワークシートのmodは演算子だから
application.mod()とは出来ない。
良い方法はありますでしょうか?
0094デフォルトの名無しさん
2009/05/19(火) 14:33:350096デフォルトの名無しさん
2009/05/19(火) 22:18:52だとどうだろう
0097デフォルトの名無しさん
2009/05/19(火) 22:45:170098デフォルトの名無しさん
2009/05/19(火) 22:52:54たばこを吸うバルタン星人ですよね???
0099デフォルトの名無しさん
2009/05/20(水) 15:37:42VBAを使って罫線ツールバーの「罫線を作成」機能(セルの枠線にそってクリック・ドラッグで罫線を引く)
と同じことをするのは可能でしょうか?
0100デフォルトの名無しさん
2009/05/20(水) 17:04:50罫線を引きたいセルを選んでVBA実行して罫線が引かれるっていうのならできるんじゃね
0101デフォルトの名無しさん
2009/05/20(水) 17:29:320102デフォルトの名無しさん
2009/05/20(水) 21:13:05XP、Excel2003です。
Excelファイルが2つある。1つは用語集ファイルと呼び、もう1つは作業ファイルと呼ぶ。
用語集ファイルには英単語とその対訳がリスト形式で保存されている。
作業ファイルには英文が書かれていて、知らない英単語が出てきたら用語集ファイルを検索して
その意味を調べる。
具体的には
1.作業ファイル中の検索したい単語を反転表示させる。
2.右クリックのショートカットメニューから、独自に追加した「単語を検索」をクリックする。
3.用語集ファイルに、1で選択した単語の検索結果が表示される。(Ctrl+Fでの検索と同じ表示結果)
※ただし、作業ファイルにはマクロは記述しない。
作業ファイルにはマクロは記述しないので2が無理かと思うのですが、代替案として
どのような方法を取ればいいでしょうか?(右クリックのショートカットメニューでなくてもいいので
とにかく作業ファイルにはマクロは記述せずに、3と同じ結果を得たいのです)
おおまかな手順でいいので、ヒントをお願いします。
0103デフォルトの名無しさん
2009/05/20(水) 21:26:280104102
2009/05/20(水) 21:49:38OKです。
personal.xlsが何なのか知らなかったので調べたのですが、どうやら自分の作ったマクロを
まとめておくエクセルファイルのようですね(初心者ですみません)。
つまり、最終的には作業ファイル・用語集ファイル・personal.xlsという3つのファイルで作業する
という認識で正しいですよね?
0105デフォルトの名無しさん
2009/05/20(水) 22:00:12その程度のユーザビリティなら、そのままCtrl+Fで良いじゃん。
わざわざマクロを組む必要性がわからん。
0107デフォルトの名無しさん
2009/05/21(木) 07:37:30別に分母が正数じゃなくてもそれでいいんじゃない?
むしろ分母が整数の必要があるのは>>96だな。
0108デフォルトの名無しさん
2009/05/21(木) 08:20:20= IF(COUNTIF(B:B,B4) >1, "重複","")
この関数でE4という条件をB列全てに適応できたらと
思っています。この関数ではB4のセルの内容が
他と重複してるかいないかのチェックだけになります。
B4セル エクセル
B5セル ワード
このような場合エクセルとワードという単語がB列で
重複してるかいないかのチェックになります。
0109デフォルトの名無しさん
2009/05/21(木) 09:31:140110デフォルトの名無しさん
2009/05/21(木) 11:00:140111デフォルトの名無しさん
2009/05/21(木) 20:18:50Cells(r + 1, 4).FormulaArray = "=SumIf($O1:$O500,cells(r,3),#K1:$K500)"
エラーになってしまうのは、検索条件がおかしい?
(rはFOR〜Nextさせています)
0112デフォルトの名無しさん
2009/05/21(木) 20:32:100113デフォルトの名無しさん
2009/05/21(木) 20:43:27何で文字列に変数名が入ってるんだ。
” ”で囲まれた中は文字列だから、rは文字のrでしか無い。
てか、SUMIFなんて使わずにVBAで構文書いた方がずっと楽だよ。
0114デフォルトの名無しさん
2009/05/21(木) 21:28:23Cells(r + 1, 4).FormulaArray = "=SUMIF($O1:$O500," & Cells(r, 3) & ",#K1:$K500)"
0115デフォルトの名無しさん
2009/05/22(金) 01:11:16そんなのはピボットでやれよ。
#は$の間違いか?
0116デフォルトの名無しさん
2009/05/22(金) 08:13:03for文使ってるって言ってるんだからVBA使ってるいるんじゃないのか?
0117デフォルトの名無しさん
2009/05/22(金) 11:29:40☆VBAはVisual BASIC For Applicationsの略だとされており、Visual BASIC
Visual BASIC .NET VBScrptとは文法が異なる言語です。(ただし共通性は
概して高いです。)
☆制限はそれなりにありますが多くのVBA環境からもWindowsの共通ライブラリ
を利用することが出来ます。(但しそれぞれのライブラリの個性に応
じた、専門知識は必須ですがそれが公開されている(=入手可能)とは限りま
せん)
☆このスレではVBAを用いてExcelがインストールされている
Windowsマシンでは、原則としてはプログラム言語の種類によらずに
使用可能なライブラリ「Excel オブジェクト」の公開部分の操作をし
て目的の結果を得る(※)手段を考案する状況で発生した疑問、質問に対して
有志が答えるスレッドだと考えられます。Excelに付属のVBAエディター
を使用してプログラミングを行っているという状況はまさにこの
状況になりますし、その状況以外で発生したものはスレ違いになる可能性
が濃厚です。
(※)この手段が邪道でExcel道に根本的に反するという意見も貴重
です。Excelは一元的かつ算術的な処理の為のソフトウェアであり、多元的
かつ手続き的な処理には向かないという考えに基づくものです。
本来VBAがもっとも効率的に活躍するのはAccess環境であるという考え方
を取りたいものです。
0118デフォルトの名無しさん
2009/05/22(金) 11:51:39そもそも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が言うようにおそらくピボットテーブルでできることだろうけどな。
0119デフォルトの名無しさん
2009/05/22(金) 11:52:34だった。
0120デフォルトの名無しさん
2009/05/22(金) 12:15:10回答者側はその物言いで理解できるだろうけど
質問者側はそれじゃ理解できない奴多いだろうな
0121デフォルトの名無しさん
2009/05/22(金) 13:32:03教えるのは重要
0122デフォルトの名無しさん
2009/05/22(金) 13:40:44自分は4月から勉強し始めたけど、やってもやっても、
分からないことや、知らなかったことが出てきてゴールが見えてこない。
0123デフォルトの名無しさん
2009/05/22(金) 13:48:573日くらいで何でもできるようになるのが頭の良い人
0124デフォルトの名無しさん
2009/05/22(金) 14:18:55わからなかったら人に聞いてもいいし
本人に作る気があればプログラムなんかいくらでも作れるだろ
0125デフォルトの名無しさん
2009/05/22(金) 14:31:46・言語体系を覚えるまで3か月
・VBAで出来る事、向いてる事かが分かるまで更に3か月
・調べながら自分で作れるようになるまで更に3か月
って感じで、かなり時間が掛かった記憶がある。
VBから始める人ならそれこそ3日で出来るとかあるだろうけど、
それ以外の言語からだときちいわ。
未だに分からん事の方が多い。
プログラムやったこと無い人だったら、変数って何?配列って何?
って事から始まるんだし、もっと時間かかるんでないか?
0126デフォルトの名無しさん
2009/05/22(金) 14:34:590127デフォルトの名無しさん
2009/05/22(金) 14:36:41出来るよ!って人でもその時々で調べながらプログラム組んでるものです。
暗記する必要もないし、調べながらでも出来れば問題ない。
大体、使うものって限られてるし、それが出来れば十分なわけです。
0128デフォルトの名無しさん
2009/05/22(金) 15:05:05ECMAってJavaScriptだろ?
そりゃきちいわ。同じ系統でもVBScriptからだと
だいぶ違うと思うがどうかな。
だがVBA自体はかなりしっかりした
言語なんで半年以上かけて勉強したことに
ついて損はしてないね。
0129デフォルトの名無しさん
2009/05/22(金) 17:25:31Excel2007
での質問です。
今まで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できませんでした。
原因と対処がわからないのですが、どのように改善したら良いでしょうか?
0130デフォルトの名無しさん
2009/05/22(金) 17:37:420131デフォルトの名無しさん
2009/05/22(金) 18:15:34大元のファイルをxlsmで保存しなおして、VBAの中もxlsmにすればいいんですね。
0132デフォルトの名無しさん
2009/05/22(金) 19:17:20目的があれば、すぐに覚えられる
事務作業の自動化のために
表への入力、印刷設定→印刷の自動化、ファイルを正規化させたり、シートを一度に何個も作る・・
等の作業をマクロの記録。そして改変。後はifやforを覚えたかな
プログラムへのとっかかりとして、マクロの記録はとんでもなく優秀だと思うわ
プロシージャやメソッド、その概念すら覚えて無くてもとりあえず動くマクロが作れるってところがね
0133デフォルトの名無しさん
2009/05/22(金) 19:48:19確かに暗記しなくても書けるには書けるが、せめて
宣言系、制御系、演算子くらいは最低限暗記しないと、とても実用にはならないよ
まあこのへんはまともなコード書けば必ず使う物だから、意識して覚えようとしなくても
すぐに暗記しちゃうとは思うが
0134デフォルトの名無しさん
2009/05/22(金) 20:11:36やりたいことが明確になればすぐにできるようになると思うよ
わからないことが出たら調べてそれでもわからなければここで聞けばみんなが教えてくれるし
参考書読んでてもあまりできるようにはならないかな
まず簡単な
A1の値をA3にコピーするから
A1の値をSHEET1のA3にコピーしてみる
さらにA1の値を別BOOKのSHEET1のA3にコピーしてみる
と言ったように自分でいろいろ弄って遊ぶような感覚でやっていかないと
覚えが悪いと思う
0135デフォルトの名無しさん
2009/05/22(金) 21:22:23ドロップダウンリストなどを項目を選択して実行するということは可能でしょうか?
例えば書式設定ツールバーのフォントを選択するリストでMS明朝を選んで実行、というようなことです。
普通のボタンをExecuteで実行するやり方は分かったんですが、リストの場合はどうすれば…
0136デフォルト名無しさん
2009/05/22(金) 22:46:56ttp://www.hasimoto999.aki.gs/img-box/img/5764.jpg
ttp://www.hasimoto999.aki.gs/img-box/img/5765.jpg
が、5時間近く考えてもわからない
簡単過ぎる問題かもしれないけど、ご教授頼むorz
ちなみに19の1は解けてる。
0137デフォルトの名無しさん
2009/05/22(金) 22:50:05> ★7 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
> コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
> ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
0138デフォルトの名無しさん
2009/05/22(金) 22:55:09そんなピラミッドを描いて何になる?
って解答欄に書いて、相手にたたきつけろ!
0139デフォルトの名無しさん
2009/05/22(金) 22:58:130140デフォルトの名無しさん
2009/05/22(金) 23:10:41やるだけ時間の無駄な問題だな
0141デフォルトの名無しさん
2009/05/22(金) 23:24:46代入していない、宣言していない変数へアクセスしたときにエラーを出すにはどうすればいいですか?
Option Explicitを指定すると 代入は検知できるんですが
宣言してない変数を読み出しても、Empty値が返ってくるだけで
そのまま実行されてしまいます。
0142デフォルトの名無しさん
2009/05/22(金) 23:29:09また、エラーが発生した箇所を調べることは出来ないのでしょうか?
たとえば、オブジェクトをSetを使用しないで代入すると
「実行時エラー'91' オブジェクト変数またはWith(ry」と例外が発生して、ダイアログが出ますが
この例外が発生した箇所を調べることは出来ないのでしょうか?
現在は地道にステップインでエラーが発生するまで追っていますが
なんだかばからしくてやってられません。
また、例外構文もN88BASICを思い出させる、On Error〜割り込みしか無いのでしょうか?
よくある、try〜finally 〜catch(Exception e) というような構文はないんですか?
0143デフォルトの名無しさん
2009/05/22(金) 23:30:44>なんだかばからしくてやってられません
それが自分の資質を示しているねw
0144デフォルトの名無しさん
2009/05/22(金) 23:34:47辛口な事言うけど、論理的思考が全く出来てないでしょ。
ただ答えだけ貰ったって何も役に立たんのでは?
単位もらえりゃ良いって事なのかもしれんけどさ。
for i = 1 to 9
0145デフォルトの名無しさん
2009/05/22(金) 23:36:34途中送信しちまった。
for i = 1 to 9
for j = 1 to 9
cells(i,j).value = i*j
next
next
つーか、こんな問題も解けない生徒がいるのに良く授業だなんて言えるわな。
0146デフォルトの名無しさん
2009/05/22(金) 23:38:30エラー吐いた部分で黄色く反転して中断されないか?
0147デフォルトの名無しさん
2009/05/22(金) 23:43:47二重ループは最後に空ループでも置いとけばいい。
Range("A2")=1
Range("A3")=2
Range("A4")=3
Range("A5")=4
:
以下略
ちなみに、文句言ってるやつは全科目100点だったのかな?
宿題を誰かに写させて貰ったこともないのかな?
学校なんてこんなもんだよ。まじめに考えすぎ。
0148デフォルトの名無しさん
2009/05/22(金) 23:45:22そうやって結局教えちゃうから育たないんでしょ
0149デフォルトの名無しさん
2009/05/22(金) 23:46:100150デフォルトの名無しさん
2009/05/22(金) 23:46:29論点のすり替え
ここは宿題教えるスレじゃない
0151デフォルトの名無しさん
2009/05/22(金) 23:46:55世の中、要領と運のいいやつが一番トクをする。
0152デフォルトの名無しさん
2009/05/22(金) 23:47:59指定された整数が129以上だと、その時点でオーバーフローだな。2003までは。
do untilで指定の数までインクリメントして、
do untilで1になるまでデクリメントして、
積み重ねる部分を関数化するのが楽だと思ってしまた。
0153デフォルトの名無しさん
2009/05/22(金) 23:48:42それ以前に、こんな問題、読んで1分で分からなきゃモノにはならないよ。
0154デフォルトの名無しさん
2009/05/22(金) 23:51:57やっぱ学校なんて気楽なもんだね。
この程度の問題が100点でした!VBA出来ます!!
って入ってくる新人がいるって事の方が怖い。
0155デフォルトの名無しさん
2009/05/23(土) 00:12:01簡単なプログラミングの問題が出た。
少なくとも生徒の99.9%はプログラマーなんて目指してなかったし
宿題なんてほぼ全員が誰かのノートを丸写ししてた。
0156デフォルトの名無しさん
2009/05/23(土) 00:13:090157デフォルトの名無しさん
2009/05/23(土) 00:22:59SEにはならなかったけど、今の職場でVBAが扱えることで重宝してもらえてる。てかSEにならんでよかった、なったら埋没してたろうから。
0158デフォルトの名無しさん
2009/05/23(土) 00:27:04自分より優秀な奴が集まる集団で働くよりも、自分が一番の集団で働く方が、
大事に扱われるし、自尊心も満たされるしなw
給料3万円しか違わないなら、俺は後者を選ぶ。
0159デフォルトの名無しさん
2009/05/23(土) 00:33:36「鶏口となるも牛後となる勿れ」ってね
0160デフォルトの名無しさん
2009/05/23(土) 00:35:14出る杭は打たれる、という諺もあるしな。
0161デフォルトの名無しさん
2009/05/23(土) 00:40:20なんか面倒な作業を押しつけられそうだし。
今の年収で満足してるし、課長とか部長にもなりたくないし。
最低限の生活が出来ればいいや。
0162デフォルトの名無しさん
2009/05/23(土) 00:45:58現実的にありそうな問題は分かるまで自分で考えるのが理想だが、そんなことで単位落としたりしてはそれはそれで問題だろう
実際現場ではネット使い放題、上司に質問し放題なんだし
かと言ってそれに頼りすぎて成長しないのも困るんだけどね
でもそれが仕事がすすまないのも困るんだけどね
0163デフォルトの名無しさん
2009/05/23(土) 03:26:21構文チェック時・コンパイル時に分かることなのに
実行しないと分からない。しかも100行を超えるコードをウォッチ式で変数を監視しつつ、ステップ実行するというのは
明らかに効率が悪く、方法を見直す必要があるため、質問しました。
>>146
されません。 例外が発生すると、OKとHELPしか選択肢のないダイアログが出るだけです。
もちろん、ブレークポイントを設定したり、ステップ実行したり、Escキーで停止したときには
実行中の行が黄色く表示されますが。
書き忘れていましたが、
Office 2007 EEで保存形式は2007+マクロ(xlsm)です。
0164デフォルトの名無しさん
2009/05/23(土) 04:16:07うそつき
ttp://windyakin.if.land.to/src/up38_1232.png
0165デフォルトの名無しさん
2009/05/23(土) 13:42:35私の環境では
http://windyakin.if.land.to/src/up38_1233.png
こうなりますよ。
やはり何かデバッグオプションが足りないのかもしれません。
プロジェクトのプロパティに「条件付きコンパイル引数」という項目があるんですが
そこの所が空欄なのが問題なのかもしれません
が、オフラインヘルプを見ても
http://windyakin.if.land.to/src/up38_1234.png というようになんか壊れてますし・・・
オンラインヘルプじゃないのでそのまま凸することも出来ません
MSDNの.netリファレンスが不親切だと思ったことはないですが
このVBEに付属するリファレンスは何かと不親切ですね。列挙子が何を意味するのかも省略されてますし、ひどいものです。
翻訳作業が間に合っていないならせめて原文を載せてほしいところです。
0166デフォルトの名無しさん
2009/05/23(土) 13:52:14もしなんだったら、MSDNの原文読めばいいんじゃない?
0167デフォルトの名無しさん
2009/05/23(土) 15:21:26条件付きコンパイル引数のとこはうちでも空欄
ヘルプも同じ所が同じようにおかしい
0168デフォルトの名無しさん
2009/05/23(土) 15:25:33ttp://windyakin.if.land.to/src/up38_1235.png
0169デフォルトの名無しさん
2009/05/23(土) 15:35:28ツール→マクロをみてもグレーアウトされた状態で実行できません。
0170デフォルトの名無しさん
2009/05/23(土) 18:22:20今更だが今初めて質問みたのでピラミッドのヒントだけ
1,3,5,7,9と増えていくから必要な”■"は段数*2-1必要。
ループは後ろから回せばよい。
あとはCellsとかResizeとか好みでOffsetとか。
0171デフォルトの名無しさん
2009/05/23(土) 18:26:010172デフォルトの名無しさん
2009/05/23(土) 19:06:30For i=1 To height
For j=1 To height*2-1
Cells(i,j)=IIf(i>Abs(height-j),"■","")
Next
Next
0173デフォルトの名無しさん
2009/05/23(土) 20:33:33ふつうに数学的に考えるなら
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]までで上記の式を積分すれば分かる。
0174デフォルトの名無しさん
2009/05/23(土) 20:38:210176デフォルトの名無しさん
2009/05/23(土) 21:26:27For 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
0177デフォルトの名無しさん
2009/05/23(土) 22:03:49union使いたかっただけじゃないのかと。
0178デフォルトの名無しさん
2009/05/24(日) 03:18:300179デフォルトの名無しさん
2009/05/24(日) 03:46:10[A1].Resize(Height, 2 * Height + 1).Formula = "=IF((ROW()+COLUMN()>" & Height & ")*(COLUMN()-ROW()<" & Height & "),""■"","""")"
0180デフォルトの名無しさん
2009/05/24(日) 03:56:070181デフォルトの名無しさん
2009/05/24(日) 08:15:08ちれすだが、win32 apiを使用すれば可能。
enumwindows等でハンドル取得、sendmessageでコマンド送信する。
概してvbaでやるもんではない。
それよりも自前機能内なら、font選んで使った方が早くないか?
知らんけど。
0182デフォルトの名無しさん
2009/05/24(日) 14:09:19Application.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 明朝"
とすればちゃんと補完リストにも出てくる
0183135
2009/05/24(日) 15:54:03ありがとうございます。実際には罫線ツールバー上にある「罫線の作成」「罫線グリッドを作成」の
線スタイルと線の色を選択したかったんです。
とりあえず罫線の作成を使うのはあきらめて、Bordersで選択セルに線引くマクロ作って代用しました。
0184デフォルトの名無しさん
2009/05/25(月) 21:57:57ユーザーフォーム上のコンボボックスでリストの中から
選択すると、その文字が全選択された状態になります。
これを解除してカーソルの状態にするにはどう記述す
ればいいのでしょう?
0185デフォルトの名無しさん
2009/05/26(火) 05:25:550186デフォルトの名無しさん
2009/05/26(火) 08:31:22ありがとうございました。
0187デフォルトの名無しさん
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
0188デフォルトの名無しさん
2009/05/26(火) 19:07:03Sub 条件判断()
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
0189デフォルトの名無しさん
2009/05/26(火) 19:28:32ありがとうございます。
>>186 の式だと、ElseIf の文が評価されずに終わるから、ダメ。
という理由で合ってますか?
0190デフォルトの名無しさん
2009/05/26(火) 19:30:32訂正です
186 ではなくて、 >>187でした。
すみません。
0191デフォルトの名無しさん
2009/05/26(火) 19:40:50If 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
0192デフォルトの名無しさん
2009/05/26(火) 22:06:07そして判り難い書き方の例。
Range("b1").Value = Choose(1-(i>=90)-(i>=75),"不合格","合格","優秀")
0193デフォルトの名無しさん
2009/05/26(火) 22:17:260194デフォルトの名無しさん
2009/05/26(火) 22:21:17その方がどちらが分かりやすいか「分かりやすい」だろう
0195デフォルトの名無しさん
2009/05/26(火) 22:23:17If i >= 90 Then
優秀
Else
If i >= 75 Then
合格
Else
不合格
End If
End If
0196デフォルトの名無しさん
2009/05/26(火) 22:24:00たとえばExcelで
Z11に文字が値が入力されていたらA1〜Z11を全選択
A40000に文字が値が入力されていたらA1〜A40000を全選択する文を記述したいのですが
これってどうすればいいのでしょうか?
0197デフォルトの名無しさん
2009/05/26(火) 22:34:12うーん・・マクロの記録で
ctrl+end
と同じってこと?
0198デフォルトの名無しさん
2009/05/26(火) 22:44:380199デフォルトの名無しさん
2009/05/26(火) 22:44:39あるルートフォルダから、以下何階層に渡ってフォルダが作られているかは不明で、
指定した文字を含むファイルをルート以下から探して、返したいんだが。。。
全てを探して、名前を含むリストを作りたいんだよね。
0200デフォルトの名無しさん
2009/05/26(火) 22:49:33Office2007で廃止する気満々だったので。
0201デフォルトの名無しさん
2009/05/26(火) 22:55:02今はまだひよっこだが、いずれ大鷲となって羽ばたいた時
おまえら大鷲先生と呼べよ。
0202デフォルトの名無しさん
2009/05/26(火) 23:00:540203デフォルトの名無しさん
2009/05/26(火) 23:01:46俺は配列で飽きてC言語やってるわ
0204デフォルトの名無しさん
2009/05/26(火) 23:03:22そのマクロどっかで配布されてた。
0205デフォルトの名無しさん
2009/05/26(火) 23:11:21Dir関数とかの話がでてくるよ
0206デフォルトの名無しさん
2009/05/26(火) 23:47:160207デフォルトの名無しさん
2009/05/27(水) 00:06:070208デフォルトの名無しさん
2009/05/27(水) 00:12:10Functionプロシージャに渡したい引数が多い場合、構造体を作って
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の中身が書き換えられる恐れはありますよね?
構造体を渡すけれども、値渡しとして使うという明示的な方法はあるのでしょうか?
宜しくお願いします。
0209デフォルトの名無しさん
2009/05/27(水) 07:41:08基本的には無い。やるとしたら以下の3つかな?
�@コーディングルール徹底(コメントを残して従う、関数名 etc)
�A予め構造体をコピーしておく
�B構造体ではなく、必要データだけ渡す
もしかして、byval渡しなら出来たりして。
けど、VBAに限らず上の3つは基本だと思う。
0210デフォルトの名無しさん
2009/05/27(水) 20:37:100211デフォルトの名無しさん
2009/05/27(水) 20:52:04スレ違い>>4★5★6
0212デフォルトの名無しさん
2009/05/27(水) 22:04:46dictionary使う。
0213デフォルトの名無しさん
2009/05/27(水) 22:09:440214デフォルトの名無しさん
2009/05/28(木) 03:34:49ワークシートに並べてフィルタかける
0215デフォルトの名無しさん
2009/05/28(木) 09:01:13オートフィルタとかワークシート関数とかを如何に活用するかが
ExcelVBAの醍醐味
0216デフォルトの名無しさん
2009/05/28(木) 18:33:58そうだね。
となりに=COUNTIF($A$1:A1,A1)が1になってるとことか、=MATCH(A1,A:A,0)=ROW()がTRUEになってるとこをオートフィルターにかけりゃいいもんな。
0217デフォルトの名無しさん
2009/05/28(木) 19:25:09既に存在する配列からの削除って事は
フィルタかけるくらいなら取り込み時点で排除する方法を採っているだろうと予想できるわけで
CreateObject(Scripting.Dictionary)はこれ自体の機能はスマートだけど
結局配列に戻さないといけないから実用レベルで組み込むとコードが鬱陶しいんだよね。
なんか実務家ならではの回答ってないの?おまえら
0218デフォルトの名無しさん
2009/05/28(木) 19:32:50重複判定を積んだ配列に放り込めば良いじゃない。
配列を複数持つ事を嫌うならば、クイックソートで配列を並び替えて、
重複した場合に削除すりゃ良い。
これはワークシートでやってる事と一緒だけどね。
個人的には、作業用配列を作る事に違和感を感じないんで、
別配列に重複判定しながら放り込むけどな。
0219217(210)
2009/05/28(木) 19:48:25まず「配列に重複判定を積む」ってどうやるんですか?
それから、配列から配列を作ろうとする場合、まず二重ループでの処理を思いつくけど
配列を二重ループ内に組み込むとエラーが出ちゃいますよね。
これ、どうやって回避、あるいはどんな他の方法を採ってますか?
0220デフォルトの名無しさん
2009/05/28(木) 20:02:41別の2次元配列なら重複判定しながら放り込んだ方がいいけどな。
0221デフォルトの名無しさん
2009/05/28(木) 20:25:200222デフォルトの名無しさん
2009/05/28(木) 20:53:30データによるね。
あまりにも多いとCollectionに負けるし、クイックソートして詰める手法にも負ける。
0223デフォルトの名無しさん
2009/05/28(木) 21:09:02論理的思考を養う段階のレベルならば、Dictionaryを避けて配列使った方が良いかもなぁ。
でも、pushがデフォルトで搭載されてない言語だから、ステップ数増えるよね。
Dictionaryでもいいかな・・・とも思う。難しいのぉ。
これを機会にクイックソート覚えるのもいいかもね。
0224デフォルトの名無しさん
2009/05/28(木) 21:19:370225デフォルトの名無しさん
2009/05/28(木) 21:22:06猫も杓子もCreateObject(Scripting.Dictionaryを見るとうんざり。
0226デフォルトの名無しさん
2009/05/28(木) 21:26:35スレ違いだからコードそのものは伏せるけど、重複削除の汎用関数作って、
それに放り込むだけだろ
ワークシートの機能とかScripting.Dictionaryとか使えない言語でも
この手の処理は必要になるから、ちゃんといくつかのアルゴリズムが確立されている
ソートみたいに、計算量、必要バッファ量、順序の維持(ソートで言うところの安定ソート)など
それぞれ特徴があるから、必要なアルゴリズムを必要な言語に書き換えて用意して
おけば良いだけの話
0227デフォルトの名無しさん
2009/05/28(木) 21:31:06それがどれなのか分からないから教えてくださいって話じゃね
教えてくださいよ先輩
0228デフォルトの名無しさん
2009/05/28(木) 21:32:39どっかで見て俺も試したら笑ってしまった。
重複してないものまで削除することあるんだもんな。
0229217(210)
2009/05/28(木) 21:33:53>重複削除の汎用関数作って
理想としてはこれでやりたいんだけど、
Functionとの間での配列の引渡し方・受け入れ方が分からないんですよ…
0230デフォルトの名無しさん
2009/05/28(木) 22:11:21もう総当たりでやれよ。関数化は後の話だ。
関数化するにも、自前でルーチン作成出来なきゃダメなんだしさ。
forで 配列1 から 配列2 に全要素をコピーするだけだ。
その時に、配列2に対象の要素が含まれていない時って条件付けるだけ。
総当たりでやるのが論理的には一番理解しやすい。
先ずはここから入って、処理速度や負荷の問題が見えてきたら、
その状況に応じて別のルーチンを考えれば良いと思うよ。
0231デフォルトの名無しさん
2009/05/29(金) 09:41:11使える雰囲気が全然無いんだが、2010では.netのサポートがあるかな?
次期Officeにはほかの言語もサポートしてもらえるとうれしいな。
0232デフォルトの名無しさん
2009/05/29(金) 10:02:32コマンドボタンを押すとへこんだままになってしまいます。
処理は正しく実行されて、もう一度押すとまた処理が実行された後に元に戻ります。
使う上で問題は無いのですが、直したいです。
設定が悪いのでしょうか?
0233デフォルトの名無しさん
2009/05/29(金) 10:08:250234デフォルトの名無しさん
2009/05/29(金) 10:15:42確認したら処理は最後まで実行されていたんですが、
見た目だけだと処理がフリーズして止まっている様な感じになります。
0235デフォルトの名無しさん
2009/05/29(金) 10:27:16今あるボタンを消して新しく作ってみたら直りました。
0236デフォルトの名無しさん
2009/05/29(金) 10:38:56グラフィックは全く同じだし、押し下げでも上げ戻しでもClickイベント発生するし
0237デフォルトの名無しさん
2009/05/29(金) 14:18:22VSTO使えば.netFrameworkの恩恵をフルに享受することができる。
あまり流行ってないけどね。
0238デフォルトの名無しさん
2009/05/29(金) 17:50:30YYYYMMDDhhmmssにしたいのですが、
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)
もっと適当な命令や定番テクニックってないですか?
0239デフォルトの名無しさん
2009/05/29(金) 18:30:47=Format(Now,"YYYYMMDDHHMMSS")
0240238
2009/05/29(金) 18:39:35ありがとうございました(ペコリ
0241デフォルトの名無しさん
2009/05/29(金) 18:43:43という経験があったら教えていただきたいのですが。。
0242デフォルトの名無しさん
2009/05/29(金) 18:59:160243デフォルトの名無しさん
2009/05/29(金) 20:22:10・古いファイルの正規化
・プリンタの変更→印刷→プリンタの変更、をボタン一つで出来るようになったこと
・他人に作ったシートには関数を入れず、ボタンを押して計算させるようにしたこと(何度言っても計算式の入ってるセルに上書きするアホウがいる為)
・ファイル名の一部をシート名にする、等
・彼女は出来・・ねーよwただ仕事上、仲良くなるきっかけにはなったかもしれない
他細かいことは色々あるけど、とにかくまぁ色々便利。特に中小企業でマクロ使えればかなり便利じゃないかな
逆に大企業だと使う場面が無いかと。VBA無しのアクセスの方がよっぽど使う機会が多かった
0244デフォルトの名無しさん
2009/05/29(金) 20:29:39Excelのマクロとか、セキュリティ云々でうるさいからあまり使わないなぁ。
0245デフォルトの名無しさん
2009/05/29(金) 20:56:05VBAのおかげで持病が治りました
0246デフォルトの名無しさん
2009/05/29(金) 20:56:47Dim hoge As Range
If (hoge Is Nothing) Or (hoge.Value = 0) Then
Exit Sub
End If
End hoge
なぜかエラー出る@2007
0247デフォルトの名無しさん
2009/05/29(金) 21:00:25Sub 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
0248デフォルトの名無しさん
2009/05/29(金) 22:32:13hogeに値を代入してないのは、値を読み出そうとしたときにエラーを起こさせるためだよ。
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
と分けて書くしかないかな?
0249デフォルトの名無しさん
2009/05/29(金) 22:48:53Select Case True
Case hoge Is Nothing, hoge.Value = 0
Exit Sub
End Select
0250246
2009/05/29(金) 23:31:58おお、それだ。
Select Case Trueとか、なんて変態的なんだw
Delphiのcase Integer of (Cのunionと同義)を思い出させるぜ。
なんかトリッキーすぎて分かりにくいなあ。VBAではこういう書き方って一般的なの?
それとも、Ifを連ねて書く方が一般的?
0251デフォルトの名無しさん
2009/05/29(金) 23:53:180252デフォルトの名無しさん
2009/05/30(土) 00:39:40VBAではごく一般的だと思うけどな。
0253デフォルトの名無しさん
2009/05/30(土) 00:55:27向いてないと思う。
0254デフォルトの名無しさん
2009/05/30(土) 00:55:38マクロ自体は自宅の2003で組んでいます。OSはどちらもXPです。
D2とA5のセルにそれぞれ値が入っているときに、D5のセル位置を取得する方法ってありませんか?
Ctrl+Endで移動する位置を取得したいのです。
ActiveSheet.UsedRangeでいけるかなと思ったのですが、セルが飛び飛びで利用されている場合だと
うまく機能しないときがあるようです。
0255デフォルトの名無しさん
2009/05/30(土) 01:00:33http://www.niji.or.jp/home/toru/notes/8.html
0256デフォルトの名無しさん
2009/05/30(土) 07:39:32SQL Server とのやり取りが多いから、使わないと仕事にならねぇ
検索結果をExcelにはくことが多いから
#数万行出す場合、他アプリから出力すると遅さに耐えられないw
テキスト取り込んで簡単な集計する場合とか、ボタン一発のほうが楽じゃね?
#簡単じゃない集計はDBに入れてから処理する
worksheet関数を鬼のように駆使する人は、ある意味すごいと思うけど
VBA使ったほうが、楽になるのに・・と思う場合が多い
後でメンテする場合、Cellを延々と追いかけるの、めんどくないかなと思うんだわ
#いや、自分はめんどくさがりや だから
#まぁ コード書くのが本職なんだけどねw
0257デフォルトの名無しさん
2009/05/30(土) 07:49:05コメントが書けないのがワークシート関数の欠点かな
関数一発でいきなり動いて結果が出る手軽さとどっちを取るかだね
0258デフォルトの名無しさん
2009/05/30(土) 08:56:420259デフォルトの名無しさん
2009/05/30(土) 09:19:010260デフォルトの名無しさん
2009/05/30(土) 21:29:03選択したセルのある行に一時的に色をつける処理を考えてるんですが
Private SubWorksheet_SelectionChange(ByVal Target As Range)
0261デフォルトの名無しさん
2009/05/30(土) 21:34:59行がたくさんあってゴチャゴチャしてるシートの視認性を良くするために
選択したセルのある行全体に一時的に色をつけようと考えてるんですが
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Rows(ActiveCell.Row).Interior.ColorIndex = 37
End Sub
でとりあえず色はつけられたものの
カーソルを移動した後もその行は色がついたままになってしまうので
どうにか消せないものかと考えてるんですが、何か方法はありませんでしょうか?
0262デフォルトの名無しさん
2009/05/30(土) 21:52:08Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Cells.Interior.ColorIndex = xlNone
Rows(ActiveCell.Row).Interior.ColorIndex = 37
End Sub
但し、行強調以外の色つけも全部消えるからね
それじゃ困るというならあとは自分で工夫しな
0263デフォルトの名無しさん
2009/05/30(土) 21:57:040264デフォルトの名無しさん
2009/05/30(土) 21:59:14色をつける前に全消ししてしまえばいいんですね
色をつけたあとに前に選択していた行だけを消そうと考えていたせいで思いつきませんでした
ありがとうございます
0265デフォルトの名無しさん
2009/05/30(土) 23:54:290266デフォルトの名無しさん
2009/05/31(日) 00:01:11ダッセw
0267デフォルトの名無しさん
2009/05/31(日) 08:07:29実際にやってみると分かるけど、すげー重いぞそれ。
とても実用化出来ないほど重い。
0268デフォルトの名無しさん
2009/05/31(日) 08:49:310269デフォルトの名無しさん
2009/05/31(日) 15:09:59Excel97が出たころは一工夫して下みたいな十字カーソルをやってた。
もっとも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は行列番号の色がはっきり違って目立つから全然必要ないと思うんだが。
0270デフォルトの名無しさん
2009/05/31(日) 16:34:430271デフォルトの名無しさん
2009/05/31(日) 18:26:20選択範囲を保管しておきたいです。
選択範囲がセルなら、Selection.Address
選択範囲が図形なら、Selection.Name
を保管しておけばいいのだろうけれど、
値にアクセスする前に型を判別できないのでエラーになってしまう。
どうしたらよかんべ?
0272デフォルトの名無しさん
2009/05/31(日) 18:34:20なんでわざわざAddressやNameを保持するの?
Selectionそのものを保持すればいいだけじゃん
Dim hoge As Object
Sub 選択保持()
Set hoge = Selection
End Sub
Sub 選択復元()
hoge.Select
End Sub
0273デフォルトの名無しさん
2009/05/31(日) 19:09:00サンクス。
Rangeオブジェクトのときは上手くいくのだけど、
画像などの場合、他の箇所で切った貼ったを行ってしまうと、
PictureクラスのSelectメソッドが失敗してしまう。
なので、質問したようなやり方をしたいのだ。
0274デフォルトの名無しさん
2009/05/31(日) 19:27:31今はたいして変わらんかも知らんが、昔の低スペック機では全然違ったのよ。
いったん全部色を消すのは使い物にならなかった記憶がある。
0275デフォルトの名無しさん
2009/05/31(日) 19:57:25Private 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倍くらい違うということか。
今の高スペック機じゃ一回では体感できないが昔ははっきり体感できたもんな。
0276デフォルトの名無しさん
2009/05/31(日) 21:25:29セルと図形って言ってただろ?
なんで画像が出てくるんだ?
0277デフォルトの名無しさん
2009/05/31(日) 21:28:48現行機で0.93秒と、1.75秒だった
10年以上前のPen3 450MHzでも1回当たりの体感に差はない
0278デフォルトの名無しさん
2009/05/31(日) 21:54:28バージョンによってCellsとかの扱いが違うのかもよ。
とにかくExcel97で275みたいなのは使い物にならなかったのははっきり覚えているよ。
あまり絡むなよ。
0279デフォルトの名無しさん
2009/05/31(日) 22:24:30当然ながら後者に信憑性があることは言うまでもないわけで。
あまり絡むなよ。
0280デフォルトの名無しさん
2009/05/31(日) 22:27:47Pentium3の発売が何年か知ってるのかよ。
97年当時Pentium3 450MHzなんてないんだよ。
0281デフォルトの名無しさん
2009/05/31(日) 22:33:180282デフォルトの名無しさん
2009/05/31(日) 22:38:15多くの人はWin95にOffice97パッケージを乗せずに、
Win98もしくはWin98SEとOffice97が入ったマシンに買い換えた
1999年、Pentium IIIが現れWin98の情報も溢れてきた頃に
0283デフォルトの名無しさん
2009/05/31(日) 22:55:11突っ込むのも解るが、10年前にはPentium3の550MHzが出てたし、280は何で絡んでるのかよくわからんな。
0284デフォルトの名無しさん
2009/05/31(日) 23:03:41話の流れを良く読め。
0285デフォルトの名無しさん
2009/05/31(日) 23:09:390286デフォルトの名無しさん
2009/05/31(日) 23:13:12約一名が躍起になってるだけのように見えて痛々しい
0287デフォルトの名無しさん
2009/05/31(日) 23:18:41ほんと痛々しいね。
0288デフォルトの名無しさん
2009/05/31(日) 23:20:39化石引っ張り出してきたよ
12年前のPen2 233MHzでも1回当たりの体感に差はない
カーソルキーで連続移動すれば体感差あるけど
カーソルキー移動1回、もしくはマウスクリック1回に置いて
色の切り替わり速度に違いは感じられない
0289デフォルトの名無しさん
2009/05/31(日) 23:24:340290デフォルトの名無しさん
2009/05/31(日) 23:28:35気が済んだか?
0291デフォルトの名無しさん
2009/05/31(日) 23:30:430292デフォルトの名無しさん
2009/05/31(日) 23:32:54話の流れを良く読め。
0293デフォルトの名無しさん
2009/05/31(日) 23:33:55使い物にならないのは>>268も書いてる通りだ。
0295288
2009/05/31(日) 23:36:450296デフォルトの名無しさん
2009/05/31(日) 23:37:000297デフォルトの名無しさん
2009/05/31(日) 23:37:27Excelのオブジェクトでは、図形に画像は包含されるから。
Shape > Picture
紛らわしい書き方だったか。
0299デフォルトの名無しさん
2009/05/31(日) 23:40:22わざわざ書くのは
自作自演
字余り
0300デフォルトの名無しさん
2009/05/31(日) 23:43:56お前かわいそうなやつだなぁ。
まぁ自作自演じゃないのが分るのは2名だけだけどな。
0301デフォルトの名無しさん
2009/05/31(日) 23:46:070302デフォルトの名無しさん
2009/05/31(日) 23:49:06強調する必要もないからな。
当人ではなく第三者的な意見だって事に
しておきたい場合の策だったんだろうがバレバレすぎるw
0303通りすがり
2009/05/31(日) 23:49:12このIDの無い板で自作自演をするのに
わざわざハンドル名付ける必要も
そもそも自作自演する必要も無いんだけどな
0304デフォルトの名無しさん
2009/05/31(日) 23:52:03必死に弁明するから実は通りすがりじゃないことが立証されていく
まさに泥沼
0305デフォルトの名無しさん
2009/05/31(日) 23:53:31自分がやってるから他人もそうだと思っちゃうかわいそうな人なんだな。
0306デフォルトの名無しさん
2009/05/31(日) 23:54:06おめー病院逝けよ。
0307デフォルトの名無しさん
2009/05/31(日) 23:55:05そんなに焦らず、そんなに怯えずに
0308デフォルトの名無しさん
2009/06/01(月) 00:03:010309デフォルトの名無しさん
2009/06/01(月) 00:12:16勝った方が正義だw
ファイト!
0310デフォルトの名無しさん
2009/06/01(月) 00:16:48自演で1回線2,3役やってたから連投規制でも喰らったかな
0311デフォルトの名無しさん
2009/06/01(月) 00:26:530312デフォルトの名無しさん
2009/06/01(月) 00:43:010313デフォルトの名無しさん
2009/06/01(月) 01:48:00A1〜J100をループを回してセレクトしてみた。
まずどちらもまっさらなシートで計ったら
>>269 2.2秒
>>279 11秒
次に両方のシートのA1:J5000に"a"と入力してから計ったら
>>269 10.59秒
>>279 23.44秒
>>288はどういう計り方したの?
0314デフォルトの名無しさん
2009/06/01(月) 02:06:30ちなみにA1:S10000に入力したら12秒と40秒だった・
0315>>261
2009/06/01(月) 07:23:35会社のパソコンでやってみたらなんか処理重いなと思って来てみたら
俺のへっぽこコードのせいで変な議論になっちゃったみたいですね・・・
消すほうも塗るほうも範囲を指定すれば軽くなるのかな?
0316デフォルトの名無しさん
2009/06/01(月) 07:34:060317デフォルトの名無しさん
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倍までの差は無いみたい。
0318デフォルトの名無しさん
2009/06/01(月) 08:16:53気にするな、基地外が一人紛れ込んできただけらしいから。
Excel2000で>269と>>275比べて見たが、はっきり体感差があるよ。
>>277や>>288はシートの上の方の行でしか比べてないんだろう。
>>313のように入力して最終行近くで比べれば1回でもはっきり分かる。
A1〜J100をSelectさせてみたら>>269が8秒で>>275が66秒だった。
Pentim D 2.8GHzの結構古いパソコンだけど、もっと昔のExce97当時の
パソコンなら多分>>275は後ろの行ではとろくて使えないと思う。
0319デフォルトの名無しさん
2009/06/01(月) 08:23:23だよな。おれも0.2秒ならストレス感じるよ。
しかし最近はSUMPRODUCTなどで鍛えてる人多いから、そういう人たちは我慢強いかもね。
0321デフォルトの名無しさん
2009/06/01(月) 09:34:351回65536行目近くに移動してから1行目近くににもどった場合>>275は重くなるんじゃじゃね?
1行目近くで軽くするにはオブジェクト変数にMe.UsedRangeをセットすればいいみたいよ。
65536行近くだとやっぱ重いけどな。
0322318
2009/06/01(月) 09:49:56トンクス
試してみたら確かにそうだった。
最初はたしかA1近くでは重くなかったはずなのに途中で重くなったのでおかしいと思ったよ。
なるほどUsedRangeね。
0323デフォルトの名無しさん
2009/06/01(月) 11:25:22結構速いね。
俺はCore 2 Duo3.33GHzだがそちらのサブ機より約3倍近く遅い。
Vistaがクソなのか?
ところで>>313が書いてるように広範囲に入力したの?
0324デフォルトの名無しさん
2009/06/01(月) 12:45:14他人の言うことは端から聞く耳持たないらしいけど、変な自信はたっぷりあるんだろうね。
負けることは絶対に許されない人かも知らんね。
前からここや総合相談所に統合失調症の疑いがあるやついるんだが彼かもね。
0325デフォルトの名無しさん
2009/06/01(月) 13:19:26広範囲に入力しなくても最終行に飛んで1行に戻ってくるだけで重いみたいね。
0326デフォルトの名無しさん
2009/06/01(月) 14:02:31だったね。
0327デフォルトの名無しさん
2009/06/01(月) 16:48:510328デフォルトの名無しさん
2009/06/01(月) 17:44:02おれなんか落ち込んで死にたくなるよ。
そこをこらえて謝るけどな。
0329デフォルトの名無しさん
2009/06/01(月) 17:46:020330デフォルトの名無しさん
2009/06/01(月) 20:07:30>>269を罵倒してる奴なんて一人も居ないよ。
>>269の方が優れていることは認めた上で、>>262でも
使い物にならないほど遅くはないって話をしてるだけ。
会社でいつも怒られまくってて被害妄想気味なのかもしれないけど
誰も>>269を責めても攻めてもいないから、よく話を読もうね。
0331デフォルトの名無しさん
2009/06/01(月) 20:17:39もう見苦しいからいい加減やめようや。
会社員ねぇw
0332デフォルトの名無しさん
2009/06/01(月) 20:46:010333デフォルトの名無しさん
2009/06/01(月) 20:48:06使い物にならない事例がさんざん書かれてるのに見てないのかな。
ほんと見苦しいいいわけにしか見えないや。
0334デフォルトの名無しさん
2009/06/01(月) 20:58:00まぁまぁ。
辛抱強い人には200m秒はおいて数秒のレスポンスでも遅いと感じないかも知れないんだから。
人それぞれだよ。
0335デフォルトの名無しさん
2009/06/01(月) 21:07:01なるほどね。
スローライフの人か。
0336デフォルトの名無しさん
2009/06/01(月) 22:23:20Cell.Interior.ColorIndex = Int(Rnd()*20)
Next i
したらマジで気分悪くなってきた
0337デフォルトの名無しさん
2009/06/01(月) 22:44:50最新のExcelはCellsじゃなくてもいいのか
0338241
2009/06/02(火) 00:36:45>>256
今更だけど、どうもありがとう。
勉強初めて一ヶ月経ったけど、ただテキストを最初から読んでいくだけだと、
あまり身につかないものですね。
VBAを使って何をどうしたいという動機が必要なのかな?
0339デフォルトの名無しさん
2009/06/02(火) 02:09:20タイポだ。まあ気にしないでくれ。
0340デフォルトの名無しさん
2009/06/02(火) 05:02:320341デフォルトの名無しさん
2009/06/02(火) 09:40:02PowerPointでファイルを開いてVBAを使った処理をするんだけど、
PowerPointにはExcelのGetOpenFilename()に相当するものが存在しないので、
コマンドバーを使ってファイルを開くダイアログを出してみた。
Application.CommandBars.FindControl(ID:=23).Execute
これを実行してみると、ダイアログを呼び出してすぐに次の命令に進んでしまう。
つまり、新しくファイルを開く前に先に進んでエラーになってしまう。
今はブレークポイントを設定しておき、ファイルを開いてから再実行するということをしている。
タイマーを使うとか考えてみたけど、どうも現実的ではない。
何とかうまくやる方法はないだろうか。
0343デフォルトの名無しさん
2009/06/02(火) 09:57:30これ
閉じてから再実行でした
0344デフォルトの名無しさん
2009/06/02(火) 12:27:25作りたいものを作って、少しずつ改良していくのがいいと思う
0345デフォルトの名無しさん
2009/06/02(火) 13:04:19やりたいことがわからないで勉強しても無意味だよ
学校に通ってても英語の勉強が今では何の役にも立たないのと一緒
毎回これやるのめんどくせぇな、、、、なんとかならんかな、、、
からvba勉強し始めると
ここの人の手助けもあって2週間位で株の自動発注から返済までが組めるようになった
0346デフォルトの名無しさん
2009/06/02(火) 14:09:08そういえば俺の尊敬する株屋さんどこ行っちゃったんだろうな。
某Q&Aサロンで女性になりすまして活躍してるという噂を聞いたが。
0347デフォルトの名無しさん
2009/06/02(火) 18:21:01”VBAにいくら習熟しても金にならないから、優秀な人はどんどん他の言語に移っていく。
VBAは下っ端の奴がやらされる仕事だ。”
みたいな意味の事が書いてあった。
薄々、同じような事を思ってたけど、いざ活字で目にするとショックだ。
0348デフォルトの名無しさん
2009/06/02(火) 18:52:54少し時間のかかる処理をさせているんですが、
その処理が動いてる間、
ボタンなしのダイアログ等で『処理中』と表示させ、
処理が済んだら自動で消す、
といったような事はできますか?
0349 ◆.jruuB3RTA
2009/06/02(火) 19:06:59Endプロパティは連続したデータ範囲の終端セルを返すので、
表の途中に空白セルがあるとデータを返せない。
と、テキストには書いてあるのですが、
空白セルがあったら、Null値とか文字列とかを入れるプログラムは書けませんか?
0350デフォルトの名無しさん
2009/06/02(火) 19:20:53んっとだな。
VBA単体では金にならない。ってのが正しいと思うよ。
事務処理業務+VBA とか、何かの基礎に付随する能力としてのVBAは金になる。
VBAだけしこしこ組んで金にはならん。
DB+VBAとかでも生活出来る程度の金になるし、
転職する時には凄く大きなアドバンテージになる。
0351デフォルトの名無しさん
2009/06/02(火) 19:24:14ユーザーフォームで。
もしくは別シートを表示させるとかね。
>>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
みたいに。
0352 ◆.jruuB3RTA
2009/06/02(火) 19:30:15どうもありがとう。
こんな短時間で答えられるなんてすごいなぁ。
図々しくて申し訳ないんだけど、
rows.count,1
の1って、どういう意味ですか?
すいませんが宜しくお願いします。
0353デフォルトの名無しさん
2009/06/02(火) 19:42:160354デフォルトの名無しさん
2009/06/02(火) 20:09:13ユーザーフォームとは、、
まだ始めたばかりで余り単語とかも分からず…
0355デフォルトの名無しさん
2009/06/02(火) 21:01:54VBAでプログレスバーっていうのはどこかにあるよ
0356デフォルトの名無しさん
2009/06/02(火) 21:47:46excelで使いたいんです。。。
通常のVBは入ってないので。
0357デフォルトの名無しさん
2009/06/02(火) 21:54:20あくまで道具の一種ですよ。
ほかの言語でやる必要があればその言語を使えば良いだけ。
並列言語とかをのぞけば、要件抽出して、適当にクラスをモデリングするという基本的な作業は変わらん。
>>350
>DB+VBAとかでも生活出来る程度の金になるし、
それは他の分野で優れていて、なおかつそういうサブスキルがあればその分有利になるってだけの話だろ。
それだけで食っていけるなら、失業者なんて出ないよ。
0358デフォルトの名無しさん
2009/06/02(火) 21:56:38更に質問なんですが、
FileSearchで見つかったファイル、ファイルパスをシートにリストにしているんですが、
その見つかった数だけ、隣にコマンドボタンを自動で作り、そのボタンで隣のパスのファイルを開く、
という動作はできますでしょうか?
0359デフォルトの名無しさん
2009/06/02(火) 22:08:23http://www.asahi-net.or.jp/~ZN3Y-NGI/YNxv9g1810.html
>>358
ボタンじゃなくて、リンクではどうよ
0361デフォルトの名無しさん
2009/06/02(火) 23:43:00リンクでやってみようと思います。
それから、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
0362デフォルトの名無しさん
2009/06/03(水) 00:22:43>>空白セルがあったら、Null値とか文字列とかを入れるプログラム
Cells(Rows.Count, 1).SpecialCells(xlCellTypeBlanks) = "Nullとか文字列"
はだめ?
0363341
2009/06/03(水) 01:13:320364デフォルトの名無しさん
2009/06/03(水) 07:07:54VSTOだけになっちゃうの?
0365デフォルトの名無しさん
2009/06/03(水) 07:19:18昨日、VBAを使ってACCESSにつなぐのが1時間くらいできなくて、
さっきExcelのリボンからやってみたら1分でできた。
俺の頭が悪いだけなのかw
でも、VBAやったおかげで、他のスクリプト言語の理解度が深まった気がするから、
やはり、勉強してみて良かったのかな?
0366デフォルトの名無しさん
2009/06/03(水) 07:36:02お前ではどんな言語をやっても意味ないだろうな
0367デフォルトの名無しさん
2009/06/03(水) 08:15:48VBAのコード書きからやるよりは、メニューやリボン、ツールバーなどからの方が速くて当然
VBAは主に何度も行う定型処理や規則処理、連続処理などに使う
スクリプトも使うならそのくらいわかりそうな物だけど
0368デフォルトの名無しさん
2009/06/03(水) 08:16:13使えればそれなりに作業効率がアップする程度かな。
0369デフォルトの名無しさん
2009/06/03(水) 08:56:47作ったものはエクスポートして保管しておく
後はそれをコピペして改造しながら使っていく
VBAを飯の種にしてる人以外はこんなもんじゃね?
0370デフォルトの名無しさん
2009/06/03(水) 09:55:35俺は全社の業務効率化の為にVBAだけで仕事してるけど、
それでも会社の事知らないと作れないから、それだけで食ってるとは言い難いな。
0371デフォルトの名無しさん
2009/06/03(水) 19:20:28使いどころを間違えれば仕事が遅くなるのは当然
0372341
2009/06/03(水) 22:14:25はは。他の言語とか、そんなことないんだけどなー。
Office VBAはやらなかったもんでね。
オブジェクトモデルも理解してないんだよ。
さっと教えてみてくれよ。
0373デフォルトの名無しさん
2009/06/03(水) 22:42:57http://www5c.biglobe.ne.jp/~yamag/data/Soft/VBAProgramingTIPS.html
WordにもGetOpenFileNameがないらしいので参考にすれば
しかし、ここはExcel VBA質問スレだ
二度と来るな
0374デフォルトの名無しさん
2009/06/03(水) 23:02:19特にレスがないってのは出来ないって事でしょうか・・・
それともここにはそれだけの知識を有した方がいないんでしょうか
0375デフォルトの名無しさん
2009/06/03(水) 23:18:19やっぱり俺が出て行くわ。
0376デフォルトの名無しさん
2009/06/04(木) 00:04:06そうだよ、だから帰ってね
0377デフォルトの名無しさん
2009/06/04(木) 00:19:07PowerPointから
CreateObject("Excel.Application")して
GetOpenFileNameするってのもありか
0378デフォルトの名無しさん
2009/06/04(木) 02:59:12まあファイル総数を調べた後に1つ1つカウントすればいいんじゃね?
簡単だろ?わからないなら1から10までカウントのプログラム書いてみ?セルに表示するやつ
あとはそれをどう表現するかの問題。セルに色塗ったり、色付きラベルの長さを伸ばしたり・・・
コントロールもあったかもしれん
そもそも経過処理表示を本気で実装するのは難しい(無理)
インスコ等でも分かると思うが、人間の感覚と処理経過に乖離が発生する。
0379デフォルトの名無しさん
2009/06/04(木) 03:09:35「vba ステータスバー」でググった一番上。まさにこれかと・・・
そもそもfor文使ってるのに意味分かってないのがアウツ
0380デフォルトの名無しさん
2009/06/04(木) 06:52:180381デフォルトの名無しさん
2009/06/04(木) 07:25:180382デフォルトの名無しさん
2009/06/04(木) 07:35:170383デフォルトの名無しさん
2009/06/04(木) 07:50:09/( ゚ )( ゚ )ヽ
/::::⌒`´⌒::::\ 呼んだ?
| ,-)___(-、|
| l |-┬-| l |
\ `ー'´ /
0384デフォルトの名無しさん
2009/06/04(木) 09:08:08IEのherf="javascript:clickQuickLink('summary');"
これをクリックしてページの推移をしたいのですが
このリンクをマウスでクリックするようにvbaでクリックする方法を教えていただけないでしょうか
よろしくお願いいたします
0385デフォルトの名無しさん
2009/06/04(木) 09:40:56VBAを使ってのExcelの操作ではなくIE(IEオブジェクト)の操作はスレ違い>>4
0386デフォルトの名無しさん
2009/06/04(木) 11:30:080387デフォルトの名無しさん
2009/06/04(木) 15:32:16言わないと解らない人には言う必要がある
スレ違いな質問しちゃう人は後者なので言う必要がある
0388デフォルトの名無しさん
2009/06/04(木) 15:54:060389デフォルトの名無しさん
2009/06/04(木) 16:00:080390デフォルトの名無しさん
2009/06/04(木) 16:13:580391デフォルトの名無しさん
2009/06/04(木) 16:17:480392デフォルトの名無しさん
2009/06/04(木) 17:11:470393デフォルトの名無しさん
2009/06/04(木) 19:14:190394デフォルトの名無しさん
2009/06/04(木) 20:27:47見付かったファイル状況ならもちろん分かります。
検索しているファイルのカウントを表示させたいんですが、
どこでどのオブジョクトを見ればよいのかが分かりません
0395デフォルトの名無しさん
2009/06/04(木) 23:03:460396デフォルトの名無しさん
2009/06/04(木) 23:04:400397341
2009/06/04(木) 23:04:55えらい人だね
>>377
> CreateObject("Excel.Application")して
なるほど。 明日から出張なんで、帰国したら試してみる。
ありがとう。
0398デフォルトの名無しさん
2009/06/04(木) 23:37:340399デフォルトの名無しさん
2009/06/05(金) 00:10:03プロパティやオブジェクトもググっても見つからないし、
executeしたらその.Executeの中身はすぐにhit数になってるし。
0400デフォルトの名無しさん
2009/06/05(金) 08:54:530401デフォルトの名無しさん
2009/06/05(金) 08:56:300402デフォルトの名無しさん
2009/06/05(金) 09:12:570403デフォルトの名無しさん
2009/06/05(金) 09:46:46オプションの自動計算のチェックボックスはonのままです
とりあえずマクロの
Private Sub Worksheet_Calculate
を削除したところ止まらないようになりましたけど・・
原因がわかりません
0404デフォルトの名無しさん
2009/06/05(金) 21:45:53これをVBAで実行すると、シートを削除するときに本当に消していいのかという
確認ダイアログを求められるのですが
これを出さずに強制的に削除する方法ってあるのでしょうか?
0405デフォルトの名無しさん
2009/06/05(金) 21:58:29Application.DisplayAlerts = False
0406デフォルトの名無しさん
2009/06/06(土) 02:07:20そのマクロの中身がわからんことには…
0407VBA暦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サイトもご紹介いただけると助かります。
よろしくお願いいたします
0408デフォルトの名無しさん
2009/06/07(日) 15:52:120409VBA暦12時間
2009/06/07(日) 16:42:40ありがとうございました!
0410デフォルトの名無しさん
2009/06/07(日) 20:46:57Sub 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
0411410の続き
2009/06/07(日) 20:48:22Loop
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は一時的な計算用配列です
0412デフォルトの名無しさん
2009/06/07(日) 21:43:550413デフォルトの名無しさん
2009/06/07(日) 22:32:480414デフォルトの名無しさん
2009/06/07(日) 22:38:09余談だけど、こんな書き方を推奨してる参考書でもあるの?
条件指定なしのdoを使ってる所見ると、他言語で覚えたかな。
if thenでGoToに飛ばすコードは記憶の限りでは初めて遭遇したんだけど、
他の言語だと一般的なのかな?後学の為に教えてください。
cが宣言無しで突如出てきてるのは、まぁ良いのか。
bは2次元配列のはずなのに、matchでは何も指定されてないけど、
そこが問題じゃない?
0415デフォルトの名無しさん
2009/06/07(日) 22:39:10オフィス:2003
VBAの勉強を始めようとセルの結合や色付けなど
ごく初歩的なマクロを使ってるのですが
マクロで実行した操作を戻ることはできないのでしょうか?
たとえばA1:B1セルの結合をすると
戻るボタンがグレーになり、保存せずに閉じて開きなおすしか戻る方法がありません。
これをマクロで実現するにはどうすればよいのでしょうか?
0416デフォルトの名無しさん
2009/06/07(日) 23:00:29おお!ありがとうございます!!そこでした
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
0417デフォルトの名無しさん
2009/06/07(日) 23:08:050418デフォルトの名無しさん
2009/06/07(日) 23:09:01マクロで実行した物は戻せない。
結合したものを解除したいなら、結合を解けば良い。
0419デフォルトの名無しさん
2009/06/07(日) 23:12:48可能ですよ。存在してたら数字、存在してなかったら型が違うとエラーになります。
ただ>>416ではウォッチ式見ても型も同じです
Sub a()
Dim myary
myary = Array( _
"加入者番号:", "加入者:", "会社名:", "登録日:", "加入日:", _
"予定事項:", "担当者:", "部門:", "区分:", "住所:", _
"請求書住所:", "電話:", "請求書電話:", "アドレス:")
MsgBox Application.Match("登録日:", myary, 0)
End Sub
0420デフォルトの名無しさん
2009/06/07(日) 23:12:53釣りだよな?
0421デフォルトの名無しさん
2009/06/07(日) 23:14:54違います。
本気で分からないので教えてくださいorz
0422デフォルトの名無しさん
2009/06/07(日) 23:15:54それじゃ1次元配列じゃないか。
0423デフォルトの名無しさん
2009/06/07(日) 23:30:29b(2,2)が配列もしくは範囲ではないから
0424デフォルトの名無しさん
2009/06/07(日) 23:34:55Sub test111()
Dim ar As Variant
ar = [{1,2;3,4}]
MsgBox Application.Match(1, ar, 0)
End Sub
2次元配列にmatch掛けられないじゃないか。
存在していても型エラー出る。
0425416
2009/06/07(日) 23:46:360426デフォルトの名無しさん
2009/06/08(月) 15:28:10BASICではそもそもIF THENの後のGOTOは省略できるってほど
THEN GOTOが人気だったんだぜ…
>>416
この用途だと Exit Doで十分だな。
というか、今時GoToなんて苦行する必要ない。
GOTO 、GOSUBなんてのはユーザー関数が無かったころの名残。
0427デフォルトの名無しさん
2009/06/08(月) 20:31:590428デフォルトの名無しさん
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´
0429デフォルトの名無しさん
2009/06/08(月) 22:04:040431デフォルトの名無しさん
2009/06/08(月) 23:15:19ActiveCell.FormulaR1C1 = "=COUNTIF(Sheet1!R1C[args1]:R30000C[args1],RC[-1])"
こういう感じでargs1を変数にして呼び出し元で中身を変えて実行したいのですが
どうしてもうまく来ません
どうやればいいのか教えてください
0432デフォルトの名無しさん
2009/06/08(月) 23:46:53ActiveCell.FormulaR1C1 = "=COUNTIF(Sheet1!R1C[" & args1 & "]:R30000C[" & args1 & "],RC[-1])"
0433デフォルトの名無しさん
2009/06/09(火) 09:50:58= replace("=COUNTIF(Sheet1!R1C[@]:R30000C[@],RC[-1])", "@", "1")
とやる事が多い
0434433
2009/06/09(火) 09:53:580435デフォルトの名無しさん
2009/06/09(火) 23:42:12例えばですが、「abcdefg」といった文字列に、「def」が含まれているか、
といった処理をさせようとしているんですが、どうやって比較したらよいのでしょうか?
*def*または、?def?の使い分けもできるようにしたいんですが、可能でしょうか?
0436デフォルトの名無しさん
2009/06/09(火) 23:50:42InStr
正規表現
0437デフォルトの名無しさん
2009/06/10(水) 00:40:03俺には分らんな。
Like演算子なら使い分けは簡単。
"abcde" Like "?bcd?"ならTrueだが
"abcdef" Like "?bcd?"ならFalseだ。
0438デフォルトの名無しさん
2009/06/10(水) 11:35:40.*def.*
.def.
だぬ。
0439デフォルトの名無しさん
2009/06/10(水) 14:50:52"%def%"もしくは"_def_"と覚えたほうがいいと思う
0440デフォルトの名無しさん
2009/06/10(水) 18:29:09横スレだけど、
len(str) が5文字かつ、instrが2なら "?bcd?" に該当するんじゃないかな。
正規表現やlike演算子使った方が楽だけど。
0441デフォルトの名無しさん
2009/06/10(水) 18:29:21○レス
0443デフォルトの名無しさん
2009/06/10(水) 20:11:040444デフォルトの名無しさん
2009/06/10(水) 22:54:02「マクロ→セキュリティ→Visual Basicプロジェクトへのアクセスを信頼する」にチェックを入れるのを、
マクロで行う事って出来ないんでしょうか?
0445デフォルトの名無しさん
2009/06/10(水) 22:59:50何のウイルスを配布するつもりなの?
0446デフォルトの名無しさん
2009/06/10(水) 23:16:43Excel: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
0447デフォルトの名無しさん
2009/06/11(木) 00:54:090448427
2009/06/11(木) 01:05:010449デフォルトの名無しさん
2009/06/11(木) 02:13:200450デフォルトの名無しさん
2009/06/11(木) 08:00:42異なる部分を引数にもつ関数作れば?
0451デフォルトの名無しさん
2009/06/11(木) 09:59:51やりたいことが分からんけど
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
0452デフォルトの名無しさん
2009/06/11(木) 13:06:37レジストリ
0453デフォルトの名無しさん
2009/06/11(木) 20:25:43以下のように作成したのですが、
年: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
0454デフォルトの名無しさん
2009/06/11(木) 20:51:04>>452
ウイルスとかじゃなくて、あちこちアップデートが必要ににりそうなファイルを
自動でパッチあてる感じにしたいんだ
レジストリはVBEマクロでいじれるもんなの?
0455デフォルトの名無しさん
2009/06/11(木) 20:56:16A1が日付なら
Range("B7").Resize(, 3).Value = Split(Format$(Range("A1").Value, "yyyy/mm/dd"), "/")
の1行で充分じゃね?
0456デフォルトの名無しさん
2009/06/11(木) 20:57:19書式設定か、
Range("C7").Value = "0" & Month(myDate)
0457デフォルトの名無しさん
2009/06/11(木) 21:00:18そうなのですが、いろいろ試してもうまくいかなくて…
>>451
すみません。どんな動作をしたいか、書いておくべきでした。
なるほど…2次元ですか。
ただ、できれば動的配列にしたいかなぁなんて思ってまして。
2次元だと、Preserveは片方にしか利かないとか。
ありがとうございました。また、自分でも考えてみます。
0458デフォルトの名無しさん
2009/06/11(木) 21:03:50それじゃ10月は010になってまずいんじゃないかなぁ。
右2文字を取り出せばいいけどね。
0459デフォルトの名無しさん
2009/06/11(木) 21:25:21>>456
サンクス
宣言した変数(例、TTTTTTT)に05を文字列として入力したい)
A1に2009/5/1と入力して、あるフォルダの2009年05月XXX.xlsというファイルを
読み込むマクロを書いています。
よろしくお願いします。
0460デフォルトの名無しさん
2009/06/11(木) 21:29:22Range("C7").Value = "'" & Format(myDate, "mm")
これじゃダメかな?
0461デフォルトの名無しさん
2009/06/11(木) 21:35:54Format$(Range("A1").Value,"yyyy年mm月XXX")の文字列を作ってWorkbokks.Openと組み合わせるだけ。
0462デフォルトの名無しさん
2009/06/11(木) 21:37:25できました。
サンクス
, - ,----、
(U( )
| |∨T∨
(__)_)
0463デフォルトの名無しさん
2009/06/12(金) 01:08:40使いたいのですが、できますか?
やりたいのは
Dim ABCDE As Integer
Dim moji As String
moji = AB
"moji"CDE = 5
みたいな感じです
0464デフォルトの名無しさん
2009/06/12(金) 03:32:11変数はただの入れ物だから、無理じゃないかなぁ
何がやりたいか詳しく書いてくれたら、
別の方法になるかもしれないけれど、実現できるコードを考えられるかも
0465デフォルトの名無しさん
2009/06/12(金) 04:26:27たぶん>>463が言いたいのはリフレクションを使って
動的に変数を追加・参照することは出来ないかってことじゃね?
そんなことをして、なんになるのか分からないが、そういうことだと思う
# javascriptで関数電卓のフレームワーク+プラグイン(関数やらが定義されてたりする)を作ったときに使ったくらいかな?
たぶん、VBAのリフレクションは貧弱だから出来なさそうな気がする。
だけど、サンプルを見る限り、連想配列で良いんじゃね?って思うな。
最終的にやりたいことは
userStatus("Jonson") = "空腹"
userStatus("Harris") = "眠い"
userStatus("cherry") = "ピヨピヨ来た"
ってことでしょ。
VBAでどうやって連想配列を使うか知らないけど。
# たぶん、つかえないだろうなぁ
# 無かったら、自分で作ればいいけど、速度面でどうなんでしょうねぇ。
# 下手なハッシュ関数作るより、 配列二つ並べて、逐一中身を検索した方が早かったりしてw
0466デフォルトの名無しさん
2009/06/12(金) 05:21:46http://okwave.jp/qa2033484.html
これみたいなカンジ?
0467デフォルトの名無しさん
2009/06/12(金) 06:05:14なんか、全然わかってなくて書いちゃって恥ずかしいっす。
教えてくれてあんがと。
連想配列の使い方を調べたら、Dictionaryオブジェクトだらしいです。
0468463
2009/06/12(金) 07:51:24たとえば
takeda
aoyama
tanaka
sirakawa
aoyama
koyama
みたいな50種類くらいの名前がかぶりつつ列挙されてて、それぞれ何個
でてきたかしりたいのです。
変数 aoyama_name,koyama_name,takeda_name
と人数分の変数を宣言しておいて、セルの文字列を順に取得し、
その文字列に対応する変数にカウントしていく方法ができないかと
0469デフォルトの名無しさん
2009/06/12(金) 08:13:29Instrでもlikeでも正規表現でも、何でも良い様な気がする。
0470デフォルトの名無しさん
2009/06/12(金) 09:34:58A列に(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
0471デフォルトの名無しさん
2009/06/12(金) 09:38:23Private Sub 初期処理()
For i = 0 To 100
名前(i) = "": 件数(i) = 0
Next i
i_max = 0: 縦 = 1
Exit Sub
End Sub
以上
出現順に名前を格納する配列と件数を格納する配列を用意して、セルの内容を読み込む都度
名前配列を順に調べていく、初めてならば添字を+1して名前を格納し、同じ添字の件数配列
に1をセットするというやり方です。もっとスマートな方法があればお知らせください。
0472デフォルトの名無しさん
2009/06/12(金) 12:25:10Excelの本来の機能は表計算ソフトだから、個数を集計する方法はいくつもあるよ。
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
0473470
2009/06/12(金) 13:14:48こういうことができるんですね。
集計対象データが大量の場合は、いったん文字列変数にに","をはさんで連ねていくことになりますね。
Dictionaryの機能は半角英数の大文字・小文字の別とか日本語対応はどうなんでしょう。
0474デフォルトの名無しさん
2009/06/12(金) 13:25:58あくまでもサンプルだから , で区切ったデータを用意したけど、
実際のデータはワークシートやファイルから読み込むのが普通。
キーワードには日本語も使える。英字の大小は区別される。
データを "鈴木,高橋,山田,田中,鈴木,高橋" に変えて試してみ。
0475デフォルトの名無しさん
2009/06/12(金) 14:28:42For Each n In name '配列で集計
dic(n) = dic(n) + 1
Next
たったこれだけで集計できる。
データが増えると遅くなるけど。
0476デフォルトの名無しさん
2009/06/12(金) 16:22:18ヒントになるサイトか関数などあれば教えてください。よろしくお願いします
0477463
2009/06/12(金) 16:27:12高橋 100点
三根 98点
山田 100点
高橋 100点
青山 97点
山田 99点
(50人くらい、データは1000件くらい)
で100点の人だけ集計して100点の高橋が何人いて、
100点の山田が何人いるみたいなことをしたかったので、
100点で検索して左のセルをみて、
文字列を取得して、その取得した文字列と
関連するの配列名にカウントしたかった
のですが、どうもdictionaryでできそうです。
みなさんありがとうございました。
0478デフォルトの名無しさん
2009/06/12(金) 16:27:50実例を示せ
0479デフォルトの名無しさん
2009/06/12(金) 16:30:15その程度ならVBAなんぞ使わんでも一発で集計できるがね
0480デフォルトの名無しさん
2009/06/12(金) 16:43:26失礼しました
やりたいことは条件付き書式設定のようなことで、
例えば
30
20
50
60
40
80
というセルを選択した後、ユーザーフォームから数式を入力してボタンを押すと
数式に該当するセルに対して、処理を行うということです。
条件付き書式設定を使えというのは無しでお願いします。。。
0481デフォルトの名無しさん
2009/06/12(金) 17:31:32なんなのその数字。
0482デフォルトの名無しさん
2009/06/12(金) 18:13:090483デフォルトの名無しさん
2009/06/12(金) 19:49:23Chr(13) = vbCr
Chr(10) = vbLf
0484デフォルトの名無しさん
2009/06/12(金) 21:11:04改行コードは状況によって変わることがあるから
Chr(13)とかChr(10)とかに固定すると具合が悪いこともある
0485デフォルトの名無しさん
2009/06/12(金) 21:20:260486デフォルトの名無しさん
2009/06/13(土) 09:26:08数式の解に該当する数字の入ったセル
0487デフォルトの名無しさん
2009/06/13(土) 10:58:14数式に該当するセル: 50 60 80
ってことじゃね
0488デフォルトの名無しさん
2009/06/13(土) 11:10:30フォームから「A2=A1+10」と入力する。A1に5が入っていたとしたらA2に15を入れる。
どうだ?
0489デフォルトの名無しさん
2009/06/13(土) 12:27:04何をどうしたいのか細切れに話そうとしてるからますます判らん w
0490デフォルトの名無しさん
2009/06/13(土) 12:28:17/_ノ ヽ、_\
o゚((●)) ((●))゚o ,. -- 、
/::::::⌒(__人__)⌒:::::: / __,>─ 、
| |r┬-| / ヽ
| | | | { |__
| | | | } \ ,丿 ヽ
| | | | / 、 `┬----‐1 }
| | | | / `¬| l ノヽ wwwwwwwwwwwwwwwww
\ `ー'ォ / 、 !_/l l / }
{ \ l / ,'
\ ´`ヽ.__,ノ / ノ
\ ヽ、\ __,ノ /
 ̄ ヽ、_ 〉 ,!、__/
0491デフォルトの名無しさん
2009/06/13(土) 16:20:49数式からEvaluateで戻り値を求めて、その戻り値でフィルターにかけりゃいいじゃん。
それともフィルタオプションで検索条件範囲の1行目を空白にして、2行目に=A2=数式と書きだして抽出するとかね。
0492491
2009/06/13(土) 16:24:490493デフォルトの名無しさん
2009/06/13(土) 16:52:40>>463
>>468
>>477
>>480
0494デフォルトの名無しさん
2009/06/13(土) 21:30:24仲間はずれがいるぜ。
>>480は>>476だな。
0495デフォルトの名無しさん
2009/06/13(土) 22:23:18/ ノノ ノノノ ヾヽ、ヽ
/ ノj ` ´ i |
i { ` , ,-,、´ i |
{ i )-―-'( i |
ヽ i ⌒ } |_,,,. -‐- 、
__)), ,ノ人 、_, ノ''"´ , \
/ ` ー--,. '´ . : :`( ゝ、
/ : : :: :´: . : :\ , ' ´_ ヽ
/ r´: : : : : : ,. ' ´ ヽ>'´ ,'ヽ!
/ γ: : ノ _ ,, 、,, ,,__i 。 ./ ; ,!
i ir' " ヽ ,,, ''' ´ `"7 :/
i |、 ° }, ' ` y' /
"'''‐‐- ...,,,_| ヽ、ー/ __ _/ /
`'''-,,,て ´  ̄ ̄ / ,イ
`''-、__/ / ` / ,! _,
`''-,,_ ,..、_,,..イ´ i'´ `ゝ''"´
\_ ,,,,,...ゞ、_ |ー-/
ミ〉 !r'´
ヽ ミ/、 /| i i }
0496416
2009/06/14(日) 13:08:25Dim sssss As Range
Set sssss = Range("a1:aa27")
Do
Loop Until sssss <> Range("a1:aa27")
End Sub
上記のコード5行目で型が違うとエラーが出ます。どうすればよいでしょうか?
doloopの中身はRange("a1:aa27")の内容の変更で、変更しなくなるまで続けるコードです
0497496
2009/06/14(日) 13:09:110498デフォルトの名無しさん
2009/06/14(日) 13:29:42何がやりたいのか分らんな。
それにおめーどう見てもこのスレの>>416じゃないかw
嘘つくんじゃないよ。
ハンドルをコロコロ変えて指摘されると別人だと言い張るやつらと変わらんな。
0499デフォルトの名無しさん
2009/06/14(日) 13:40:38スンマセン別に嘘ついたわけじゃないです
違うスレの名前と思ったらここのでした
分かりにくくすいません。
まとめると、
Range("a1:aa27") を一旦変数sssssに入れ、
Range("a1:aa27") の数字を変更した後
sssss <> Range("a1:aa27")
の真偽を確かめたいのです
変更しない場合もありますので、その場合loopから抜け出したいのです
0500デフォルトの名無しさん
2009/06/14(日) 16:54:14> Range("a1:aa27") の数字を変更した後
> sssss <> Range("a1:aa27")
> の真偽を確かめたい
これで実現できる事が分からん。
手先のやり方でなくて、最終的な目的を書いた方がレスしやすいよ、あんたの場合。
0501デフォルトの名無しさん
2009/06/14(日) 17:56:04範囲を変えるのか(たとえばRange("A1:AA27")をRange("A1:AA999")に変える)
セル内の数値を変えるのか。(Range("A1").Value=123みたいに)
0502デフォルトの名無しさん
2009/06/14(日) 18:52:19ライフゲームを作ってるんです
常に変化する配列で、配列が変化しなくなったら終了しようと思いました
>>501
分かりにくいですね
Range("a1:aa27")のセル一つ一つのVALUEです。
0503デフォルトの名無しさん
2009/06/14(日) 18:57:390504デフォルトの名無しさん
2009/06/14(日) 19:10:28もう別セルを作業セルとして使います・・
0505デフォルトの名無しさん
2009/06/14(日) 21:27:16それならワークシートを3枚用意して
1枚目=初期状態
2枚目=次の世代
3枚目=1枚目と2枚目の差を計算する数式、空いてる列にシート全体の合計
みたいにして、その合計の部分が0になったかどうか調べるのが一番簡単かな。遅いけどね。
VBAだけで処理を完結させたかったら、
配列を一気に比較する方法はないので、ループを回すしかない。
0506デフォルトの名無しさん
2009/06/14(日) 21:28:28神!!ありがとうございます
しかも自分が作ってるノより楽そうです
0507デフォルトの名無しさん
2009/06/14(日) 22:12:02可変する最終行のセルに合計を求めたいのですが。
具体的には・・・
・A1〜C3の数が埋まっている表がある
(この表は可変し、範囲がA1〜C20の時もある)
・例として、A1〜C3の範囲だけの表の時は、A4・B4のセルを結合し、"合計"と表示、
C4にC1〜C3の合計の数値を返す数式。
範囲が可変するのでそれに対応するマクロを組みたいのですが
どなたかご教授お願い致します。
0508デフォルトの名無しさん
2009/06/14(日) 22:24:57それだけならマクロ組む必要はありません。「Excel総合相談所 83」の
レス番号80と86を参照してください。
0509デフォルトの名無しさん
2009/06/14(日) 22:43:00Sub 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
0510509
2009/06/14(日) 22:55:21Sub 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
0511デフォルトの名無しさん
2009/06/15(月) 01:28:36Excel 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
0512デフォルトの名無しさん
2009/06/15(月) 17:23:52chitest(実測値範囲, 期待値範囲)を使うときに、
実測値範囲, 期待値範囲を変数で指定したいのですが、
どうすればよいでしょうか
0513デフォルトの名無しさん
2009/06/15(月) 17:41:39パラメータには配列を使うことができるから、
配列のサイズを、範囲指定用の変数を使って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
0514デフォルトの名無しさん
2009/06/15(月) 17:55:57v = cell.value
else
v = 0
end if
ということがよくあるんだが、
これは三項演算子iffを使うのが一般的?それともifで場合分けするのが一般的?
0515デフォルトの名無しさん
2009/06/15(月) 18:01:51それよりも「セルの内容が不定で、値が入っていたり空白だったりする」ようなシートの設計に
問題がないか考えてみた方がいい。
データの個数が不明ならxlUpとかUsedRangeとか使って処理の必要な範囲を決められるように
できないか検討してみる。
0516デフォルトの名無しさん
2009/06/15(月) 18:28:490517デフォルトの名無しさん
2009/06/15(月) 20:03:06ただこれを使うのはアフォということになってる。
もうめちゃくちゃ遅いからね。
0518デフォルトの名無しさん
2009/06/15(月) 20:22:560519デフォルトの名無しさん
2009/06/15(月) 20:28:130520デフォルトの名無しさん
2009/06/15(月) 20:43:490521デフォルトの名無しさん
2009/06/15(月) 21:58:28予め真偽両方の戻り値が評価されてしまうことに注意しとけばOKじゃね?
大体、多少の無駄は、Excelのオブジェクトにアクセスするコストと比べると、
どうでも良いレベルになっちゃうんだよなあ。
0522デフォルトの名無しさん
2009/06/15(月) 22:34:08と言うか、三項演算子とも解釈が全然違う、ただの関数か。
三項演算子じゃないなら、if重ねて書いた方が可読性上がるな。
0523デフォルトの名無しさん
2009/06/15(月) 22:44:25一行でかけるのにIF文ずらずら書いてたらウザイわな。
可読性が悪い。
0524427
2009/06/15(月) 22:46:200525デフォルトの名無しさん
2009/06/15(月) 22:49:51Function 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って難しいんですね
0526デフォルトの名無しさん
2009/06/15(月) 23:13:27ifで連ねた方が圧倒的に可読性高い。
他の三項演算子が実装されてる言語でも、
可読性が下がるって理由で三項演算子は避けられる事が多いよ。
Ifなんてネスティングで分岐するのが当たり前な訳で、
無理やりIIFでネストしたら手に負えないだろう。
0527デフォルトの名無しさん
2009/06/15(月) 23:51:57ソース(ry
0528デフォルトの名無しさん
2009/06/16(火) 00:20:10var = IIf(expr, valueA, valueB)
こういう単純なパターンならOK、というのが俺基準。
計算式とか入って少しゴチャゴチャしそうなら普通にIfで書く。
>>525
難しいというか面倒。VBAの開発は終了しているから進化はありえないし。
なら.NET経由で、となると今度はプロセス間通信でやりとりのコストが跳ね上がる……
0529デフォルトの名無しさん
2009/06/16(火) 00:25:550530デフォルトの名無しさん
2009/06/16(火) 00:37:01知らない奴の可読性が落ちるから、が正解。
0531デフォルトの名無しさん
2009/06/16(火) 01:12:09Function 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は別物だから関係ない!
0532デフォルトの名無しさん
2009/06/16(火) 01:16:24If expr Then var = valueA
って一文で書く奴アホやで。
C言語でも可読性考えて必ず{}は省略せずに括って3行にすんだよ。
If expr Then exit sub とかならまだ許せるけどな。
0533525
2009/06/16(火) 02:13:20ひょっとして僕が叩かれてる?
>>532
掲示板にちょっと書くくらい良いじゃないか。
言いたかったのは、IIFが演算子ではなく、関数と同じ
しかも、自分で実装できる程度のものか?ということ。
無駄に一行にまとめるのが愚行だというのは同意しますよ。
#でも、無駄に空行を入れるのはどうかと思いますがw
#さらに言うなら、方言が出ていますよ。自覚しにくいから方言は怖いですね。
>>531
三項演算子とIIFが関係ないのは分かるが
それ以前の文で、何が言いたいのか分からない。
0534デフォルトの名無しさん
2009/06/16(火) 06:30:180535デフォルトの名無しさん
2009/06/16(火) 08:20:49たかだかVBAですよ?
IIfはご自由に使いなさい!(職場の方針に応じて)
ソースは見やすいように書きなさい!(VBAで他の人が修正するようなちっさい仕事ないけどね)
速度は大して気にするな!(VBAで出来るようなちっさい処理で)
0536デフォルトの名無しさん
2009/06/16(火) 08:26:09/ / i ∧ : 、 ヽ
/) ' ' ! / ',: . ヽ !
///) .| i | / へ. {\ iヘ , |
/,.=゙''"/ .!. | |'/ ´ ̄`ヽ ヽ 「∨ |
/ i f ,.r='"-‐'つl ハ| i′ - 、 ノ ', / | 細かいことは
/ / _,.-‐'~ 八 | |ィニヽ ,ニ 、∨ '
/ ,i ,二ニ⊃ / | |´ ::::: , ⌒ヾ 八/ ,′ いいのよ!
/ ノ il゙フ / 人 | __ :::: / /
,イ「ト、 ,!,!| / ,..:':::::::::} |、 ( ノ / /
/ iトヾヽ_/ィ"/r.::::::::::::::::八 ヽ: 、 .イ/ ∧
0537デフォルトの名無しさん
2009/06/16(火) 08:44:01ぜんぜん叩かれてはいないから安心して。
0538デフォルトの名無しさん
2009/06/16(火) 09:27:45普通に書けばIfステートメントだからな。
よくいるよね。ある意味個性はあるけど人より劣った個性ってやつ。
0539デフォルトの名無しさん
2009/06/16(火) 10:39:58処理が遅くて困る時は、関数単位で考えるより
データ構造とアルゴリズムを見直すべきだと思ってるし。
0540デフォルトの名無しさん
2009/06/16(火) 11:15:16B列に、顧客名が表示されていて、
"有限会社"・"株式会社"・"��"・"��"・"(有)"←全角
の文字列を削除し【株式会社 ○○工業】→【○○工業】
とだけ表示したいのですが、【○○工業】の文字列は左詰めで表示したいと思っております。
Ltrim関数の使い方がよくわかりません。どなたかご教授お願い致します。
0541デフォルトの名無しさん
2009/06/16(火) 11:46:17表示ってどこに表示するの?
B列のデータを直接書き換えちゃっていいの?
0542デフォルトの名無しさん
2009/06/16(火) 12:00:47とりあえず、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
0543デフォルトの名無しさん
2009/06/16(火) 12:23:170544デフォルトの名無しさん
2009/06/16(火) 14:15:07そんなこたー当たり前だわな。
その上でチューンするときはIIfは使わん。
使い捨てマクロなら使うこともあるけどね。
0545540
2009/06/16(火) 14:17:52>541
>表示ってどこに表示するの?
すみません。複数あるシートの中で、
"顧客リストA"という名のシートと"顧客リストB"という名のシートの
B列全てです。
542さんので試しましたが、変化しませんでした・・・
申し訳ないです。
0546デフォルトの名無しさん
2009/06/16(火) 14:25:43そのシートを選択してから>>542を動かしてみ
0547デフォルトの名無しさん
2009/06/16(火) 14:30:53ほれ
Sub aaa()
Worksheets("顧客リストA").Activate
形態削除()
Worksheets("顧客リストB").Activate
形態削除()
End Sub
0548デフォルトの名無しさん
2009/06/16(火) 15:47:470549540
2009/06/16(火) 15:53:22できました!
ありがとうございます!
0550デフォルトの名無しさん
2009/06/16(火) 18:16:19そのオブジェクトでユーザーフォームを表示してる
フォームのコードに
Sub UserForm1_Initialize()
UserForm1.TextBox1.Value = txt
End Sub
って書いた
しかしフォームのテキストボックスには何も表示されない
なんで?
0551デフォルトの名無しさん
2009/06/16(火) 18:27:40VB 変数 スコープ でぐぐれ
0552550
2009/06/16(火) 18:41:36txt変数はモジュールレベルで宣言した
0553デフォルトの名無しさん
2009/06/16(火) 18:50:45どのタイミングでtxtに文字列を代入したのか
0554550
2009/06/16(火) 19:00:11(このときモジュールレベルでtxt変数宣言)
--------------------------------------
他のプロシージャ色々
--------------------------------------
txtに文字列代入
--------------------------------------
UserForm1.Show
========ここからフォームのコード=========
Sub UserForm_Initialize()
UserForm1.TextBox1.Value = txt
End Sub
って感じなんだけど
という感じ
0555デフォルトの名無しさん
2009/06/16(火) 19:01:10根本的に間違ってるやん
自分のと↓のコードどこが違うか見比べろ
Private Sub UserForm_Initialize()
UserForm1.TextBox1.Value = txt
End Sub
0556デフォルトの名無しさん
2009/06/16(火) 19:02:34この2カ所にMsgBox入れて、どっちが先に出るか試してみ
txtに文字列代入
UserForm1.TextBox1.Value = txt
0557デフォルトの名無しさん
2009/06/16(火) 19:02:47>>550ではSub UserForm1_Initialize()って書いてあるけど?
0558デフォルトの名無しさん
2009/06/16(火) 19:03:14初心者でごめん
vba歴1ヶ月なもんで
0559デフォルトの名無しさん
2009/06/16(火) 19:07:500560デフォルトの名無しさん
2009/06/16(火) 19:10:14原因は分かったような気がするが、解決策が分からん
0561デフォルトの名無しさん
2009/06/16(火) 19:13:02コード画面のリストから選ばなきゃだめだよ。
選ぶと自動的にヘッダーが画面に出てくる。
ttp://windyakin.if.land.to/src/up38_1280.png
リストの中にUserFormとかInitializeってのが見あたらなかったら
それはプログラムを書く場所が間違ってる。
0563デフォルトの名無しさん
2009/06/16(火) 19:16:35Public
0564デフォルトの名無しさん
2009/06/16(火) 19:21:38たぶん、こういうこと
ttp://windyakin.if.land.to/src/up38_1281.png
0565デフォルトの名無しさん
2009/06/16(火) 19:33:27リストから選べばPrivateも自動的に入るはず。わざわざ消した?
0566デフォルトの名無しさん
2009/06/16(火) 20:03:48で(このときモジュールレベルでtxt変数宣言)って書いてあるから
>>564で答えが出ているけどtxtをパブリック変数として宣言すれば解決じゃね?
0567デフォルトの名無しさん
2009/06/17(水) 01:44:03勉強しながらマクロを使ってます。
いろんなマクロを作成、使っていて、そんなたいしたマクロではないんですが
何回か走らせてると処理スピードががくんと落ちて終わらなくなることがあります。
(普段なら数秒で終わるループなど)
そんな現象がおきるようになったのは自分がオブジェクト変数や配列変数を使うようになってからなので
使いかたが雑なのかと反省して、オブジェクトには使いおわったらNothingを代入、
配列はEraceしてやるなど勉強不足だった点を補ってやってもまだたまに発生します。
いちどExcelを終了するなどしてやればたいがい戻るので自分の知らない「基本」があるんだと思うんですが
原因が特定できずにおります。
このスレの先輩方でこういう経験あるかたがいれば何か思いついてもらえるかもと
書いてみました。
もしこんな質問で思いあたる点あればご教示いただければ幸いです。
0568デフォルトの名無しさん
2009/06/17(水) 01:55:43オブジェクト型の変数はかなり初歩の段階から、それとは知らずに使ってるはずだから
(さもないと意味のある作業が殆ど出来ない)関係ないはず。
配列は、よほど大きい(要素の数が10000以上とか)物を使わない限り、関係ない。
個人的な経験では、Win32APIを続けて10000回ぐらいコールするプログラムを
何回か動かしたらGCで15秒ぐらい動作が固まったことがあった。
0569デフォルトの名無しさん
2009/06/17(水) 02:15:44イベントが溜まって固まったように見えることもあるね。
要所にDoEventsをはさむと改善されることがある。
0570デフォルトの名無しさん
2009/06/17(水) 02:46:02不正なセルを指定したり変な値になったりするとプログラムがエラーに
なってとまりますが、プログラムがとまらないように、そういうエラーを
無視して#N/Aなどの値を返すようにするにはどうすればいいですか?
0571デフォルトの名無しさん
2009/06/17(水) 03:07:24VBAの中では#N/Aを返すことはできないけどOn Errorを使えば
エラーを無視して続行することは可能。
0572デフォルトの名無しさん
2009/06/17(水) 03:09:45エラーが発生した時、システム変数Errにエラーコードが自動的に入るようになってるから、
それを調べればいいと思う。
0573デフォルトの名無しさん
2009/06/17(水) 03:14:21この必要性がよく分からない。
なんかの変数がそのインスタンスを参照してるとGCorが回収してくれないから
Nothingを代入しろって事だと思うけど
そもそも、ローカル変数の寿命って関数を出たときだから、Nothingを代入する必要ないんじゃない?
配列に関しても同じ。
実際には、適当なタイミングで一括でGCしてるとおもうけど。
0574570
2009/06/17(水) 03:38:53ありがとうございます。できそうです。
0575567
2009/06/17(水) 07:57:49>>568
APIがどうとか難しいことしたことないんで
私のは別の理由なんでしょうねえ。
>>569
今回相談のケースとは別に確かにそんなケースもあります。
適当なとこにDoEventsってはさんどけばいいんでしょうか。
まだ使ったことないです。
>>573
そう思ってたんでこれまで代入しっぱなしだったんです。
詳しい人のコードみるとだいたい初期化してるし
自分がたまに困ってるんだから自分が間違ってるんだろうと
最近使うようにしてみたんですがあまり変わりません。
0576デフォルトの名無しさん
2009/06/17(水) 08:11:30CPUパワーが足りないとイベントが溜まる可能性が上がるかも。
メモリが足りないとGCの発生率が上がるかも。
どんなスヘ゜ックのマシン使ってる?
0577560
2009/06/17(水) 20:54:28何とかできました
ありがとうございました
0578デフォルトの名無しさん
2009/06/18(木) 00:19:33マクロでマクロが書かれたファイル名自体を変えることってできますか?
Name fileA As fileB
だと、fileAがマクロの書かれたファイル自身でなければうまく動くのですが、
自分自身だとうまく動かないようです。
もしいい方法があれば教えてください。
0579デフォルトの名無しさん
2009/06/18(木) 06:21:33SaveAsで保存してから前のファイルをDeleteする。
0580579
2009/06/18(木) 06:26:510581578
2009/06/18(木) 12:48:21ありがとうございます!
0582デフォルトの名無しさん
2009/06/18(木) 14:23:17Excel 2003
フォームの後ろにBOOKを隠して、Excelを見えないように作成したものがあるのですが
(ドラッグして動かしても位置が同期するので常に見えません)
このファイルを社内の5台のマシンに移して動作確認をしたところ
一台のみエラーになってしまいます
フォームは起動するのですが
そこからなにかアクションを起こすとアプリケーションエラーになるのですが、解決できずに、途方に暮れています
アドバイスお願いします
試みたのは、対象のマシンがsp2だったのでsp3にしたぐらいです
0583デフォルトの名無しさん
2009/06/18(木) 14:56:44それよりも、何かのウィンドウを隠したい場合は位置を合わせるんじゃなくて
そのウィンドウに対してVisible=Falseとやるのが普通。
ほかにも、座標を(10000,10000)にして画面の外に出してしまう手もある。
0584デフォルトの名無しさん
2009/06/18(木) 18:05:52じゃ駄目なのかな
0585デフォルトの名無しさん
2009/06/18(木) 18:08:120586デフォルトの名無しさん
2009/06/18(木) 20:18:38画像のコピーでPicture形式と言うのはBitMapとは違うフォーマットと
言う認識で良いでしょうか?
だとしたらShapeが保持している画像のフォーマットを識別するには
どうしたら良いのでしょう?それらしきプロパティ等が見つかりません。
やりたい処理は画像フォーマットを識別して対応したコピー方法で
Shapeをコピーして行くと言う動作です。
0587デフォルトの名無しさん
2009/06/18(木) 20:47:19UserFormがShowされていればタスクバーをクリックできないのでいいと思った
>>586
無理やりBitmapでコピーするとか
Shape.CopyPicture xlScreen, xlBitmap
0588デフォルトの名無しさん
2009/06/19(金) 00:28:34Microsoft Date And Time Picker Control を使って
時間のデータを取得することは可能でしょうか?
神様!ご教示をお願い致します!
0589デフォルトの名無しさん
2009/06/19(金) 00:31:26OS=XP SP3
Office2003
です。
0590デフォルトの名無しさん
2009/06/19(金) 01:52:170591デフォルトの名無しさん
2009/06/19(金) 06:13:15たぶんできない
0592デフォルトの名無しさん
2009/06/19(金) 07:07:10ありがとうございます。
ユーザーフォームでの時刻入力の他の方法や
関連部品のありか等、ご存知の神様は、
いらっしゃいませんでしょうか?
VBAの参考書を買いに行きましたが、
ユーザーフォームについて詳しく載っている
本は、なかなかないですね。
0593デフォルトの名無しさん
2009/06/19(金) 07:18:06txtbox1.text = Format$(now,"hh:mm:ss")
0594デフォルトの名無しさん
2009/06/19(金) 10:56:06ありがとうございます。
ヒントになりました。
これにスピンボタンをつけて任意の日時を
入力できるようにしたいと思っています。
できれば「日付と時刻のプロパティ」に似たフォームで
入力できるようになるのが理想なんですが。
0595デフォルトの名無しさん
2009/06/19(金) 12:31:430596デフォルトの名無しさん
2009/06/19(金) 18:03:48行全体や列全体を指定して罫線を引くにはどうしたらいいですか?
(セルのborderではなく)
0597デフォルトの名無しさん
2009/06/19(金) 18:37:48こういうこと?
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
0598デフォルトの名無しさん
2009/06/19(金) 19:15:08回答もらっても礼すらしないケースもあるし
0599デフォルトの名無しさん
2009/06/19(金) 19:41:440600デフォルトの名無しさん
2009/06/19(金) 19:42:410601デフォルトの名無しさん
2009/06/19(金) 20:58:49中途半端にタメ口で表面面だけのお礼もらうなら、
無視された方がまし。
0602デフォルトの名無しさん
2009/06/19(金) 21:59:510603596
2009/06/19(金) 22:28:40ありがとうございました
0604デフォルトの名無しさん
2009/06/19(金) 22:55:300605デフォルトの名無しさん
2009/06/19(金) 23:19:12そんなこたーよくあること。
それに質問者ばかりとは限らんね。
回答者で間違いを指摘されてもお礼言わないでむすっとしてる人もよくいるな。
0606デフォルトの名無しさん
2009/06/20(土) 00:48:04一番嫌なのは「自己解決しました」って奴だな。
どうやって解決したのかぐらい書けばいいのにな。
0607デフォルトの名無しさん
2009/06/20(土) 01:14:08ある列にyyyy/mm/ddの形式で入ってるんですが、事情により日付と文字列が混在してます。
それを日付順に昇順で並び替えたいのですが、うまくいきません。
DataOption:=xlSortTextAsNumbers にしてもだめ
並び替えかける前にすべてを数値に変換したあと、並び替えてもだめ
日付に直してもG標準に直してもまったくだめ。
どうしたらいいのかわからず悩んでます。
ちなみに、元日付のやつが先に昇順に並び、そのあと元文字列のやつが昇順に並ぶ。
という感じです。
手動でやると、
数値に変換して昇順で並べ替え
何も変換せずに”数値に見えるものはすべて数値・・云々”のメッセージにチェックを入れる
両方うまくいくのに、VBAにしたとたんできなくなります。
何がだめなんでしょう・・・
0608デフォルトの名無しさん
2009/06/20(土) 01:46:37だから、文字列に変換することを考えたら
例:20090620
0609デフォルトの名無しさん
2009/06/20(土) 07:55:25数値にに変換して駄目って、きちんと数値になってないんじゃないの?
区切り位置などでちゃんとシリアル値に変換してるのか?
0610デフォルトの名無しさん
2009/06/20(土) 13:47:00といった操作をしているんですが、見つかったファイルがどんなファイルであっても、
普段使ってるアプリケーションを使用して開く事は可能ですか?
xlsならエクセル、txtならテキスト、bmpならペイントといった感じで、
shellでプログラムを指定することなく開けますか?
0611デフォルトの名無しさん
2009/06/20(土) 14:23:20文字列に変換ですね。
でも、yyyy/mm/ddを20090101みたいに変換させるプログラムって難しそう・・・(初心者なもので)
>>607
数値に変換した時点で、すべて 38568 みたいなシリアル値になっています。
でもだめなんです。シリアル値でも元日付のやつが先に昇順に並び、
そのあと元文字列のやつが昇順に並ぶんです。
まず30000番台がならんで、その次40000番台がならび、そのあとまた30000番台が並ぶ
みたいになってます。
0612デフォルトの名無しさん
2009/06/20(土) 14:40:08http://wiki.livedoor.jp/uepon2929/d/VBA%A4%AB%A4%E9ShellExecute%A4%F2%BB%C8%A4%A6%CA%FD%CB%A1
0613デフォルトの名無しさん
2009/06/20(土) 18:18:29元のデータが文字列なら"/"を空白に置換する
シリアル値なら書式でyyyymmddと、区切りを入れずに並べる
0614デフォルトの名無しさん
2009/06/20(土) 18:45:06どうすればいい?
何型?とりあえず ObjectとVariantはだめみたいなんだが
0615デフォルトの名無しさん
2009/06/20(土) 18:47:48thx
0616デフォルトの名無しさん
2009/06/20(土) 20:01:33DateValue(Range("A1").Value)
でそのまま日付データを取得することは出来る
但し、年の表示が省略されているとパソコンの年が採用されるので、
意図しない計算結果になることもある
>>614
ちょっとぐぐった感じだと
ObjectとVariantでいけそうだけど
http://q.hatena.ne.jp/1196650964
http://qa.nou-college.net/qa4919500.html
今回だけOption Explicitを辞めるとか
0618デフォルトの名無しさん
2009/06/20(土) 21:12:53object型で何も問題ないけど。
ダメだったのは、何がダメだったのかな。
どこでどんなエラーが出たか書かないと分からないよ。
あと、タメ語はやめたほうがいい。
0619デフォルトの名無しさん
2009/06/21(日) 00:27:29C
D → C
E D
G E
G
というように抜けてるアルファベッドのセルを空白にして
並び替えしたいんですが、どのような命令文書けばできますか?
OSはXPで、エクセルは2003もしくは2000です。
0620デフォルトの名無しさん
2009/06/21(日) 00:39:31すみませんでした
0621>>619
2009/06/21(日) 00:44:260622デフォルトの名無しさん
2009/06/21(日) 00:54:10今までの数々の勘違い発言が分ったような気がする。
0623デフォルトの名無しさん
2009/06/21(日) 00:56:57ダメだったのは、何がダメだったのですか?
どこでどんなエラーが出たか書かないと分からないですよ。
あと、タメ語はやめたほうがいいですよ。
0624デフォルトの名無しさん
2009/06/21(日) 01:29:54Asc("A")
で文字コードが分かる
s = "ABCDE.....XYZ"
instr(s, Range("A1").value)
で順を探してもよさそう
0625デフォルトの名無しさん
2009/06/21(日) 01:35:24これでいいと思うけど。環境は同じです。(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
0626デフォルトの名無しさん
2009/06/21(日) 02:02:39>>625
ありがとうございます。助かりました。
0627デフォルトの名無しさん
2009/06/21(日) 03:10:23If Asc(Cells(TATE, 1).Value) = I Then
Else
Rows(TATE).Insert
End If
何この高度なつり餌
0628デフォルトの名無しさん
2009/06/21(日) 04:11:380629デフォルトの名無しさん
2009/06/21(日) 07:13:52挿入・削除は普通やらないな。
大体>>625は最後はエラーで止まるわな。
配列にためこんで吐き出した方がいいな。
0630625
2009/06/21(日) 09:00:12自分で試したときはエラーにならなかった。
エラーになりますか? ループ件数は上限決まってるし。
アルファベットが昇順になってなければ変になるけど。
0631デフォルトの名無しさん
2009/06/21(日) 09:53:27詳しく教えてもらえませんか?
0632デフォルトの名無しさん
2009/06/21(日) 10:19:48A A
C C
D D
E E
G G
B
F
こんなデータを用意して2列目でソートすればいい。
0633632
2009/06/21(日) 10:21:220634デフォルトの名無しさん
2009/06/21(日) 11:03:26Dim 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
0635デフォルトの名無しさん
2009/06/21(日) 11:06:090636デフォルトの名無しさん
2009/06/21(日) 12:25:17空白セルでAsc(Empty)がエラーにならないか?
2007だとエラーで止まるんだが。
0637634
2009/06/21(日) 12:44:03↓
For Each r In Range("A1:" & Range("A1").End(xlDown).Row)
0638デフォルトの名無しさん
2009/06/21(日) 15:05:34Const 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
0639デフォルトの名無しさん
2009/06/21(日) 15:24:200640625
2009/06/21(日) 15:43:22失礼しました。テストデータに Z を付け加えてたのでエラーにならなかった。
0641デフォルトの名無しさん
2009/06/21(日) 16:06:57大文字の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")をコンパイル時に評価してくれない」 なんて定数なんだから当たり前だよ。
0642デフォルトの名無しさん
2009/06/21(日) 16:41:01("z")
や
("a")
が顔文字に見えてしまう漏れは重症
0643デフォルトの名無しさん
2009/06/21(日) 18:11:10=IF(ISERROR(MATCH(CHAR(ROW()+64),A:A,0)),"",CHAR(ROW()+64))
0644デフォルトの名無しさん
2009/06/22(月) 11:04:06データの先頭が半角大文字のアルファベット限定
Sub a()
For r = 1 To 26
x = Cells(r, 1)
If x <> "" Then Cells(Asc(x) - 64, 2) = x
Next
End Sub
0645デフォルトの名無しさん
2009/06/22(月) 12:19:34[フォーム]
↑のフォームに、選択したファイルをマウスでドラッグして、パスと名前を取得したい
0646デフォルトの名無しさん
2009/06/22(月) 15:12:17VBAだけでは無理。
まずは参照設定を開いて、その中に
Microsoft Visual Basic for Applications Extensibility
ってのがないか確認して。
0647デフォルトの名無しさん
2009/06/22(月) 15:17:22フォームへのドロップはVBAではサポートされてない。
エクセルで開ける形式限定なら、フォームじゃなくてブックへドロップすれば
ファイル名が取得できる。(新たに開いたブックの名前を見ればいいだけ)
0648デフォルトの名無しさん
2009/06/22(月) 17:08:56>464
家帰ったら確認してみます
取り敢えずリストビューを使ってファイルのゲットは出来るんですが
テキストボックスにドロップして、何度か追加操作に対応させたいのです
0649648
2009/06/22(月) 18:13:01バージョン 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
0650デフォルトの名無しさん
2009/06/22(月) 18:31:43ラベルでも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
0651デフォルトの名無しさん
2009/06/22(月) 18:40:53Dim folderPath As String
Dim filePath As String
filePath = Dir$(folderPath, vbNormal)
Do While filePath <> ""
「セル」 = filePath
filePath = Dir$ '次のファイルパス取得
Loop
0652デフォルトの名無しさん
2009/06/22(月) 18:51:41Set hFso = New FileSystemObject
If hFso.FileExists(inPath) Then 'ファイルの処理
〜
If hFso.FolderExists(inPath) Then ' フォルダの処理
〜
Set hFso = Nothing
それよりも、ファイル or フォルダダイアログで選択させるか・・・
0653デフォルトの名無しさん
2009/06/23(火) 07:00:510654デフォルトの名無しさん
2009/06/23(火) 07:09:18処理分けするのではなく、最初から.Filesや.SubFoldersでファイルのみ、フォルダのみを取得した方がいい
あと、Dir関数やGetAttr関数でもファイルかフォルダかの判定は出来る
場合によってはFileExists等の方が都合がよいこともあるが、この件ではわざわざ外部のFileSystemObjectを
使わずとも、組込関数のそれらで十分
しかも、Dir関数の第二引数にvbNormalのみ指定なら、フォルダは取得されないのに処理分けする必要自体が無い
ついでに言うとDir関数で取得されるのはfilePathではなくfileNameな
変数名をどう付けようと動作に問題は無いが、勘違いを引き起こしかねない(読解性が悪い)ので注意な
長々とスマソ
0655デフォルトの名無しさん
2009/06/23(火) 07:13:39朝っぱらからご苦労。
0656デフォルトの名無しさん
2009/06/23(火) 08:22:280657デフォルトの名無しさん
2009/06/23(火) 08:42:54Range(”X1").Formula = Application.WorksheetFunction.統計関数(range(データレンジ))
End With
これだと、統計関数のプロパティが取得できねぇとか言いやがってダメなのな。
結局Worksheets(シート名).activateしろってことか?
0658デフォルトの名無しさん
2009/06/23(火) 09:45:21無意味なWithは何かのおまじない?
0659デフォルトの名無しさん
2009/06/23(火) 11:28:18統計関数のプロパティが取得できねぇってのは、その統計関数が.WorksheetFunctionでは使えないやつなんだろ?
それに仮に使えたとしてもFormulaじゃなくてValueだわな。
動くからそれでいいってわけにはいかん。
0660デフォルトの名無しさん
2009/06/23(火) 13:55:06ラベルの上にドロップするプロジェクトでいいんだよね
やってみたけど動かない……
エクセル2000なんだけどもが
0661デフォルトの名無しさん
2009/06/23(火) 14:49:50不可能ではないけど、そんなに簡単じゃない。
で、手っ取り早くやるには、まず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
0662デフォルトの名無しさん
2009/06/23(火) 15:28:100663デフォルトの名無しさん
2009/06/23(火) 15:51:34ただ、リストビュー以外にもドロップさせられるコントロールがあって、ラベル形式にも対応してい
るかどうかは置いとくか
ファイル取得したら、テキストボックスコントロール追加とかイベント処理でリストビュー再表示とかすればいいだけだな、把握した
0664デフォルトの名無しさん
2009/06/23(火) 16:07:19個人使用なら無問題
>>663
どうしてもドラッグドロップできるラベルが欲しいなら、
リストビューのサイズを1行1列に固定してラベルに見せかければいい
0665デフォルトの名無しさん
2009/06/23(火) 16:15:06めんどくさいことしなくても普通にドラッグ&ドロップに対応してるぞ
ワークシートが使いたいんならVBからExcelオブジェクトを使えばいい
0666デフォルトの名無しさん
2009/06/23(火) 16:42:340667デフォルトの名無しさん
2009/06/23(火) 17:40:54だからパソコンが何台あっても1ライセンスでインスコできる
「開発ライセンス」のが検索のヒット数が多いけどな
で、無料のVS2008EEでもライセンス条件は大差なかったような
0668デフォルトの名無しさん
2009/06/23(火) 17:43:050669デフォルトの名無しさん
2009/06/23(火) 17:50:41KB318597
0670デフォルトの名無しさん
2009/06/23(火) 18:02:450671デフォルトの名無しさん
2009/06/23(火) 21:36:43ttp://www.moug.net/faq/viewtopic.php?t=39255
0672デフォルトの名無しさん
2009/06/23(火) 22:32:42難しいことはそこで聞けばいいじゃん
2chになにを求めているんだい
0673デフォルトの名無しさん
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
しかしソートした結果は
あ、い、う、え、お」は降順、その後ろに「あ、い、う、え、お」以外は昇順 となってしまいます。
どのようにすれば「あ、い、う、え、お」を昇順でソートし、その後ろに
「あ、い、う、え、お」以外を昇順にソートできるのでしょうか。
よろしくお願いします。
0674デフォルトの名無しさん
2009/06/23(火) 23:37:040675デフォルトの名無しさん
2009/06/24(水) 01:09:22A�@�A�B�C�D
B○○○○○
C○○○○○
D○○○○○
E○○○●○
F○○○○○
こう言う表を作製して、たとえば「�C、E」と入力したら●がある場所の文字が
指定した所に出るようにしたいのですが、どうしたらいいのでしょうか?
0676デフォルトの名無しさん
2009/06/24(水) 01:34:13英語はアスキーか何かで数字データに置き換え
セット 変数 = A�@のレンジ.オフセット(英,数)
出力先 = 変数
変数と処理先を配列にすれば多元処理出来る
詳しいコードは誰かが書く
0677デフォルトの名無しさん
2009/06/24(水) 01:59:57ワークシートのこの位置にデータが入っていたとすると
.A.B C D .E .F
1 A�@�A�B�C�D
2 B○○○○○
3 C○○○○○
4 D○○○○○
5 E○○○●○
6 F○○○○○
=INDEX(A1:F6,MATCH("E",A1:A6),MATCH("�C",A1:F1))
0678デフォルトの名無しさん
2009/06/24(水) 02:08:37>>677
ありがとう。なんとなくだけどわかった気がする
0679デフォルトの名無しさん
2009/06/24(水) 02:17:52降順てのがわからんね
ARRAY(”あ”,〜”お”,”*”)
にすれば、取り敢えず
あ い う え お 1 5 か き く
とかなるんじゃ
リストにランダムな文字設定してどう並び変わる
0680デフォルトの名無しさん
2009/06/24(水) 07:22:30SortMethod:=xlPinYin は必要ですか?
やりたいことっていうのが
「1バイト文字や2バイト文字の英数字よりもひらがなの あ〜お を優先したい」
ってことなのかな?
0681デフォルトの名無しさん
2009/06/24(水) 09:04:43頒布(再頒布)ライセンスは、自作のアプリにMS作のランタイムを同梱する場合に必要な物
これが無い場合、「ランタイムは別な場所から落として導入してください」ってことになる
VBやVSの下位エディションはこれが無く、上位エディションには頒布ライセンスが付いてくる
OfficeVBAからVBランタイムを使用する場合に必要なのは開発ライセンス(VB6等の使用ライセンス)
個人利用なら頒布ライセンスは関係ないので下位エディションでも問題ない
VBランタイムは「VBで作成されたアプリから使う」場合に限り無償で使える物なので、
VB開発環境のライセンス無しにランタイムだけ入れてVBAから使うのは個人利用でも不正行為
0682デフォルトの名無しさん
2009/06/24(水) 11:26:030683デフォルトの名無しさん
2009/06/24(水) 12:48:360684デフォルトの名無しさん
2009/06/24(水) 15:13:50それ、何の意味があるの?
VSEE(.NET以降)には、VB6以前用のActiveX系ランタイムの
自由使用権利は含まれないんだけど
無料のVB5CCEも然り
とにかくVBランタイムをVBAで使う権利は、無料では手に入らない
0685デフォルトの名無しさん
2009/06/24(水) 15:38:01ソースは?
ちなみに、
http://msdn.microsoft.com/ja-jp/vbasic/cc707268.aspx
では、そのようなことは書かれてないけど。
0686デフォルトの名無しさん
2009/06/24(水) 15:45:33いろいろうるさいから
0687デフォルトの名無しさん
2009/06/24(水) 15:49:42今まさに、ライセンスについて未解決
主張はあるが根拠が示されてない
事実ならmsdnのどっかに書いてあるはず
検索してリンクを貼ってくれ
0688デフォルトの名無しさん
2009/06/24(水) 15:53:510689デフォルトの名無しさん
2009/06/24(水) 17:56:090690デフォルトの名無しさん
2009/06/24(水) 18:41:39ぐだぐだ言わずにソース貼れ、アホ
0691デフォルトの名無しさん
2009/06/24(水) 18:48:33VBAでセルの書式を設定する時にエラーになるとしたら
どんなエラーが考えられますか?
0692デフォルトの名無しさん
2009/06/24(水) 19:23:560693デフォルトの名無しさん
2009/06/24(水) 19:41:56いえ、2003用に書いたマクロを2000で実行する場合です。
0694デフォルトの名無しさん
2009/06/24(水) 20:13:44マシンが変わると使えるフォントが変わる
0695デフォルトの名無しさん
2009/06/24(水) 21:12:47FileSearchを使うとパス名がバグるんですが、何故でしょう?
\\168.192.10.1\フォルダ1\…の、
フォルダ1の部分が文字化けしてしまいます。
理由と回避方法をご教授願います。
0696デフォルトの名無しさん
2009/06/24(水) 21:45:260697デフォルトの名無しさん
2009/06/24(水) 22:10:16なんの事でしょう・・・?
後ろの…の部分は普通にただのフォルダなんですが、
フォルダ1ってのはネットワーク上に更に名前の付けられた部分です。
マイコンでネットワークドライブの割り当てをすると、「168.192.10.1のフォルダ1」となる部分なんですが。。。
0698デフォルトの名無しさん
2009/06/24(水) 22:16:17今検索中。
0699696,698
2009/06/24(水) 22:17:30http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200812/08120029.txt
0700696,698,699
2009/06/24(水) 22:25:00http://www.excel.studio-kazu.jp/kw/20081114170632.html
ここで紹介されているのがこれ↓
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1310972723?fr=rcmd_chie_detail
0701デフォルトの名無しさん
2009/06/24(水) 22:48:180702デフォルトの名無しさん
2009/06/24(水) 22:56:05エラーになれば持ってないってこったな
0703デフォルトの名無しさん
2009/06/24(水) 23:08:15フォルダ名をUTF-7にすればいいんでないの
0704デフォルトの名無しさん
2009/06/25(木) 00:02:26ホントかどうかは知らんが、
別のアプリの一部だから勝手に横から使っちゃダメなんだとさ
0705デフォルトの名無しさん
2009/06/25(木) 00:03:12みたいな形式にエンコードする
0706デフォルトの名無しさん
2009/06/25(木) 00:22:571 品名|店舗|数量| 貸出日 |返却予定日 |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です。
宜しくお願いします。
0707デフォルトの名無しさん
2009/06/25(木) 01:08:08これでいいの?
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本来の使い方なんだけどね。
0708デフォルトの名無しさん
2009/06/25(木) 02:02:02ぼけ、そのためのライセンスキーだろが
不正にライセンスキーを操作してなければ、
使える=ライセンスを持ってるってことだろが
0709デフォルトの名無しさん
2009/06/25(木) 02:07:05ソフトにはいってるけど、課金しないと解除できないコスプレゲームみたいな
だから解除したもんを配布するなという箱的な何かなのか
0710648
2009/06/25(木) 02:10:50使いやすくてすっごいソフトで安いエクセルがあるっていうから調べたんだけど
エクセルソフトピュアっていう
トイレットペーパーだった
0711デフォルトの名無しさん
2009/06/25(木) 02:12:530712デフォルトの名無しさん
2009/06/25(木) 08:43:19最初のリストが個人管理のエクセルファイルの一部を取り出しているものなので
この方法のほうが助かります。
ありがとうございます。
0713695
2009/06/25(木) 08:52:39ネット上のフォルダなので、自分が名前を変える事はできません。
その2バイト文字をうまく戻す方法とかありますか?
.SubFolderを使って下の階層のフォルダを走査してますが、
ルート+見たフォルダで値を返せばいいのかと思うんですが、
方法が思い当たらず、、、
0714デフォルトの名無しさん
2009/06/25(木) 09:04:05早くソース出せ
0715デフォルトの名無しさん
2009/06/25(木) 12:11:19うちじゃ再現しないお
鯖がWindowsだと大丈夫なのかなあ
0716デフォルトの名無しさん
2009/06/25(木) 13:46:000717デフォルトの名無しさん
2009/06/25(木) 13:55:23>>681は常識だろぼけ
>>685はサポートの話でライセンスの話じゃないだろぼけ
ライセンスのことは>>669をみろぼけ
0718デフォルトの名無しさん
2009/06/25(木) 14:27:55「常識だろ」ではなんの説明にもなっていない。
明文化されたソースがないのであれば、
そりゃ単なるFUDじゃないかと疑いたくもなる。
0719デフォルトの名無しさん
2009/06/25(木) 14:39:500720デフォルトの名無しさん
2009/06/25(木) 14:41:51なに見当違いのKB貼ってんだよ
はよ>>681のソース出せ、馬鹿
0721デフォルトの名無しさん
2009/06/25(木) 16:25:20少なくとも>>685では、VistaでVBAからVB6のコンポーネントを使う場合に何か制限があるとは
書かれていない。
VistaでもXPでもどちらでも良いので、使ってはいけないことが書かれているソースplz
0722デフォルトの名無しさん
2009/06/25(木) 16:26:34不明な項目については、コントロールの使用許諾契約書をご覧ください。
"All Rights Reserved" は、契約書に明記されている項目についてのみ権利があるということを意味するものです。
使用許諾契約書で許可されていない (または許可されているかどうかが不明な) 行為は、ライセンス違反と見なします。
注意 : Visual C++ および Visual Basic に付属する ActiveX コントロールもライセンスされています。
これらを HTML ページで使用する場合にも上記の手順に従ってください。
だってさ。使用許諾契約書で許可されてんのか?ぼけ
0723デフォルトの名無しさん
2009/06/25(木) 16:32:06MSCOMCTL.SRG
があるからライセンス持ってるってことだな
0724デフォルトの名無しさん
2009/06/25(木) 16:35:20そのすぐ下に、「ここに書いてある内容は正しいとは限らないよ」(意訳)
って書いてあるんだよなあ。
どうしよう?
0725デフォルトの名無しさん
2009/06/25(木) 16:36:260726デフォルトの名無しさん
2009/06/25(木) 16:39:06その下に問い合わせってのがあるだろ?
0727デフォルトの名無しさん
2009/06/25(木) 16:41:24Microsoft ActiveX SDK
それ以外のルートで入手したOCXはどうなんだろう
0728デフォルトの名無しさん
2009/06/25(木) 17:13:11なんで回りくどいKBしか貼れないかなー。
今問題になってるのは、VBAでmscomctl.ocxを使用するときに、VB6の開発者ライセンスが
必要かどうかなんだけど。
早く、それをしてはいけないというソース貼れよ
0729デフォルトの名無しさん
2009/06/25(木) 17:18:490730デフォルトの名無しさん
2009/06/25(木) 17:26:32ってことでFA
0731デフォルトの名無しさん
2009/06/25(木) 17:28:240732デフォルトの名無しさん
2009/06/25(木) 17:30:36警告が出なければ、使っていいんじゃないの?
XPでは知らんけど。
0733デフォルトの名無しさん
2009/06/25(木) 17:55:56ついでにKBに追加するよう言っとけよ。ほかにもばかがいそうだ
0734デフォルトの名無しさん
2009/06/25(木) 21:08:12どんだけ俺様ルールなんだよw
0735デフォルトの名無しさん
2009/06/25(木) 22:34:15質問スレなんだから誰かの常識とか言う回等が意味を成すと思ってんの課ksg
0736デフォルトの名無しさん
2009/06/25(木) 23:13:30http://www42.atwiki.jp/syugyou/pages/186.html
0737デフォルトの名無しさん
2009/06/26(金) 00:00:34不正にライセンスキーを操作しない限り、ライセンスキーで守られているってことだろぼけ
0738デフォルトの名無しさん
2009/06/26(金) 11:39:35京アニ儲の暗号ですね
0739デフォルトの名無しさん
2009/06/26(金) 12:32:50ちゃうねん
0740デフォルトの名無しさん
2009/06/26(金) 14:05:26ソースまだぁ?
0741デフォルトの名無しさん
2009/06/26(金) 14:26:000742デフォルトの名無しさん
2009/06/26(金) 14:48:510743デフォルトの名無しさん
2009/06/26(金) 18:54:370744デフォルトの名無しさん
2009/06/26(金) 23:56:45B1〜B4500を選択するにはどうするべき?
つまりA1〜データのある一番の行までを選択して、それをそのままを右に1列ずらす形なんですが
0745デフォルトの名無しさん
2009/06/27(土) 00:00:14Range("A1:A4500").Offset(, 1).Select
0746デフォルトの名無しさん
2009/06/27(土) 00:47:040747デフォルトの名無しさん
2009/06/27(土) 09:40:150748デフォルトの名無しさん
2009/06/27(土) 17:03:44Worksheets_Change でTarget.valueによって条件分岐したいのですが、
Targetがセル範囲で、さらにChangeの内容がClearContentsの場合、
「型が一致しません」(Selectの選択肢と)というエラーが出ます。
おそらく、ClearContentsによって更新された(消された)後の
セルのデータ型が問題なんですが、
�@このときのデータ型は何?(ちなみに書式設定は「標準」です)
�ANullでも""でもダメなので、どういう選択肢を設ければ良いのか?
以上、分かる方、お願いします。
Excel2003使用です。
0749デフォルトの名無しさん
2009/06/27(土) 17:06:18それでブレークポイントかけて中身確認とか。
0750デフォルトの名無しさん
2009/06/27(土) 17:23:28そうすると、もしTargetがセル範囲だと、配列になってしまって
条件分岐は難しくなりますね。
セル範囲をClearContentsする場合って、内部的には
ひとつずつ処理するんですかね?
それだと、複数のデータ型が混じっちゃうこともありえますが。
一応、条件分岐の最初で、If IsNumeric(Target.Value)でひっかけては
いるんですが。
Targetがセル範囲か単独セルか(If Target.Columns = 1 の構文はダメ
でした)判定する方法はありますか?
0751デフォルトの名無しさん
2009/06/27(土) 17:34:53たぶん、参考書かなんかで推奨しているのはVBAの例外棋王を使うことだと思うけど
なんか、頼り泣くね?というかON ERRER割り込みとか使いにくくね?
例外が発生したときの戻り値をEmptyにして返して
呼び出し元でIsEmptyでチェックしてたら、IsEmpty(Empty) = Falseになるので使い物にならない。
たぶん、戻り値の型のIntegerやStringがEmptyを許容出来ない、Empty値として格納できない型だからIsEmptyが常に技になるんだと思う
(だったら、代入するときにエラー出せよ)
一応現在は、integerなら-1、stringなら""を返して、エラーチェックしてるが
どうすれば良いんだ?
0752デフォルトの名無しさん
2009/06/27(土) 17:54:31IsEmpty(Target)で空かどうか調べる。
Target.Cells.Countでターゲットが1つのセルかセル範囲か分岐する。
面倒だけど1つずつチェックしていくしかない。
0753デフォルトの名無しさん
2009/06/27(土) 17:58:11関数の戻り値はエラーかどうかの結果にして
処理したい変数はByValで渡す
0754デフォルトの名無しさん
2009/06/27(土) 19:34:49Sub test()
a = Range("A3:B5")
MsgBox UBound(a, 1)
MsgBox UBound(a, 2)
End Sub
0755デフォルトの名無しさん
2009/06/28(日) 01:20:07textboxに数値データ以外打ち込めないようにするには
どう入力すればいいんでしょうか?それともプロパティで可?
OSはvistaでExcel2007です
0756デフォルトの名無しさん
2009/06/28(日) 02:37:19プロパティで出来るかどうかぐらい、リファレンス見れば分かるだろ
オーソドックスなのはOnKeyPressなりで入力させたい文字だけスルーして、入力させたくない文字をKey = 0 というように書き換えればおk
0757デフォルトの名無しさん
2009/06/29(月) 06:07:15各評価方法で、任意の製品の評価値を求めたい
この場合、評価値を算出するコードはシートに書いた方が良い?
それとも、シートのほかに標準モジュールを作って、それに書いた方が良い?
シートにコードを直接添付させると、データとその処理方法の関連性を持たせやすい。
また、Worksheet名を省略できるので、多少スマートにかける。という2つのメリットがあると思われるが
どうやらシートに直接コードを書くと、デバッグ時にエラーの発生したコードを特定しにくい(デバッガが特定してくれない)ということもあるようで
コードは標準モジュールに書かないとイケナイのかな〜と悩んでます
0758757
2009/06/29(月) 06:29:56シートAには製品の人気が、シートBには製品の体積が載っています。
各シートには独自の評価用の関数があります(形は以下のよう)
Function SheetA.GetValue(pid as integer) as double (Bも同様)
この関数の内部では、シートの情報(人気など)に基づいてシート独自の計算式により評価値が算出されます。
最終的に、評価値の平均をとるなり、合計をとるなりで総合評価を求めます。
--- 目的はここまで
各シートごとに評価するための方法が違うので、別々にコードを書く必要があり
そのコードをどこに書くかで悩んでます。
シート上に書くメリット: コードを参照しやすい、コードがシンプルになる
デメリットト: デバッグがしにくい(?)
それと、もう一つ質問なんですが
クラスモジュールを使ったところで、クラスの派生が出来ないので、
抽象クラスなりインターフェースなりを作っておき。
それに基づいて、各サブクラスを実装する…ということは出来ませんよね?
(正直、クラスモジュールの使い道が分からない。構造体+関数?)
0759デフォルトの名無しさん
2009/06/29(月) 07:08:38俺個人ならば、シートに記述出来るならそうする
出力先が今後不透明になるならコードで出力する
0760757
2009/06/29(月) 08:16:06なんか勘違いされてるようなので捕捉
>>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の例外機構が貧弱なため起きること?)
0761デフォルトの名無しさん
2009/06/29(月) 10:25:510762デフォルトの名無しさん
2009/06/29(月) 10:32:28(,,゚Д゚)!
って確かめたら消えてないか。センブラのポップアップでは表示してくれないみたいですね。
とりあえずほかのロダにもあげときますね
http://lovestube.com/up/src/up10221.png
http://lovestube.com/up/src/up10222.png
http://lovestube.com/up/src/up10223.png
0763デフォルトの名無しさん
2009/06/29(月) 11:19:05部品化したモジュールをシートから呼び出す処理をしたらどうか?
引数でも関数でもいいし、怪しげな部分を丸投げしてもいい
0764デフォルトの名無しさん
2009/06/29(月) 11:40:25シートにはコードはなるべく入れない。なぜなら、同じ機能を持ったシートをコピーor追加したときに困るから。
>クラスモジュールを使ったところで、クラスの派生が出来ないので、
>抽象クラスなりインターフェースなりを作っておき。
>それに基づいて、各サブクラスを実装する…ということは出来ませんよね?
できる。vba implementsでググれ。
実装の継承は出来ない。
あと、良くわからんけど、raiseとかwith eventsとか調べとけ
0765デフォルトの名無しさん
2009/06/29(月) 11:42:490766デフォルトの名無しさん
2009/06/29(月) 12:42:19ひとつの案だけど、デバッグの必要なときはデバッグしやすい形にして、
実行時は実行しやすい形にする、ってどうよ
個人的に、シートにはなるべく書かないようにするけどね
0767デフォルトの名無しさん
2009/06/29(月) 18:46:32計算式関数が専用モジュールにまとまっていれば、
それはそれでデバッグしやすいと思うんだけどなぁ?
シートにコードがあると第三者にコピペされた時超面倒
0768757
2009/06/29(月) 19:21:56>シートにはコードはなるべく入れない。なぜなら、同じ機能を持ったシートをコピーor追加したときに困るから。
むしろ、同じコードごとコピーされるので都合が良いのでは?
作成するシートが6,10程度であれば
コピー先の変更をコピー元にフィードバックさせたいときには手動でコピペしても良いですし
コピペできないほどの数のシートをExcelで扱うのは厳しそうですしね。
クラスモジュール化して、インスタンスごとにシートを割り当てることを考えても
処理を少し変えたいだけで別のクラスとしてコピペする必要があります。
>implements
なるほど、抽象関数とその実装はVBAでも出来るんですね。
実装済みの関数の処理の追記は出来ないと…
むしろ、すべての関数を上書きする必要があるんですか…
一度、クラスモジュールでくめるか考えてみます。
(Dim/Setの行がまた増えそうです orz
何で宣言と同時に代入が出来ないんだ…
そもそも、LetもSetも出来る型なんて無いんだから、使い分けなくて良いだろうに)
しかし、自分のメンバの関数を呼び出すときに
いちいちAbstractClass_Methodとするのもかっこわるいようなw
>raise
エラーメッセージも送ることが出来るんですね。
定義済みのエラー番号しか送れないかと思ってました。
が、On Errorで受け取る気にはなれないので、自発的に例外を発生させることはないと思います。
0769757
2009/06/29(月) 19:22:57エラーメッセージも送ることが出来るんですね。
定義済みのエラー番号しか送れないかと思ってました。
が、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とありますが
オブジェクトブラウザでは検索に引っかからないんですよ。
0770757
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
モジュールに書いた方がエラーの特定がしやすいため、
デバッグはしやすくなると思います。
また、第三者の手に渡ったときには、私は絶対に手を出さないので
その点は(・ε・)キニシナイ!! つもりです。
結局、シートに書きたいことは、シートのデータへのインターフェースを書きたいだけだから
そのコードはソノシート内で完結していて、シートをコピーする事による副作用は無いと考えて良いと思います。
0771デフォルトの名無しさん
2009/06/29(月) 20:26:46>しかし、今回の目的には利用できなさそうです。
初心者のくせに簡単に判断してんじゃねーよ。
つーか、もっと調べてから質問しろ。
頓珍漢すぎて答える気にならんわ。
0772デフォルトの名無しさん
2009/06/29(月) 20:30:550773デフォルトの名無しさん
2009/06/29(月) 20:38:04評価クラス&strategy pattern
0774デフォルトの名無しさん
2009/06/29(月) 20:43:500775デフォルトの名無しさん
2009/06/29(月) 21:06:15コピペでいいじゃない。
0776デフォルトの名無しさん
2009/06/29(月) 22:04:41selectとどう違うのでしょうか?
0777デフォルトの名無しさん
2009/06/29(月) 22:22:400778デフォルトの名無しさん
2009/06/29(月) 22:41:30>実装の継承はできないって書いてるだろうが。よく読め。そして調べろ。
ええ、それは理解しているつもりです。
実装済み〜上書きする の節は不要でしたね。
実装の継承がされないのですから、元クラスの実装部の有無に関わらず
実装クラス(implements〜がかかれているクラスモジュール) で実装しなければならないのは当然のことです。
>初心者のくせに簡単に判断してんじゃねーよ。
Worksheetで発生したイベント(*1)を処理したいとは考えていません。
ですのでWithEventsは要となるようなキーワードではないと思います。
抽象クラス・インターフェースがつかえることが分かったので
最低限必要な機能を洗い出して、抽象クラスとしてまとめるつもりです。
その際にイベントを定義することはあるかもしれません。
*1: Worksheets.SelectionChange など
>>772
>メンバ変数にシートを持たせる
そのメンバ変数に代入するタイミングがない。
(毎回、空かどうか調べて、Setするのもありかもしれませんが・・・)
>引数に
それをするくらいなら、ほかの方法(クラスモジュール化するとか)をとった方がスマートです。
>>774
変えましたよ。シート内で発生したエラーも捕捉できるようになりましたよ。
すでにシートにコードを書く気は失せてましたけど、
0779デフォルトの名無しさん
2009/06/29(月) 23:01:05切れてたので追加
>>774
変えましたよ。シート内で発生したエラーも捕捉できるようになりましたよ。
すでにシートにコードを書く気は失せてましたけど、
一瞬、「やっぱりシートにコードかいても良いかな」とか考えましたよ。
どうせ書きたいコードはインスタンス化する必要のない
静的なものですから、クラスを使うメリット無いなとか
シートにImplements IClass とかつければ、IClassとして扱えるようになって
すべて問題は解決したんじゃないかとか考えてしまいました.
0780デフォルトの名無しさん
2009/06/30(火) 09:52:35メリットはなんぞ?
0781デフォルトの名無しさん
2009/06/30(火) 11:36:43VBA使ってれば、知らないうちにクラスのお世話になってる
0782デフォルトの名無しさん
2009/06/30(火) 11:48:26> >初心者のくせに簡単に判断してんじゃねーよ。
> Worksheetで発生したイベント(*1)を処理したいとは考えていません。
> ですのでWithEventsは要となるようなキーワードではないと思います。
classにイベントを定義して、withevents付きでインスタンス化すれば、クラスのイベントを一括して
ハンドリングできたりする。
それと、インスタンス化する関数の引数にシートを渡せばいいじゃん。いやなの?
0783デフォルトの名無しさん
2009/06/30(火) 11:59:41そのままシートにコードを書くのが一番簡単だろ。
悩むことなんか無いのに。
0784デフォルトの名無しさん
2009/06/30(火) 14:40:07ならば、そのままシートにマクロ書けばいいと思うけど、なんか問題あるの?
0785デフォルトの名無しさん
2009/06/30(火) 15:35:48ユーザーフォームにリストボックスとコマンドボタン(とラベル)を1つずつ作りました
リストボックスには他のシートの名前が入っています
Private Sub UserForm_Initialize()
Start_Sheet_1.ListBox1.AddItem "Sheet1"
Start_Sheet_1.ListBox1.AddItem "Sheet2"
ここまでは記述したのですが、コマンドボタンを押したとき
選択したシートに移動するコードはどうすればいいのでしょうか
初心者の質問ですみません
お答えお願いします
0786デフォルトの名無しさん
2009/06/30(火) 15:53:30worksheets(listbox1.list(listbox1.listindex)).select
end if
0787785
2009/06/30(火) 16:13:27リストボックスよりコンボボックスのほうが使いやすそうでコードもできました
すいませんでした
0788デフォルトの名無しさん
2009/06/30(火) 17:27:090789デフォルトの名無しさん
2009/06/30(火) 17:54:53ピボットテーブルの区切り文字が時々勝手に変わる(ように見える)
のですが、何が原因でしょうか…
月次で帳票を作成していて、5月分は
データーフィールドが
合計 : Salary
と表示され
6月分は
合計 / Salary
と、コロンがスラッシュに勝手に変わっているのです
な… 何を言ってるのか わからねーと思うが
おれも何をされたのかわからなかった…
という気分です
0790デフォルトの名無しさん
2009/06/30(火) 17:58:280791デフォルトの名無しさん
2009/06/30(火) 18:11:12スレチなら誘導くらいしてやろうぜ……?
0792デフォルトの名無しさん
2009/06/30(火) 21:41:32保存していないtxtファイルを新規で立ち上げて
そこに出力したいのですが
いまいちわからないのですが教えてください
保存しているファイルを立ち上げてとかならググったりして見つかるのですが
0793デフォルトの名無しさん
2009/06/30(火) 21:56:58それはVBScriptやVB6でも出来ることで
VBAの分野の話ではないからスレ違い(>>4参照)
待ってれば半端な知識をひけらかしたい奴が
答えてくれるかも知れないがなw
0794デフォルトの名無しさん
2009/06/30(火) 22:09:22と言ってるんだからVBAだろ
>VBAで何かしら取得したデータを
VBScriptやVB6に渡せないことはないが
0795デフォルトの名無しさん
2009/06/30(火) 22:11:38with range("A1:F8")
.clearcontents
.unmarge
.marge
end with
range("A1").borders(xldaigup).linestyle = xlconteinue
このコードだとエラーでるんですがどこが駄目なんでしょうか?
上のコードでやろうとしてることは
A1からF8までの文字列を消してから
A1からF8内の部分的に結合されている所を解除して
次にA1からF8までをすべて結合してひとつのセルにしてから
罫線を引いてみてます。
ちなみにコードのスペルミスはご容赦ください。 いま手元にエクセルがないので
記憶で打っているので細かいスペルがわからんのです。
0796デフォルトの名無しさん
2009/06/30(火) 22:14:21マクロの記録でできそうだけど
0797デフォルトの名無しさん
2009/06/30(火) 22:17:45いじくりながら勉強してるとこなんです。
0798デフォルトの名無しさん
2009/06/30(火) 22:29:29試してはいないけど、罫線引くときのセルの指定は.margecellsを加えて
「a1セルを含むセル範囲」っていう感じにしなきゃいけなかったような。
ちょっと今から試してみる。
0799798
2009/06/30(火) 22:36:12肝心の綴りから違ってますよ。
×unmarge ○unmerge
×marge ○merge
0800798
2009/06/30(火) 22:40:15xlconteinueも綴り間違いみたい。F1キー押しても「キーワードが見つかりません」て出る。
0801798
2009/06/30(火) 22:51:57Sub テスト2()
With Range("A1:F8")
.ClearContents
.UnMerge ←訂正済み
.Merge ←訂正済み
End With
Range("A1").Borders(xlDiagonalUp).LineStyle = xlContinuous ←2カ所訂正済み
End Sub
×xldaigup ○xlDiagonalUp
×xlconteinue ○xlContinuous
少なくとも、マクロの記録をしてたら間違うはずないんだけど。
0802デフォルトの名無しさん
2009/06/30(火) 23:33:20> と言ってるんだからVBAだろ
最初にVBAでデータ取りしたら
その後のExcelに係わらない処理まで全て
VBAの範疇になるなんてことは無い
0803デフォルトの名無しさん
2009/07/01(水) 07:53:44そうでないと思う奴が答えればいい
中途半端だろ
0804デフォルトの名無しさん
2009/07/01(水) 09:36:23VBS、VB6にデータを渡して処理するのが正解?
0805デフォルトの名無しさん
2009/07/01(水) 12:44:280806デフォルトの名無しさん
2009/07/01(水) 12:57:10>保存していないtxtファイルを新規で立ち上げて
これってメモ帳とかを起動してそこに書き込みたいってこと?
だったら確かにスレ違いだ
やり方があるとすれば
1.メモ帳を起動してプロセスIDを取得しておく
2.書き込みたいデータをクリップボードに入れる
3.プロセスIDを使って起動したメモ帳に貼り付ける
大雑把に言うとこんな感じになると思う
API使ったりすることになりそうだが
細かいことはスレ違いだしググレ
0807デフォルトの名無しさん
2009/07/01(水) 13:59:55エクセル使うためにテキスト制御するならスレチってわけでもないんじゃね
そもそもFSOだとかなんとかはエクセルVBAに装備されてるし、CSVなんてのもあるし
具体的にはググれ
0808デフォルトの名無しさん
2009/07/01(水) 14:01:430809デフォルトの名無しさん
2009/07/01(水) 14:09:30アフォだなぁ。
新規.txtを作って、それを実行すればいいじゃん。
0810デフォルトの名無しさん
2009/07/01(水) 14:12:440811デフォルトの名無しさん
2009/07/01(水) 14:17:20共通語で書いてくれればスレチでもコードぐらいいくらでも書く
0812デフォルトの名無しさん
2009/07/01(水) 14:18:14そのモジュールの中だけで使えるファンクション
0813デフォルトの名無しさん
2009/07/01(水) 14:33:28確かにそう最初はそう思った
でも「保存していない」って書いてある以上
VBAでファイルを作ってどうこうなんて論外だと思ってこう書いた
0814デフォルトの名無しさん
2009/07/01(水) 15:31:31立ち上げ、じゃなくて、実行ね。
キミひょっとして、.txtをオープンするのに、プログラム名指定したりしてんの?
0815デフォルトの名無しさん
2009/07/01(水) 15:32:320816デフォルトの名無しさん
2009/07/01(水) 15:33:280817デフォルトの名無しさん
2009/07/01(水) 15:40:49俺はスレチとは思わんが、コードは書かない。
0818デフォルトの名無しさん
2009/07/01(水) 15:54:300819デフォルトの名無しさん
2009/07/01(水) 16:18:170820デフォルトの名無しさん
2009/07/01(水) 17:36:520821デフォルトの名無しさん
2009/07/01(水) 17:42:390822デフォルトの名無しさん
2009/07/01(水) 18:47:00>ブックじゃなくてテキストファイルを醤油にしてるけど、
醤油にしてるっつーのはどういう意味?
0823デフォルトの名無しさん
2009/07/01(水) 19:06:52だと思われ
0824デフォルトの名無しさん
2009/07/01(水) 19:08:250825822
2009/07/01(水) 19:12:490826デフォルトの名無しさん
2009/07/02(木) 14:13:340827デフォルトの名無しさん
2009/07/02(木) 23:14:11do
msgbox ">>1乙"
loop
end sub
こーゆー連続でメッセージボックスが出るマクロってESCキーで止まんないんだけど
どーやって止めんの?
0828デフォルトの名無しさん
2009/07/02(木) 23:15:530829デフォルトの名無しさん
2009/07/02(木) 23:48:250830デフォルトの名無しさん
2009/07/03(金) 01:10:420831デフォルトの名無しさん
2009/07/03(金) 02:03:59↓
0832デフォルトの名無しさん
2009/07/03(金) 02:32:44|
|
|
| ↑
|┌┘ ┌─→
└┴─┬┘ ∧_∧
└─┐ ´・ω・`)
←┐ ┌┘ /U
┌┴──┼────→
| ↓
0833デフォルトの名無しさん
2009/07/04(土) 10:30:09今年より社会人として働きはじめました。
業種は平たく言えばリース会社です。
新入社員教育として、ひたすらレポート、書類作成をしてきました。
エクセル自体余り使ったことがなく、書類はエクセルで書いたほうが便利なのかぁ〜っと、先輩から教わりつつ、業務教育を受けていました。
今月に入り突然上司より、VBAでツール作ってもらうからっと言われました。
プログラムなんて完全に未経験ですし、エクセルでもようやく文章をかけるようになった程度です。
そこで質問なのですが、初心者向けの参考書や、勉強法などありましたら、教えてください。
今はエクセル VBAで検索をし、上位に表示されるサイトを参考に勉強しています。
ツール自体どんなものを作るのか不明で、確認をとってみても勉強しといての一点張りです。
恐らく在庫管理かなにかで利用するツールではないかと思うのですが……
長々となってしまい、また質問内容も明確でないかも知れませんが、よろしくお願いします。
ちなみに私以外ほぼ客先に出ているため、社内で教えてもらうのは不可能です。
自分高卒なんで、会社も属に言うブラックなのかもしれません。
0834デフォルトの名無しさん
2009/07/04(土) 10:51:08参考書等:ググル、本屋のVBA本。何でも可。まずやってみる。
ツールの方向性:
◎レポート作成機能:グラフ付きの売り上げ月報をイメージして
・1エクセルで完結
・各シートに拠点毎の売り上げデータがあるとして・・・
�@集計機能
�A抽出機能
�Bレポート/分析/グラフ作成(拠点毎、グループ毎など)
・複数エクセルの連携
・上記と同じ。各エクセルファイルに拠点データがあるとして・・・
◎最終的にアクセスとの連携
何かしらの大量データを分析して、グラフ報告書を作れるようになれば
大抵の機能は作れるようになっていると思われ。
そこまで行くと、多言語実装やアクセス等のDB連携を視野に入れるようになるのでは?
頑張ってね〜
0835デフォルトの名無しさん
2009/07/04(土) 11:05:07つねに頭に置いておくのは「自動化」。いかにワンタッチで実装するかがポイント。
�@9x9表の表示(反復と表示方法)
�Aシート入力でnxn表の表示(シート入力方法)
�B�Aを偶数 or 奇数のみ表示(選択方法)
�C�Bの色塗りとか罫線とか(表示方法)
�D�Cを別シートや別エクセルに出力(出力方法)
あとは小奇麗にまとめればレポート作成機能になりそうじゃね?
イメージできるかいな?
0836デフォルトの名無しさん
2009/07/04(土) 12:03:27Webで勉強するなんてもっとも非効率で全くおすすめできない。
とにかくどでかい本屋(http://www.computerbook.jp/cpu/archive/2009/06/26/5506.aspx参照)に
行って、最も簡単そうでピンときた奴を買ってきて、一冊通読しろ。
それが一番手っ取り早い。
0837デフォルトの名無しさん
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エラーが出てしまいます。
正しいコードを教えていただけませんか?
0838デフォルトの名無しさん
2009/07/04(土) 13:25:540839デフォルトの名無しさん
2009/07/04(土) 13:36:23set ran〜の部分ではなく
if ran.vakue〜の部分でした。
loop、でプログラミングしてみたらいいのでしょうか?
0840デフォルトの名無しさん
2009/07/04(土) 13:56:29if c ...
next
0841デフォルトの名無しさん
2009/07/04(土) 14:41:29親身になりアドバイスを頂き、ありがとうございます。
まず入門向けの参考書を買い勉強
その後サンプル集を買うまたはネットから手に入れマスターしたいと思います。
本当に途方にくれていました。ありがとうございます。
参考書はカラーで絵が多いものが経験上長続きします。
その辺りを考慮し選んできます
0842デフォルトの名無しさん
2009/07/04(土) 15:19:14大量データが欲しかったら、適当なHPで株式データを1ヶ月分くらい入手してみ。
個人だと大量データ入手が大変だから。会社データは色々とまずいだろうし。
んで、最初は手作業でいいから移動平均線のグラフとかを出せるようにして、
最終的にはワンタッチで自動更新できるようにするのがよろしいかと。
0843デフォルトの名無しさん
2009/07/04(土) 15:38:060844デフォルトの名無しさん
2009/07/04(土) 16:40:06できました!ありがとうございました
0845デフォルトの名無しさん
2009/07/04(土) 21:44:30気象庁へ行けば過去の気温とか置いてあるよ
0846デフォルトの名無しさん
2009/07/04(土) 22:00:47なんちゃって個人情報
http://kazina.com/dummy/index.html
0847デフォルトの名無しさん
2009/07/04(土) 22:07:43これ面白いなw初めて知ったわ
0848デフォルトの名無しさん
2009/07/04(土) 22:15:010849デフォルトの名無しさん
2009/07/04(土) 23:50:12たとえば3行目がタイトル行だとして、
タイトルにはA列は年齢、B列は名前、C列は出身とかあるのですが、
あらかじめ指定されたタイトルを検索して、
その列のタイトル次の行から、一番下の行まで選択するにはどうすればいいのでしょうか?
たとえば変数か何かで「名前」と指定すれば、
B4からその列の一番下の行まで選択したいのですが
やり方がいまいちわかりません
教えてください
0850デフォルトの名無しさん
2009/07/05(日) 00:22:29ヒント: ctrl+↓
これをマクロで書いてみ (ただし途中に空欄がある時は誤動作するけど)
最終行(65535?)からctrl+↑でも似た動作するよ
データが何行目まであるか決めといた方が、もっとスマートに書けると思うよ
0851デフォルトの名無しさん
2009/07/05(日) 00:23:09プログラムを作る時は、手順を分解して1つずつ考えるんだよ
この「分解する」ってのが初心者には難しい。
知識と経験がないと、どうやって分けたらいいのかわからないし、
うまく分解できないと検索してもヒットしない
1. タイトルのある行を特定する
2. 検索する文字列を指定する
3. タイトル行から指定された文字列を検索する
4. 一番下の行を調べる
5. タイトルの次から一番下まで選択する
0852デフォルトの名無しさん
2009/07/05(日) 00:32:07たった5000件までかよ。
いつもいまいちな回答してるやつ5000件で試してるのかも知らんな。
0853デフォルトの名無しさん
2009/07/05(日) 00:38:02文句があるならお前が教えてやれよwww
初心者なんだから5000件でも多いだろwwwwwwww
0854デフォルトの名無しさん
2009/07/05(日) 00:50:54面倒だから書かないが
http://officetanaka.net/excel/vba/cell/cell11.htm
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html
これを組み合わせればできるはず
0855デフォルトの名無しさん
2009/07/05(日) 01:20:57配列数式厨には多すぎるくらいのデータだわな。
配列数式厨は>>846使って答えるべし。
5,6件のデータを想定するんじゃねーぞ。
0856デフォルトの名無しさん
2009/07/05(日) 01:52:41学校ではそっから始るんだからさ。
まずはVBAより、変数とか配列とかのプログラム自体に慣れるのが吉。
0857デフォルトの名無しさん
2009/07/05(日) 02:37:26一般的になプログラミングになれたら、VBAで通用しなかったでござるの巻
0858デフォルトの名無しさん
2009/07/05(日) 02:38:04大量のデータを高速に処理しようと思ったら、教科書に載ってる一般論なんて役に立たないし
0859デフォルトの名無しさん
2009/07/05(日) 03:44:58データに偏りがあったり、ある法則、特性があるなら
その特性にあった方法をとるアルゴリズムが早くなることは十分にありえる。
必ずデータが1つ以外きれいに並んでいて、その一つのデータのためにソートするなら
クイックソートなんよりバブルソートの方が早いかもしれない。
0860デフォルトの名無しさん
2009/07/05(日) 08:15:35row column = 2次元
sheets row column = 3次元
workbooks sheets row column = 4次元
て考えれば、気づいてないだけで誰でも4次元配列まで使えてるはずなんだけどね。
0861デフォルトの名無しさん
2009/07/05(日) 08:19:395次元がフォルダ分けで
6次元がHDD分けかと思ったがそこから先はフォルダの階層を深くしていけばいいのか
0862デフォルトの名無しさん
2009/07/05(日) 11:15:53例えば新規にツールバーを作り、そのツールバーから実行するマクロなど。
0863デフォルトの名無しさん
2009/07/05(日) 11:51:23セルの中身を1文字ずつ分解すれば、さらに1次元プラス
0864デフォルトの名無しさん
2009/07/05(日) 13:00:59逆にrow,columnの2次元でも1次元ふたつに分解したほうが扱いやすかったりするような・・・
配列使いだしたの最近だから、多次元が役立つケースあれば教えてもらえると勉強になる。
0865デフォルトの名無しさん
2009/07/05(日) 13:27:42基本もわからず応用をやって、結局何も出来なかったでござる巻
VBAかじった奴に多い罠。
>>864
3次元以上の配列なんてそうそう使わんから気にするな。
そうなる前に、構造体・コレクション・クラスになるよ
0866デフォルトの名無しさん
2009/07/05(日) 14:55:18シートが1枚しか使えないとかブック(ファイル)が1つしか作れない環境を考えたら、それはとても扱いづらくなるだろ?
ようするに、増えた分をどうイメージするかって問題だよ。
0867デフォルトの名無しさん
2009/07/05(日) 15:01:16構造データが3次元で、それに応力や温度や時間軸を増やしていったりするから
5次元とか6次元の配列は日常的に使う。
科学技術計算では多次元配列を使いまくるから、ベクトル型のスーパーコンピュータなんかは
配列(実際は行列)どうしを足したり掛けたりするための専用のハードウェアが内蔵されてて、
ループを使わなくても一発で計算できるような構造になってたりする。
0868デフォルトの名無しさん
2009/07/05(日) 15:06:34増えた分をどうイメージするかじゃなくて、意味のある次元の割り当て方をしていれば
何次元配列になっても混乱しないし、高次元の配列は作らないだろ
二次元配列をメンバーに持つクラスを格納するリストを用意して、実質3次元に成ることはあっても
単体の配列だけで4次元以上の高次配列に成ることはまず無いだろうな。
そもそも各次元n(i)個の要素を持つn次の行列を逐次アクセスしようと思ったら
Π[i=0,m](n(i))回ループすることになるしな。
0869デフォルトの名無しさん
2009/07/05(日) 15:15:140870デフォルトの名無しさん
2009/07/05(日) 15:56:41そんな奴居ねーよw
物理次元の話と混同してないか?
物理次元なら4次元以上に付いていけない人が多いのは確かだが、
配列次元が増えることで付いていけなくなることはまずない。
少なくとも、1次元配列が理解できて5次元配列が理解できない奴は、まともな社会生活すら送れないことになる。
何故なら日本国内の住所概念が、都道府県名を第1次元とする5〜11次元配列に相当するからだ。
更に言えば、5次元配列を理解できない奴は、万単位の買い物も出来ない。
0〜99999という10万未満の数値は、0〜9という要素の5次元配列に相当する。
「お会計34567円です」と言われて、どの額面(次元)の紙幣や硬貨が何枚(要素)必要か理解できるなら
5次元配列を理解できていることになる。少なくともVB言語の配列における次元ってのはこのレベルの概念だ。
まぁ5次元配列をプログラムの中で効果的に運用できるかとなると話は別だがな。
0871デフォルトの名無しさん
2009/07/05(日) 16:02:56次のネタマダァ-? (・∀・ )っ/凵⌒☆チンチン
0872デフォルトの名無しさん
2009/07/05(日) 16:08:22俺も知らんがリボン対応しないと駄目なんじゃね?
0873デフォルトの名無しさん
2009/07/05(日) 16:26:59だから、何をイメージするかで理解できるかどうかが変わってくるんだってば。
単純に数字を並べただけだと、それだけで拒否反応を示す人がいる。
「住所みたいなもんだと思えばいいんだよ」ってアドバイスをすれば
すんなりわかってもらえる確率がぐっと上がる。
そういうレベルの話をしてたつもりなんだけど。
0874デフォルトの名無しさん
2009/07/05(日) 16:29:29ずいぶん低レベルだったんだな。
0875デフォルトの名無しさん
2009/07/05(日) 16:37:29初心者に説明するのは大変なんだよ。
いっぺん家庭教師とか講師とかやってみるとわかる。
0876デフォルトの名無しさん
2009/07/05(日) 16:50:01これらはプロパティのイメージだろw
0877デフォルトの名無しさん
2009/07/05(日) 17:31:39学校の宿題として出されたのですが、ExcelのVBで奇数偶数を分けるマクロを、
調べるように言われたのですが、自分の持ってる本には書いてなくて、Excelの
基本操作でもできる物ですが、教えてください。
0878デフォルトの名無しさん
2009/07/05(日) 17:33:17なかったら偶数
0879864
2009/07/05(日) 17:42:45クラスとかあまりわからないからわかる範囲で処理しようとしてかえってややこしくしてるのかもしれませんね
勉強不足ですみません
そもそも多次元が不便に感じたきっかけはredimで最終次元しか変更できないからですけど
なにか簡単な別手段ありますか?
0880デフォルトの名無しさん
2009/07/05(日) 17:55:06何勘違いしてるの?
0881デフォルトの名無しさん
2009/07/05(日) 18:12:03授業で、ってなると、
2を引きまくって余りが1以下になるまで、とか
無駄にループしてるの作ってほしそうだね
0882デフォルトの名無しさん
2009/07/05(日) 18:32:42ふつうは、>>878さんのやり方でやるよ。
Mod使って余り出しても良いし、ビット演算子使っても出来る。
0883デフォルトの名無しさん
2009/07/05(日) 18:55:48| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ i
彡、 |∪| | 877J
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
0884デフォルトの名無しさん
2009/07/05(日) 19:11:410885デフォルトの名無しさん
2009/07/05(日) 19:42:48OS: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
という方法で組んでみたんですが、新規データだけを拾うことができません。
分かりにくくて申し訳ありませんが、ご指摘よろしくお願いします。
0886デフォルトの名無しさん
2009/07/05(日) 19:56:17不明点だらけで困るが、デバッグして追ってみれば?
�@マスタと更新シートのデータをきちんと拾えているか?
�Aコピペするのは良いが、きちんと更新シートをコピってマスタにぺしてる?
片一方のコピペを繰り返していないか?
�B上書きしてないか など・・・
0887デフォルトの名無しさん
2009/07/05(日) 20:23:15If (マスタ)商品cdセル.Value <>(更新)商品cdセル.Value Then
↑ここおかしくない?
マスタと更新のデータ位置が同じセルであるわけがないんだから。
matchでエラーなら挿入とかの方がいいんじゃないかね?
0888デフォルトの名無しさん
2009/07/05(日) 20:34:10whileとforで回してるっぽいが・・・
確かにマスタと更新の行位置更新について情報無いけどね
0889885
2009/07/05(日) 21:16:07>>886
データは拾えてるみたいです。
更新→マスタへのデータのコピーはできるんですが
新規データだけでなく既存コードのデータまで複数件コピーされてしまっています。
>>887
マスタと更新はまったく同じレイアウトですが
新規データが追加されるので、確かにコードの位置はマスタと更新では違います。
そう思って二重ループで回してみたんですが、上記のような状態になってしまいます。
>>887さんの仰る通り、条件文が変なんだと思います。
ちなみに、matchを使って判定する場合は、
If match(マスタの商品cdセル, 商品cdのセル範囲, 0) = #N/A
というような使い方をするんでしょうか。
0890デフォルトの名無しさん
2009/07/05(日) 21:32:01�@全データ突合せ。印をつけとく。(行位置確保)
�Aそれからコピー
0891デフォルトの名無しさん
2009/07/05(日) 22:07:17match使うならば、エラーが出る=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
0892デフォルトの名無しさん
2009/07/05(日) 23:01:230893885
2009/07/05(日) 23:45:30ご回答ありがとうございます。
もう一度検証してみたところ、ループの通り方がおかしかったようです。
>>885の処理だとセルの値が同じ時は違う値だけを拾えるんですが、
Else中で違う値に印をつけると、全てのセルに印がついてしまうので
コピー作業をする前に、ループ処理を見直してみます。
>>891
matchを使ったコードのご提示、ありがとうございます。
今は前段階のループでつまずいてしまっていますが、
簡単なサンプルで動かしてみて、matchの働きは大体把握できました。
参考にさせていただきます。
>>892
DBでは使わないので、SQL文は使えません…
もう一度、ループを見直して行位置確保できるよう考えてみます。
分かりずらい説明だったにもかかわらずレスくださった方々
本当にありがとうございました。
0894デフォルトの名無しさん
2009/07/06(月) 08:43:34簡単な素数の求め方と同じ原理
2から始まって、2の倍数削除、3の倍数削除、4は飛んで5の倍数削除(ry
0895デフォルトの名無しさん
2009/07/06(月) 09:35:110896デフォルトの名無しさん
2009/07/06(月) 13:23:33すべて通りつつランダムに通路で繋げるにはどうしたらいいかな?
0897デフォルトの名無しさん
2009/07/06(月) 14:39:21分割統治法か動的計画法使えばいんじゃね?
0898デフォルトの名無しさん
2009/07/07(火) 01:19:26ほれ
http://u6.getuploader.com/SR1gou/download/26/%E3%82%BB%E3%83%AB%E3%83%8D%E3%82%B3.xls
0899デフォルトの名無しさん
2009/07/07(火) 16:08:14os: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ファイルを展開する途中のものなので
できれば手動では行いたくないのです。
宜しくお願い致します。
0900デフォルトの名無しさん
2009/07/07(火) 16:19:40F8
0901デフォルトの名無しさん
2009/07/07(火) 16:31:29大量データを回すならコピーじゃなくて直接値を入れたほうがいいんじゃね
0902899
2009/07/07(火) 17:06:32稚拙な質問にご回答頂き有難うございました。
>>901
>コピーじゃなくて直接値を入れたほうが
参考にさせて頂きます。有難うございました。
0903デフォルトの名無しさん
2009/07/07(火) 17:53:23ローグライク作りたいんだろ?
・部屋と道と分岐点のパターンを各種作成しておく
・部屋作りの前に部屋と分岐点の数を決定する
・後は部屋と道を繋げる。分岐点が足りなければ、
部屋の位置を調整して直線でつなげる
パターンの位置調整がめんどくさいだけじゃね?
その情報じゃこれぐらいしか言えん
0904デフォルトの名無しさん
2009/07/07(火) 21:52:06Webの自動実行を行うマクロを作成しています。
文字列代入→ボタン押下というのを繰り返しているだけなのですが、
ボタン押下した際次の画面になるまで
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秒程待機するようにしていますが、
もし他にボタンが押せるようになるまで待機ができる方法などございましたらご教授いただけませんでしょうか。
わかりにくい質問で申し訳ありません。よろしくお願いします。
0905デフォルトの名無しさん
2009/07/07(火) 22:51:55While .item("button2") Is Nothing 〜 でボタンが表示されるのを待つ
0906デフォルトの名無しさん
2009/07/07(火) 22:57:59stringの変数の中に格納されている文字列の、
頭から指定の文字数だけ、置き換えたいのですが、どうやったらうまくいのでしょう?
文字列は、全角、半角混ざっています。
0907デフォルトの名無しさん
2009/07/07(火) 22:58:40On Errorでクリックできるまでループ
0908デフォルトの名無しさん
2009/07/07(火) 23:00:11VBAでは全角も半角も同じ1文字として数えるから、普通にLeft関数とか使えばいい
0909デフォルトの名無しさん
2009/07/07(火) 23:22:18それを置き換えるのはどうやるんでしょう?
0910デフォルトの名無しさん
2009/07/07(火) 23:23:460911デフォルトの名無しさん
2009/07/07(火) 23:27:21a = b & mid(a,c+1,len(a)-c)
end sub
0912デフォルトの名無しさん
2009/07/07(火) 23:33:35Σ(゚д゚lll)
0913デフォルトの名無しさん
2009/07/08(水) 00:00:59ありがとうございます。
0914デフォルトの名無しさん
2009/07/08(水) 00:09:06904です。ありがとうございます。早速試してみます。
0916デフォルトの名無しさん
2009/07/08(水) 05:50:55それなら普通にVSTO使えばいいんじゃね?
0917デフォルトの名無しさん
2009/07/08(水) 06:04:36"あいうえお"から頭の"あいうえ"を"はげ"に置き換えるなら
Replace("あいうえお","あいうえ","はげ")
これで”はげお"になる。
ただExcel97だったかExcel2000からのサポートだったか忘れた。
0918デフォルトの名無しさん
2009/07/08(水) 06:19:48"あいうえあいうえお"で"はげはげお"になるな。
Replace("あいうえお","あいうえ","はげ",1,1)
これだと"はげあいうえお"になる。
変数aの頭の4文字を"はげ"に置き換えるには
Replace(a,Left$(a,4),"はげ",1,1)かな?
0919デフォルトの名無しさん
2009/07/08(水) 12:14:570920デフォルトの名無しさん
2009/07/08(水) 16:52:04midとReplaceとどちらが勝手がいいか試してみます。
0921デフォルトの名無しさん
2009/07/08(水) 17:31:380922デフォルトの名無しさん
2009/07/08(水) 17:37:34↓を取り敢えず考えたんですが
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
0923デフォルトの名無しさん
2009/07/08(水) 17:56:06↓
for 変数i = 0 to 任意の数
でしたすみません
セル範囲に流し込む二元配列にデータを取得するんですが、
その配列に格納するデータが不確定であった場合
redim preservの適用範囲が配列の最終データまでしかなくて困るんです
0924デフォルトの名無しさん
2009/07/08(水) 19:30:390925デフォルトの名無しさん
2009/07/08(水) 19:33:48とりあえず、無意味に変数とか配列とか書くとかえって読みにくいんだけど…俺がなれてないせい?
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はそのレベルの最適化はかけてなさそうだけど…
0926デフォルトの名無しさん
2009/07/08(水) 19:44:55単純に考えればこうなるよね?
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へコピーするのを省くとちょっと早くなるかもしれない。
0927デフォルトの名無しさん
2009/07/08(水) 20:32:53変数iはループを終えた時点でn+1になってるからダメ
For i = 1 To 10
Debug.Print i
Next
Debug.Print i
ってやってみ
0928デフォルトの名無しさん
2009/07/08(水) 21:50:48�@ブック内全部
�Aモジュール内全部
�B宣言したプロシージャだけ
の3つであってますか?
�Aの場合
Dim hoge as string
DIM hoge = "ほげ"
sub test ()
msgbox = "hoge"
end sub
こういうことじゃないんですか?
0929デフォルトの名無しさん
2009/07/08(水) 21:59:58宣言だけして代入はしてはいかんのですね
Dim hoge as string
sub test ()
hoge = "はげ"
MsgBox = hoge
end sub
0930デフォルトの名無しさん
2009/07/08(水) 22:00:27sheet1も中身はクラスだよ。
そして何を言いたいのかわからない。
0931デフォルトの名無しさん
2009/07/08(水) 22:06:23モジュール1でもモジュール2でも宣言した変数を使うときに
書くみたいな
0932デフォルトの名無しさん
2009/07/08(水) 22:24:020933デフォルトの名無しさん
2009/07/08(水) 23:32:47まあ、MSDNの取説見るのが一番手っ取り早いと思うけど
private / publicはクラスの外部から見られるか、見られないかの違いしかない。
実際、モジュールに宣言して、外部からアクセスしてみれば分かる。
それ以外のルール、宣言した識別子が、どの範囲まで通用するかというのは
原則、宣言した場所よりも深いところであれば通用する。(クラスのメンバはそのクラスに属するメソッド内でつかえる)
その逆は、通用しない。(メソッドの中で宣言された物は、同クラスのほかのメソッドからはアクセスできない(つか、する必要性がないがw)
0934デフォルトの名無しさん
2009/07/08(水) 23:45:08それはpublic
0935862
2009/07/09(木) 21:20:14ありがとう。でもVSTOなどのアプリケーションは事情があって
インストールできない環境なのよ。
OfficeのVBAエディタだけで対応するしかない状況。
頑張るよ。。
0936デフォルトの名無しさん
2009/07/10(金) 04:50:39IT奴隷 乙
0937デフォルトの名無しさん
2009/07/11(土) 23:09:31とうとう行き詰ってしまいました・・・
先生方の手助けを借りられれば幸いと思い書き込みさせていただきます。
イベント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
-------------------------------------------------------------------------
説明不足等ございましたら、お手数ですがご指摘お願いいたします。
よろしくお願いいたします。
0938デフォルトの名無しさん
2009/07/12(日) 00:00:38上記みたいに行選択をさせたく
ある行にある特定の文字列がある行だけを選択させたいのですが
Do Whileで回して
valsにほしい行をため込んでいって
aaa = "" & vals & ""
Range(aaa).Select
という記述がどうしてもうまくいきません
それが1000行近くあるので数の問題かと思っていたら
そうでもなさそうですし
うまい方法を教えてください
0939デフォルトの名無しさん
2009/07/12(日) 00:30:57うまく繋げられていないだけのような気がする。
0940デフォルトの名無しさん
2009/07/12(日) 00:40:48Rangeの引数に指定できる文字列は256文字以下
0941デフォルトの名無しさん
2009/07/12(日) 00:42:39はい一応デバックで止めて中身を見てもちゃんと入っています
ダブルクォーテーション網膜は行っています
もしくは
データをいじって結果がRange("1:1,3:3").Select
という 数を少なくしてもやはりエラーになります
Range("1:1,3:3").Select
をそのまま記述すればエラーにならないのですが
どうしても
"1:1,3:3"の部分を変数にするとエラーになります
ちなみにエラーの内容は
実行時エラー1004
Rangeメソッドは失敗しました: '_global'オブジェクト
0942デフォルトの名無しさん
2009/07/12(日) 01:17:54まず、文字列にダブルクォートを入れたいときは
× aaa = ""
○ aaa = """"
なんだけど、ダブルクォートってのはソースリストの中で文字列の範囲を示すための物だから、
それ自体を文字列変数に入れても仕方がない
つまり
aaa = "" & vals & ""
Range(aaa).Select
じゃなくて
Range(vals).Select
だけでいいはず
あと、上にも書いたようにRangeに指定できる文字列は256文字
0943デフォルトの名無しさん
2009/07/12(日) 01:23:11つまり255文字まで
0944デフォルトの名無しさん
2009/07/12(日) 08:53:58それ標準モジュールに書いてるのか?
シートモジュールじゃないのか?
例えばSheet1のモジュールで
Worksheets("Sheet2").Activate
Range("A1").Select
と書いても動かん。
シートモジュールなら
Range(aaa).Selectじゃなくて
Excel.Range(aaa).Selectとしてみなよ。
しかしActivateとかSelectとかほとんど必要ないんだが、そのアドレスをため込んでいく方法も感心しないな。
前スレで同じような回答したやつに指摘したら逆切れされたよ。
バカはどこにでもいるから仕方がないが。
盲愚の側溝テクニック集にも似たようのがあったかな?
あそこは駄目テクニック満載だがw
0945デフォルトの名無しさん
2009/07/12(日) 09:03:39>をそのまま記述すればエラーにならないのですが
とあるかから上は外しだったな。
255文字を超えたんじゃないかと思うが
>データをいじって結果がRange("1:1,3:3").Select
>という 数を少なくしてもやはりエラーになります
とあるから、これも直接の原因じゃないのか。
いずれにしても1000行なら255文字は超えそうだけどな。
0946デフォルトの名無しさん
2009/07/12(日) 09:11:19付けてみたら
「実行時エラー1004
Rangeメソッドは失敗しました: '_global'オブジェクト」
のエラーメッセージが出たが。
0948デフォルトの名無しさん
2009/07/12(日) 10:26:25HELPから引用
省略可能です。引数 varname が ActiveX オブジェクトによって
起動されるイベントへの対応に使われるオブジェクト変数であることを示すキーワードです。
クラス モジュール内でのみ有効です。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
キーワード WithEvents を使用して任意の数の変数を個別に宣言できます。
ただし、配列は作成できません。また、キーワード New はキーワード WithEvents と共には使用できません。
てか、「Excel WithEvents」とかでググればいっぱいでてくる
ttp://msdn.microsoft.com/ja-jp/library/cc376266.aspx
0949デフォルトの名無しさん
2009/07/12(日) 11:41:19対応ありがとうございます
やはりダブルクォーテーションが原因のようでした
>>944
一応思いつくのは方法として思いつくのが
上記のやり方か
フィルタで特定の文字の行だけを抽出して全選択ぐらいしか思いつかないのですが
他にうまいやり方とかあるのでしょうか?
0951デフォルトの名無しさん
2009/07/12(日) 14:07:15そのまとめて処理という発想をすてて、一つ一つ処理した方が確実。
ただ一つ一つSelectして処理は駄目。
Selectしない方法を身につけないと。
0952デフォルトの名無しさん
2009/07/12(日) 16:09:06一つ一つ処理したら何が確実になるの?
一つ一つSelectして処理したらどうして駄目なの?
0953デフォルトの名無しさん
2009/07/12(日) 16:21:251つに対して出来たら、後はforやfor eachで対象を増やすだけ。
selectしなくても直接操作できるならしない方が動作が早い。
0954デフォルトの名無しさん
2009/07/12(日) 18:30:54>1つに対して出来たら、後はforやfor eachで対象を増やすだけ。
例えば1行1列の行列掛け算プログラムを正しく作ったとして、
それをn行n列の行列掛け算に拡張するとする。
その拡張が正しいというのはどのように判断するの?
2行のデータをソートするプログラムを正しく作ったとして、
それをn行のソートに拡張するとする。
その拡張が正しいというのはどのように判断するの?
0955デフォルトの名無しさん
2009/07/12(日) 18:32:110956デフォルトの名無しさん
2009/07/12(日) 18:34:41>selectしなくても直接操作できるならしない方が動作が早い。
早く動作させたい場合、データを一つ一つループで回して処理するより、
データの塊りをライブラリに与えるほうが速いことが多いよ。
0957デフォルトの名無しさん
2009/07/12(日) 18:43:48>>953
データを集合で扱ったほうが、確実(正しい処理)で速いよ。
selectがどうとかバカらしいよ。
0958デフォルトの名無しさん
2009/07/12(日) 18:47:390959デフォルトの名無しさん
2009/07/12(日) 20:15:54ダミーデータ入れて検証するか、ステップアップで確認しろよw
0960デフォルトの名無しさん
2009/07/12(日) 20:18:36なにせ普通にUnion使ったらエリア数の惨状に比例して遅くなる。
0961デフォルトの名無しさん
2009/07/12(日) 20:21:030962デフォルトの名無しさん
2009/07/12(日) 20:26:56これはあくまでも一般論。
Selectしたあと何をやるか質問者が一切書いてないのに先走ってケンカして、単なるアホ。
0963デフォルトの名無しさん
2009/07/12(日) 20:28:13Selectした後コピーして別のシートに貼り付ける
0964デフォルトの名無しさん
2009/07/12(日) 20:32:29ただし条件付き書式は使わないものとする。
まぁ条件付き書式でも実用に耐えるものを設定出来るやつ何人いるか分らんが。
ちなみに=A1=MAX($A1:$CV1)の条件は不合格です。
0965デフォルトの名無しさん
2009/07/12(日) 20:37:10実際よくUnuion使った手法を見るから>>960が書いてるように勘違いしてるやつは多い。
0966デフォルトの名無しさん
2009/07/12(日) 20:40:530967デフォルトの名無しさん
2009/07/12(日) 20:48:14何が不合格やねん、アホか
0968デフォルトの名無しさん
2009/07/12(日) 20:55:04行列計算やソートしてくれるライブラリがあるなら、そっちを使うなあ。
検証好きなんだな。お前。
0969デフォルトの名無しさん
2009/07/12(日) 21:30:27速さの話題出るたびに検証検証言ってるのは一人だけなのか?
質問が早さを求めていない以上レスポンス云々の回答が的外れであるのは否めないが
何度もそう健勝言われてもうざいです^^q^
0970デフォルトの名無しさん
2009/07/12(日) 21:36:34>そのまとめて処理という発想をすてて、一つ一つ処理した方が確実。
ほうどうして?
>ただ一つ一つSelectして処理は駄目。
>Selectしない方法を身につけないと。
へえなんで?
0971デフォルトの名無しさん
2009/07/12(日) 21:46:54Selectしないなんてのはごく一般常識だ。
0972デフォルトの名無しさん
2009/07/12(日) 21:52:03質問が速さを求めてないんだから確実に動かない>>938は駄目だね。
ダブルクォーテーションの問題をクリアーしても255文字の制限で駄目なのは目に見えてる。
0973デフォルトの名無しさん
2009/07/12(日) 22:03:17Selectしたってちゃんとした結果が出るんならいいじゃない。
視野がせまいんじゃないの?
0974デフォルトの名無しさん
2009/07/12(日) 22:06:280975デフォルトの名無しさん
2009/07/12(日) 23:37:48なんとなく試したら平均2秒もかかるコードしか組めなんだ。
しかも、各行の最大値は重複しないという条件で。
ところで、
>ちなみに=A1=MAX($A1:$CV1)の条件は不合格です。
は何故不合格なのか教えてもらえるとうれしい
0976デフォルトの名無しさん
2009/07/13(月) 00:04:332秒だろうが10秒だろうが、手作業よりよほど速いんだから気にすんな。
Selectしようがしまいがちゃんと結果を出せるんなら実用上問題ない。
それよりも本当に最大値を間違いなく出せているのか?
それだけが重要だ。
0977デフォルトの名無しさん
2009/07/13(月) 00:26:21たとえば?
0978デフォルトの名無しさん
2009/07/13(月) 08:40:05複数のコード書いて質問者に選ばせればいいじゃん
自分のスタンスじゃないからって否定すんなよ
行選択ならrows()の組み合わせが使えるんじゃね
0979デフォルトの名無しさん
2009/07/13(月) 10:56:58たとえばもクソもねーよ。
255文字を超えると使えないような手法が使えるわけねーじゃん。
それこそ誰かがどこかで書いてた小売店レベルでしか使えねーな。
0980デフォルトの名無しさん
2009/07/13(月) 11:13:42もしかして1〜100の乱数書き込みを入れての時間?
そうじゃなかった少し古いパソコン?
Vista 2007 Core2Duo3.00GHzでおまいの書いたであろうコードを書いてみたら0.7秒だった。
重複対応のmatch使わないで配列ぶん回すやつはこれに0.1秒余計にかかるだけだった。
ちなみに普通にUnion使ったら20分だったw
0981デフォルトの名無しさん
2009/07/13(月) 11:47:45255文字を超えない文字数で何回かに分けて処理する方法はあるよ。
ただかなり複雑になるけど。
0982デフォルトの名無しさん
2009/07/13(月) 12:18:5220分てなんだそりゃw
0983デフォルトの名無しさん
2009/07/13(月) 12:30:43単純なUnionならそのくらいかかるよな。
>>960が書いてるとおりだ。
0984デフォルトの名無しさん
2009/07/13(月) 12:55:21がさっぱりわからん。
0985デフォルトの名無しさん
2009/07/13(月) 13:26:54Unionでも工夫すれば速くなるとかいう達人が前にいたからねぇ。
その工夫がめちゃめちゃ面倒で、俺みたいな凡人にはとても書けるものじゃなかったよ。
普通の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
0986デフォルトの名無しさん
2009/07/13(月) 17:03:04本来のアドレスに戻すことはできますか?
リンクの編集からリンク先のリンクがわかるのですが、
それをいちいちコピペで変換するのが大変なので。
0987デフォルトの名無しさん
2009/07/13(月) 17:07:08何がしたいのか知らんけど、バグってるよねそのコード
0988デフォルトの名無しさん
2009/07/13(月) 18:26:57マクロ使わないと無理
Range("A1").Hyperlinks(1).Address
0989デフォルトの名無しさん
2009/07/13(月) 19:25:36どうでもいいんだが、「小売店」の意味を勘違いしてる
まあお前が言い出したんじゃないかもしれないけど
0990デフォルトの名無しさん
2009/07/13(月) 19:34:36プログラムをやるならば、他人がメンテする事も踏まえて可読性の高い、
一般的かつ美しいロジックの構文を心掛けるべきだな。
省略した方が一般的ならば省略すべきだし、
省略すると、動くけどマニアックならば省略すべきでは無い。
デフォルトプロパティの省略なんか分かりやすいかな。
0991デフォルトの名無しさん
2009/07/13(月) 19:41:02B列にあるアドレスということで
Range("B").Hyperlinks(1).Address
としてやってみたのですが、駄目でした。
マクロは
Sub リンク()
Range("B1").Hyperlinks(1).Address
End Sub
こんな感じになってます。最後のaddressってのが黄色く表示されます。
0992デフォルトの名無しさん
2009/07/13(月) 19:50:24誰への書きこ?
0993デフォルトの名無しさん
2009/07/13(月) 20:05:40そうだねぇ。
省略するのが一般的なものの一番はItemだな。
Set w =Worksheets.Item("Sheet1")とかやられるとかなりくどくて嫌味だな。
0994デフォルトの名無しさん
2009/07/13(月) 20:09:20End Withが抜けてるだけだな。
インデントつけりゃすぐわかることだ。
0995デフォルトの名無しさん
2009/07/13(月) 20:46:53とか普通つけないしな
0996デフォルトの名無しさん
2009/07/13(月) 20:58:46同ソフトウェアに搭載されている VBA では1と定義されている。
0997デフォルトの名無しさん
2009/07/13(月) 21:24:02あれはつけないのが当たり前だからな。
つけたら可読性は最低レベルだ。
0998デフォルトの名無しさん
2009/07/13(月) 21:27:25VBAでは、0^0が1というより、n^0が1(nが負数なら-1)となる
算術演算的には0^0はエラーでいいんだが
論理演算的には1や-1になった方が都合がよいからな
0999デフォルトの名無しさん
2009/07/13(月) 21:54:501000デフォルトの名無しさん
2009/07/13(月) 21:59:4810011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。