3 :
デフォルトの名無しさん :2009/05/10(日) 02:30:44
卒研でVBAを使用することになったんですがお勧めの初心者向けのテキスト(教科書)教えてくれませんか? 当方一年授業で学んでオセロつくったくらいです
★5 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★6 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。 ★7 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
>>4 は同意されたものではないので、無視してかまいません。
★7は必須だろ
>>4 ExcelVBAからADOを使ってmdbのデータを読む、なんてのは含まないんだね
APIの話も、Excelから呼び出すなら良いと思うけどな。 具体的なAPI詳細とかなら、専用スレに誘導すりゃ良いし。
EXCEL2003とXPを使用しています デバッグのステップインでF8を押して進めるとすべて問題なく処理が完了するのですが マクロの実行でやると 実行時エラー424オブジェクトが必要です という物が表示されてしまいます 何処の変数がオブジェクトにしないといけないとか判断する方法はないでしょうか?
「実行時エラー424オブジェクトが必要です」 って表示された時に処理止まっているんじゃないの?
デバッグのF8連打のステップインの時は全く問題なく終了(ループ)するんですよ、、、、 実行でもたまに上手くいくんですが大半がエラー424になって なんでデバックだと上手くいくのに実際だとエラーが出るんだろ、、、、と思いまして
ブレイクポイント入れてないのに勝手に止まったりすることあるよ こまかいことは(ry
スクリプトうpれ
通信に関係あるプログラムじゃね?WEBとかデータベース鯖とか。 相手の準備が出来たかどうか、データの取得が完了したかどうか ちゃんとステータスチェックせずに次に進むと成功したり失敗したりするし、 F8連打だとそれだけで時間稼ぎになるから失敗しにくくなる。
処理が止まった行の xxx.Value = yyy または yyy = xxx.Value のxxxに問題あり?
>>10 あるねぇ
>>15 の通り、相手の準備が出来てないっての。通信に限らずオブジェクトの描画か何かでも起こった気がする
ループ使ってるならloopやnextの上の行辺りに
Sleep 100
とか入れて見ると解決した気がする
ループじゃなければちとわからん
初心者丸出しのコードでもいいでしょうか?
Sleep 100とか入れちゃう初心者じゃなければいいよw
友人の持って来たノートPC、XP,Office2000だと 実行を40回ループさせても実行時エラー424オブジェクトが必要です って表示されない、、、、 OFFICE2003が何か悪さしてるのかな、、、、
>>18 =
>>10 か?
どんな行で止まったかだけでも分からないと推測で答えるしかない
>>21 はい昨日424エラーが出ると言った者です
皆さんの予想通りWEBにアクセスしてデータを持ってくるという物を作ろうとしています
エラーが出るところは行はランダムなのですが
Set IE = CreateObject("InternetExplorer.Application") 'ココ
IE.Visible = False 'ココ
If CODE = "" Then
MsgBox "コードがありません"
Exit Function
Else
TARGETURL = "
http://stocks.finance.yahoo.co.jp/stocks/detail/?code= " & CODE
IE.Navigate TARGETURL
While IE.busy = True Or IE.readyState <> 4: DoEvents: Wend 'ココ
Set objTableItem = IE.document.GetElementsByTagName("TABLE")
CLOSEPRICE = objTableItem.Item(0).innertext
AccessYahoo = GetCloseData(CLOSEPRICE)
'Debug.Print CLOSEPRICE
End If
'ココと書いてある IEオブジェクトを触ろうとすると出るということがわかりました
あー自分も同じような事をしてるよ!w うちはXPでOffice2000なんだけど・・・ Officeのバージョンとかは特に関係なくてIEが立ち上がりきっていない場合にそういうエラーでますよ。 自分はエラーハンドラで回避しているけどね。
OfficeよりもIEのバージョンのほうが問題か? IE7だと重くて起動遅いとか
IE7というより自マシンの環境によるんじゃないのか?
>>23 ありがとうございます
エラーハンドラーっていうのがあるんですね
ちょっと調べてみようと思います
512MBのメモリのとき妙に424エラーとメモリ不足ですというのがでて
友人の2GBでは何もエラーをはかずに処理が終わる
1GB借りて512MB→1GBにしてみるとなぜか424エラーは出なくなった、、、、
気持ち悪いけどメモリ増やすと問題なく動くみたいです
>512MBのメモリのとき妙に424エラーとメモリ不足ですというのがでて 424はよく分からんがメモリ不足は後始末がちゃんとできてないと起こりやすいな Set XXX = ○○と書いたらSet XXX = Nothing で開放しとかないとだめ 同じ変数にSetしなおしても上書きはされずにメモリを掴んだままになるらしい やってるよな?
Set XXX = Nothingって処理が終了すれば自動解放されるからなくても大丈夫だけどね
29 :
デフォルトの名無しさん :2009/05/11(月) 18:10:04
起動時に全シートの固定行数(SpritRowプロパティ)を求めているのですが、 グラフ等がアクティブになっているとプロパティ無しエラーになります。 On Error 以外で シートがアクティブになっているかどうかを判定する方法が ありますでしょうか?
>>28 そう思って書かないことが癖になると危ないと思うんだがw
っていうかあの時はマジでやばかった(謎
>>29 TypeName(Selection)
でどうかな?
>>27 確かに
Set IE = CreateObject("InternetExplorer.Application")
のあとに解放せずに
何十回もAccessYahoo(コード番号)で呼びまくってました
よくない癖は早めに直さないといけないですねありがとうございます
IEをCreateObjectしてURLを開くのと Workbook.Open Filename:=URLで開くのは どこが違うんだろうか
>>35 XP,Office2003で確認してみたのですが
2003はIE.quitをしなくても
自動的に消えてくれるようです
2000でも使う可能性があるのででIE.quitをAccessYahoo(コード番号)の最後に追加しました
ありがとうございます
IE.Quitはvisible をFalseにしたら不必要だと思ってました
>>36 ウィンドウを閉じる(終了する)のと見えなくするのは違うぞ。
プロセスはちゃんと終わらせなきゃいけない。
>>36 解放で自動的に消えてくれるかどうかは、officeやosのverより、
むしろieのverによると思うけど、うちのie8では消えないみたいよ
消えたかどうか何で確認してるの?
>>37 ieはプロセスに同居するから、インスタンス
VBAでフォームだけ入力することは可能でしょうか? やりたいと思っていることは ログイン、画面推移までは自分でIEを立ち上げて手入力でして チェックボックスやテキストボックスにはVBAの入力ボタンを押すと自動的に 入力されてsubmitし最終確認画面が出るようにしたいと思っています 現在IEで表示している画面の要素をIEオブジェクトに取り込むということはできるものでしょうか?
>>40 SendKeysとか使うくらいしか思いつかんな
再読込するから無理だった気がする
ありがとうございます なさそうですか、、、 最初からVBAでIE立ち上げて ログインする際にID、PASSを入力待ちで手入力にして最終確認画面でmsgboxだして投稿するような方法の方が簡単そうですね
VBAじゃなくてVBScriptでIDとPWが入力された状態で表示させることもできるけどね
IDとパスワードはフォームに入力して、それをSendKeysで送ればいいと思う
ごめん 42 です。
できるかも!
参考までにソース挙げます。
Yahooページ立ち上げておいて・・・こんな感じで・・・
Dim objIE As Object 'IEオブジェクト参照用
Dim objShell As Object
Dim strURL As String 'URLの文字列
'IEのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")
Set objShell = CreateObject("Shell.Application")
For Each objWindow In objShell.Windows
If objWindow.LocationURL = "
http://www.yahoo.co.jp/ " Then
objWindow.document.sf1.p.Value = "VBA"
End If
Next
Set objIE = Nothing
Set objWindow = Nothing
もうちょっと推敲しろよ
質問です。 shell関数でIEを全画面サイズで開く処理を行うと、 会社のPCだと、どうしても全画面で開けません。 最小化でも開けず、ただ適当なサイズで開いてしまうんですが、 何かサイズ指定が不可能になる条件ってPC側にあるんでしょうか? OSはXP、MSは2002です。
49 :
デフォルトの名無しさん :2009/05/12(火) 21:57:36
教えてください Excel2003で、セルを右クリックして出るポップアップメニューに 独自メニューを加えたいのですが、最初のシートには 追加できたのですが(下参照)、2枚目以降のシートのセル+右クリックでは 追加メニューが表示されません すべてのシートのセルの右クリックポップアップメニューに独自メニューを 追加する方法またはある特定のシートのセルの右クリックポップアップメニューに 追加する方法はありますでしょうか? よろしくお願いいたします Public Sub CreatePopUp() Dim fBar As CommandBar Dim fBtn As CommandBarButton Set fBar = CommandBars("Worksheet Menu bar").CommandBars("Cell") fBar.Reset '初期化 Set fBtn = fBar.Controls.Add(msoControlButton, Temporary:=True) fBtn.BeginGroup = True '新しいグループにする fBtn.Caption = "変更" fBtn.OnAction = "Modify" Set fBtn = Nothing Set fBar = Nothing End Sub
適当だけど 標準モジュールの一番上に記述 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
>>48 ie側の問題だと思う
iexplore -nohome
だと効くみたいだけど
>>51 そうなんですか。。。
ありがとうございます。
msgboxのYES,NOをすべての最前面に出す方法はないでしょうか? VbMsgBoxSetForegroundが最前面表示とあるので MsgBox("確認", vbYesNo, vbMsgBoxSetForeground) としてみたのですが VBA実行→IEが立ち上がる→確認がIEの後ろに隠れてしまう (奥からエクセル、確認msgbox、IEの順になってしまう) VBA実行→IEが立ち上がる→確認がIEの手前で 奥からエクセル、IE、確認msgboxの順になるようにしたいと思っています
+ vbSystemModal
>>53 APIでエクセルをアクティブにしてからメッセージボックスを出すとか
★5 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
MsgBoxについての話はスレ違いか? vbSystemModal使うと「メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。」 だから都合悪いかもしれないと思ってAPI使うってアクティブにする案を出したんだが・・・ APIの使い方がわからないって言ってきたらググレカスとでも言っておくがなw
58 :
57 :2009/05/13(水) 16:10:07
訂正 × API使うってアクティブにする ○ API使ってアクティブにする
要件満たさんだろ
そもそもアクティブにするのと最前面にするのは違うし。 おかげでボタンが押せなくて操作不能になるアプリがたまにある。
61 :
デフォルトの名無しさん :2009/05/13(水) 21:37:14
>50 お返事ありがとう その方法でもメニューが追加されるのは一枚目のシートだけ見たいです 具具っても見当たらないんですよね
>>49 いま手元にExcelが無いのであれだが
' Set fBar = CommandBars("Worksheet Menu bar").CommandBars("Cell")
Set fBar = Application.CommandBars("Cell")
で どうかな?
セルに色が設定されていない状態のcolorIndexは何でしょうか? If Worksheets("Sheet1").Cells(1, 1).Font.ColorIndex <> 2 Then MsgBox "color" End If みたいに書いているんですが、bookを作った最初の状態は、白ではなく、色が未設定の状態だと思うんですが。。。
xlColorIndexNone ですかね。
Interior.Colorindex= 0 fontではなくInteriorです!
ありがとうございます! 0でもxlColorIndexNoneでも同じって事ですか? fontとInteriorはコピーする箇所を間違えました;
例えば、 Range("A1").Activate Activecell.Interior.Colorindex=0 Msgbox Activecell.Interior.Colorindex Activecell.Interior.Colorindex=xlNone Msgbox Activecell.Interior.Colorindex Activecell.Interior.Colorindex=xlColorIndexNone Msgbox Activecell.Interior.Colorindex Activecell.Interior.Colorindex=xlColorIndexAutomatic Msgbox Activecell.Interior.Colorindex とかすると面白い?
xlNoneは-4142だから0とは違う
-4142 -4142 -4142 -4105 になったぞ by Excel97
スイマセン、ローカルにコピーしたロータスノーツのファイルにアクセスする方法について教えていただきたいのですが・・・ あと、VBAの設定で参照可能なライブラリファイルにチェックを入れとけばいいんですよね?
オブジェクト型変数には、オブジェクト自身ではなく、オブジェクトの情報を呼び出す為の番号(参照)が入る。 って、要するにポインタのことですか?
参照です。
大まかには合ってるんじゃない? とりあえず、他の変数に代入してもオブジェクトそのものは 複製されない事だけ把握しとけばOK。
実態をコピーせずに何らかの番号で区別するって意味では合ってるかもしれないけど やっぱり参照とポインタは微妙に違う 狭い意味だとポインタはアドレスのことだったりもするし あとは実装次第だ
75 :
71 :2009/05/16(土) 21:09:11
自分が使っているテキストでは、下のプログラムを実行すると、 シートの行と列全てがアトランダムに塗りつぶされるはずなのですが、 実際にやってみても、全列の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
>>76 Office2007で利用可能な桁数が大幅に増えた(16384?)のが理由。
桁数が最大256桁とか決めうちしていると、こういうことになる。
Cells(i). が原因だね。 cells(row,column) で指定しないと。
質問です VBAで他のアプリケーションを開くまでは色々ググって出来たんですが そのアプリが閉じられたら、再びVBAに処理を戻したいんです。 今はファイル名のリストがフォーム上に有ってその名前で検索したファイルを開くという作業で一太郎やワード等を ShellExecuteで開くというの作ったんですが 開いたファイルが閉じられたら更新日時を調べて変化が有れば書類の板番号を更新したいんですが いつ閉じられたかも解らないし、ファイルを開いて処理が中断し閉じて再開すると言った事は不可能でしょうか?
>>80 それはアプリの終了よりもファイルの更新を調べた方がいいのでは。
VBAで1秒間隔のタイマーをセットして、ファィルのタイムスタンプを1秒おきに調べるみたいな方法なら
すぐに思い付くけど。
えっ、それでいっちゃうの?
行くって言ってるだろ
だって 思い付かないんだもん
OpenProcess()してWaitForSingleObject()するのは駄目なのか?
dirname/filea.ext dirname/fileb.ext があったときに、".ext"に関連づけられているsomeapp.exeを起動したとき、 fileb.extもsomeapp.exeで更新している可能性があるので、 プロセスの終了を待ち合わせて、dirname/*を全検索して情報を更新するのが一番。
ファイルを閉じて、アプリは閉じないかもしれない
ROTにファイルがあるかチェックすればよい
line input 命令で chr(&h0) の入ったレコードを読み込むと強制的に chr(&h20)に置き換えられるのでしょうか? もしそうでしたら、何らかの回避方法を教えていただきたいのですが・・・
バイナリで読め
>>86 試して見ましたが
ファイルが開き終わるとwaitが終了し次の処理に移ってしまうようで上手くいきませんで
filepath="sample.txt"
CreateObject("WScript.Shell").Run FilePath, vbNormalFocus, True
MsgBox FilePath & "が閉じられました。", vbInformation Or vbSystemModal
これで済ませました お騒がせしました
ワークシートのmodと異なり、VBAのmodは小数点下が切り捨てられてしまいます。 小数点下を含む剰余を返すようにしたいのですが、ワークシートのmodは演算子だから application.mod()とは出来ない。 良い方法はありますでしょうか?
小数点下は元の数と同じな気がする
95 :
93 :2009/05/19(火) 15:32:48
>>94 分母が整数なら・・・。
x mod yの場合、x - Int(x / y) * yで良いのかなぁ。
x - (x \ y) * y だとどうだろう
顔文字かと思った
すいません、WindowsXP SP3、Excel2003での質問なんですが、 VBAを使って罫線ツールバーの「罫線を作成」機能(セルの枠線にそってクリック・ドラッグで罫線を引く) と同じことをするのは可能でしょうか?
>>99 罫線を引きたいセルを選んでVBA実行して罫線が引かれるっていうのならできるんじゃね
test
以下のようなことをやりたいです。 XP、Excel2003です。 Excelファイルが2つある。1つは用語集ファイルと呼び、もう1つは作業ファイルと呼ぶ。 用語集ファイルには英単語とその対訳がリスト形式で保存されている。 作業ファイルには英文が書かれていて、知らない英単語が出てきたら用語集ファイルを検索して その意味を調べる。 具体的には 1.作業ファイル中の検索したい単語を反転表示させる。 2.右クリックのショートカットメニューから、独自に追加した「単語を検索」をクリックする。 3.用語集ファイルに、1で選択した単語の検索結果が表示される。(Ctrl+Fでの検索と同じ表示結果) ※ただし、作業ファイルにはマクロは記述しない。 作業ファイルにはマクロは記述しないので2が無理かと思うのですが、代替案として どのような方法を取ればいいでしょうか?(右クリックのショートカットメニューでなくてもいいので とにかく作業ファイルにはマクロは記述せずに、3と同じ結果を得たいのです) おおまかな手順でいいので、ヒントをお願いします。
personal.xlsに記述するのもだめ?
104 :
102 :2009/05/20(水) 21:49:38
>>103 OKです。
personal.xlsが何なのか知らなかったので調べたのですが、どうやら自分の作ったマクロを
まとめておくエクセルファイルのようですね(初心者ですみません)。
つまり、最終的には作業ファイル・用語集ファイル・personal.xlsという3つのファイルで作業する
という認識で正しいですよね?
>>102 その程度のユーザビリティなら、そのままCtrl+Fで良いじゃん。
わざわざマクロを組む必要性がわからん。
106 :
105 :2009/05/20(水) 22:01:04
>>95 別に分母が正数じゃなくてもそれでいいんじゃない?
むしろ分母が整数の必要があるのは
>>96 だな。
重複に関してちょっと質問します。 = IF(COUNTIF(B:B,B4) >1, "重複","") この関数でE4という条件をB列全てに適応できたらと 思っています。この関数ではB4のセルの内容が 他と重複してるかいないかのチェックだけになります。 B4セル エクセル B5セル ワード このような場合エクセルとワードという単語がB列で 重複してるかいないかのチェックになります。
これはVBAではないですよね?
エクセルだなw
あるセルにこんなSUMIF関数を入れたいんだけど、 Cells(r + 1, 4).FormulaArray = "=SumIf($O1:$O500,cells(r,3),#K1:$K500)" エラーになってしまうのは、検索条件がおかしい? (rはFOR〜Nextさせています)
Cells関数なんてあったか?
>>111 何で文字列に変数名が入ってるんだ。
” ”で囲まれた中は文字列だから、rは文字のrでしか無い。
てか、SUMIFなんて使わずにVBAで構文書いた方がずっと楽だよ。
こうか? Cells(r + 1, 4).FormulaArray = "=SUMIF($O1:$O500," & Cells(r, 3) & ",#K1:$K500)"
>>111 そんなのはピボットでやれよ。
#は$の間違いか?
>>113 for文使ってるって言ってるんだからVBA使ってるいるんじゃないのか?
117 :
デフォルトの名無しさん :2009/05/22(金) 11:29:40
>>4 replace
☆VBAはVisual BASIC For Applicationsの略だとされており、Visual BASIC
Visual BASIC .NET VBScrptとは文法が異なる言語です。(ただし共通性は
概して高いです。)
☆制限はそれなりにありますが多くのVBA環境からもWindowsの共通ライブラリ
を利用することが出来ます。(但しそれぞれのライブラリの個性に応
じた、専門知識は必須ですがそれが公開されている(=入手可能)とは限りま
せん)
☆このスレではVBAを用いてExcelがインストールされている
Windowsマシンでは、原則としてはプログラム言語の種類によらずに
使用可能なライブラリ「Excel オブジェクト」の公開部分の操作をし
て目的の結果を得る(※)手段を考案する状況で発生した疑問、質問に対して
有志が答えるスレッドだと考えられます。Excelに付属のVBAエディター
を使用してプログラミングを行っているという状況はまさにこの
状況になりますし、その状況以外で発生したものはスレ違いになる可能性
が濃厚です。
(※)この手段が邪道でExcel道に根本的に反するという意見も貴重
です。Excelは一元的かつ算術的な処理の為のソフトウェアであり、多元的
かつ手続き的な処理には向かないという考えに基づくものです。
本来VBAがもっとも効率的に活躍するのはAccess環境であるという考え方
を取りたいものです。
>>111 そもそもFormulArrayなら範囲に1個の配列数式だからループを回すのはおかしい。
式の入力範囲がD2:D100だったらD2:D100を選択して{=SUMIF(O1:O500,C2:C100,K1:K500)]だが
Range("D2:D100").FormulaArray = "SUMIF(O1:O500,C2:C100,K1:K500)"
と書けば配列数式が入力される。
配列数式じゃなければFormulaArrayじゃなくてFormulaだ。
どっちにしてもループは回す必要なし。
>>115 が言うようにおそらくピボットテーブルでできることだろうけどな。
Range("D2:D100").FormulaArray = "=SUMIF(O1:O500,C2:C100,K1:K500)" だった。
>>117 回答者側はその物言いで理解できるだろうけど
質問者側はそれじゃ理解できない奴多いだろうな
世の中は即理解できる世界ばかりで出来ているわけじゃないことを 教えるのは重要
プログラムって、頭の良い人なら3日くらいで何でもできるようになるのだろうか? 自分は4月から勉強し始めたけど、やってもやっても、 分からないことや、知らなかったことが出てきてゴールが見えてこない。
頭の良い人なら3日くらいで何でもできるようになるのだろうか? 3日くらいで何でもできるようになるのが頭の良い人
試験勉強じゃないから暗記しなくてもいいし わからなかったら人に聞いてもいいし 本人に作る気があればプログラムなんかいくらでも作れるだろ
俺は長い事ECMAやってからVBAを始めたんだけど、 ・言語体系を覚えるまで3か月 ・VBAで出来る事、向いてる事かが分かるまで更に3か月 ・調べながら自分で作れるようになるまで更に3か月 って感じで、かなり時間が掛かった記憶がある。 VBから始める人ならそれこそ3日で出来るとかあるだろうけど、 それ以外の言語からだときちいわ。 未だに分からん事の方が多い。 プログラムやったこと無い人だったら、変数って何?配列って何? って事から始まるんだし、もっと時間かかるんでないか?
ECMAって何だ?
まず、何でも出来るようにはならない。 出来るよ!って人でもその時々で調べながらプログラム組んでるものです。 暗記する必要もないし、調べながらでも出来れば問題ない。 大体、使うものって限られてるし、それが出来れば十分なわけです。
>>125 ECMAってJavaScriptだろ?
そりゃきちいわ。同じ系統でもVBScriptからだと
だいぶ違うと思うがどうかな。
だがVBA自体はかなりしっかりした
言語なんで半年以上かけて勉強したことに
ついて損はしてないね。
OS:WindowsXP Excel2007 での質問です。 今までExcel2003で使っていたマクロの冒頭部分が以下のとおりです。 If Dir(OutPath & "\完成", vbDirectory) = "" Then MkDir OutPath & "\完成" ActiveWorkbook.SaveCopyAs FileName:=OutPath & "\Tmp.xls" Workbooks.Open FileName:=OutPath & "\Tmp.xls" Dim TmpWorkBook As String TmpWorkBook = "Tmp.xls" Workbooks(TmpWorkBook).Activate ここで作った一時ワークブックに、別に開いたCSVファイルをシートごとコピーするという命令が続くんですが、 Excel2007になってからCSVを開いた時勝手に巨大なシートサイズになる?のかどうかわかりませんが、 コピーの時点で「コピー先に対してシートサイズが大きすぎてコピーできません」となるようになってしまいました。 そこで上記マクロの"Tmp.xls"をすべて"Tmp.xlsx"にしてみたのですが、 今度はファイル拡張子とファイル内容が一致しませんと言われてOpenできませんでした。 原因と対処がわからないのですが、どのように改善したら良いでしょうか?
追記:マクロ実行時点でのActiveWorkbookは本マクロが含まれてるファイルです。
すみません、自己解決しました。 大元のファイルをxlsmで保存しなおして、VBAの中もxlsmにすればいいんですね。
>>122 目的があれば、すぐに覚えられる
事務作業の自動化のために
表への入力、印刷設定→印刷の自動化、ファイルを正規化させたり、シートを一度に何個も作る・・
等の作業をマクロの記録。そして改変。後はifやforを覚えたかな
プログラムへのとっかかりとして、マクロの記録はとんでもなく優秀だと思うわ
プロシージャやメソッド、その概念すら覚えて無くてもとりあえず動くマクロが作れるってところがね
>>127 確かに暗記しなくても書けるには書けるが、せめて
宣言系、制御系、演算子くらいは最低限暗記しないと、とても実用にはならないよ
まあこのへんはまともなコード書けば必ず使う物だから、意識して覚えようとしなくても
すぐに暗記しちゃうとは思うが
>>122 やりたいことが明確になればすぐにできるようになると思うよ
わからないことが出たら調べてそれでもわからなければここで聞けばみんなが教えてくれるし
参考書読んでてもあまりできるようにはならないかな
まず簡単な
A1の値をA3にコピーするから
A1の値をSHEET1のA3にコピーしてみる
さらにA1の値を別BOOKのSHEET1のA3にコピーしてみる
と言ったように自分でいろいろ弄って遊ぶような感覚でやっていかないと
覚えが悪いと思う
VBAを使ってツールバー上のコントロールを実行したいんですが、 ドロップダウンリストなどを項目を選択して実行するということは可能でしょうか? 例えば書式設定ツールバーのフォントを選択するリストでMS明朝を選んで実行、というようなことです。 普通のボタンをExecuteで実行するやり方は分かったんですが、リストの場合はどうすれば…
> ★3 丸投げのプログラム作成依頼は受け付けていません > ★7 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み > コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 > ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
>>136 そんなピラミッドを描いて何になる?
って解答欄に書いて、相手にたたきつけろ!
For〜Next、二重ループ とまで書いてくれてるのに分からないとか
デバッグのことに関して質問したいです。 代入していない、宣言していない変数へアクセスしたときにエラーを出すにはどうすればいいですか? Option Explicitを指定すると 代入は検知できるんですが 宣言してない変数を読み出しても、Empty値が返ってくるだけで そのまま実行されてしまいます。
それともう一つ、 また、エラーが発生した箇所を調べることは出来ないのでしょうか? たとえば、オブジェクトをSetを使用しないで代入すると 「実行時エラー'91' オブジェクト変数またはWith(ry」と例外が発生して、ダイアログが出ますが この例外が発生した箇所を調べることは出来ないのでしょうか? 現在は地道にステップインでエラーが発生するまで追っていますが なんだかばからしくてやってられません。 また、例外構文もN88BASICを思い出させる、On Error〜割り込みしか無いのでしょうか? よくある、try〜finally 〜catch(Exception e) というような構文はないんですか?
>>142 >なんだかばからしくてやってられません
それが自分の資質を示しているねw
>>136 辛口な事言うけど、論理的思考が全く出来てないでしょ。
ただ答えだけ貰ったって何も役に立たんのでは?
単位もらえりゃ良いって事なのかもしれんけどさ。
for i = 1 to 9
>>136 途中送信しちまった。
for i = 1 to 9
for j = 1 to 9
cells(i,j).value = i*j
next
next
つーか、こんな問題も解けない生徒がいるのに良く授業だなんて言えるわな。
>>142 エラー吐いた部分で黄色く反転して中断されないか?
これでも別に不正解ではないな。プログラムサイズに制限もないみたいだし。 二重ループは最後に空ループでも置いとけばいい。 Range("A2")=1 Range("A3")=2 Range("A4")=3 Range("A5")=4 : 以下略 ちなみに、文句言ってるやつは全科目100点だったのかな? 宿題を誰かに写させて貰ったこともないのかな? 学校なんてこんなもんだよ。まじめに考えすぎ。
>>145 そうやって結局教えちゃうから育たないんでしょ
たかが5時間でギブするのはどうだよ
>>147 論点のすり替え
ここは宿題教えるスレじゃない
単位なんてもらったもん勝ち。入試だって就職だって、まぐれでも入ったもん勝ち。 世の中、要領と運のいいやつが一番トクをする。
九九はどうでも良いんだけど、ピラミッドの方がなぁ。 指定された整数が129以上だと、その時点でオーバーフローだな。2003までは。 do untilで指定の数までインクリメントして、 do untilで1になるまでデクリメントして、 積み重ねる部分を関数化するのが楽だと思ってしまた。
>>149 それ以前に、こんな問題、読んで1分で分からなきゃモノにはならないよ。
こんなレベルの低い、下らないもんで良いのか。 やっぱ学校なんて気楽なもんだね。 この程度の問題が100点でした!VBA出来ます!! って入ってくる新人がいるって事の方が怖い。
うちの学校は一般教養にコンピューターの授業が週一であって、 簡単なプログラミングの問題が出た。 少なくとも生徒の99.9%はプログラマーなんて目指してなかったし 宿題なんてほぼ全員が誰かのノートを丸写ししてた。
ふーん
うちの商学部でもCとかJavaとかの授業があった。教え合ったりこそはしたけど、コードとチャートは各自で書いてたよ。 SEにはならなかったけど、今の職場でVBAが扱えることで重宝してもらえてる。てかSEにならんでよかった、なったら埋没してたろうから。
>>157 自分より優秀な奴が集まる集団で働くよりも、自分が一番の集団で働く方が、
大事に扱われるし、自尊心も満たされるしなw
給料3万円しか違わないなら、俺は後者を選ぶ。
うちのひいじいちゃんが言ってた 「鶏口となるも牛後となる勿れ」ってね
俺は三番手位でいいや。 出る杭は打たれる、という諺もあるしな。
俺はわかっててもできないフリをしてる。 なんか面倒な作業を押しつけられそうだし。 今の年収で満足してるし、課長とか部長にもなりたくないし。 最低限の生活が出来ればいいや。
現実で使えない問題なんてさっさとネットで聞くのが吉 現実的にありそうな問題は分かるまで自分で考えるのが理想だが、そんなことで単位落としたりしてはそれはそれで問題だろう 実際現場ではネット使い放題、上司に質問し放題なんだし かと言ってそれに頼りすぎて成長しないのも困るんだけどね でもそれが仕事がすすまないのも困るんだけどね
>>143 構文チェック時・コンパイル時に分かることなのに
実行しないと分からない。しかも100行を超えるコードをウォッチ式で変数を監視しつつ、ステップ実行するというのは
明らかに効率が悪く、方法を見直す必要があるため、質問しました。
>>146 されません。 例外が発生すると、OKとHELPしか選択肢のないダイアログが出るだけです。
もちろん、ブレークポイントを設定したり、ステップ実行したり、Escキーで停止したときには
実行中の行が黄色く表示されますが。
書き忘れていましたが、
Office 2007 EEで保存形式は2007+マクロ(xlsm)です。
2007で確認したけど、164と同じ。 もしなんだったら、MSDNの原文読めばいいんじゃない?
>>165 条件付きコンパイル引数のとこはうちでも空欄
ヘルプも同じ所が同じようにおかしい
セル内の文字列を選択した状態(反転表示した状態)のまま、マクロを実行することはできないのでしょうか? ツール→マクロをみてもグレーアウトされた状態で実行できません。
>>136 今更だが今初めて質問みたのでピラミッドのヒントだけ
1,3,5,7,9と増えていくから必要な”■"は段数*2-1必要。
ループは後ろから回せばよい。
あとはCellsとかResizeとか好みでOffsetとか。
ループは頭からでも同じか。
一寸だけキモく書くならこんな感じか? For i=1 To height For j=1 To height*2-1 Cells(i,j)=IIf(i>Abs(height-j),"■","") Next Next
>>172 ふつうに数学的に考えるなら
y = n - | x - n/2 | で良いよね nは底辺の長さ n = h * 2
グラフに疎い人だと、ピラミットは垂直二等辺三角形が2つくっついたものだととらえて
x1(i) = h - i x2(i) = h + i y2(i) = y1(i) = h - i (0 <= i <= h)
とするかもしれない。
ピラミットに必要な石の数は孔子にでも聞け。区間[0,n-1]までで上記の式を積分すれば分かる。
垂直二等辺三角形
175 :
173 :2009/05/23(土) 21:05:14
>>174 どんな三角形だw と思ったら自分で書いてたorz
正しくは"直角"二等辺三角形です
For i = 1 To 9 For j = i To 9 Union(Cells(i, j), Cells(j, i)) = i * j Next Next If height * 2 - 1 > Columns.Count Then MsgBox "列数が足りません" Else For i = 1 To height Cells(i, height - i + 1).Resize(, i * 2 - 1).Value = "■" Next End If
>>176 union使いたかっただけじゃないのかと。
Range("A1:I9").Formula = "=ROW()*COLUMN()"
Height = 5 [A1].Resize(Height, 2 * Height + 1).Formula = "=IF((ROW()+COLUMN()>" & Height & ")*(COLUMN()-ROW()<" & Height & "),""■"","""")"
Range("A1:J10").Formula = "=IF(ROW()*COLUMN()<>1,(ROW()-(ROW()>1))*(COLUMN()-(COLUMN()>1)),"""")"
181 :
デフォルトの名無しさん :2009/05/24(日) 08:15:08
>>135 ちれすだが、win32 apiを使用すれば可能。
enumwindows等でハンドル取得、sendmessageでコマンド送信する。
概してvbaでやるもんではない。
それよりも自前機能内なら、font選んで使った方が早くないか?
知らんけど。
ちょいと見逃してて今読み返してみたが、Win32API使う必要なんて全く無いじゃん Application.CommandBars("Formatting").Controls("フォント(&F):").Text = "MS 明朝" Textプロパティに値を代入した時点で、Executeしたのと同じで選択セルのフォントが変更される 継承って概念を理解してないとわかりにくいかもしれないけど、定義上Controlsコレクションが返すのは CommandBarControlだが、実際にControls("フォント(&F):")が返すのはCommandBarControlを継承した CommandBarComboBoxなので、CommandBarControlには無いTextやListIndexなどのプロパティが指定できる 上記の書き方では.Textプロパティはコードの自動補完リストには出てこないが Dim objCommandBarComboBox As CommandBarComboBox Set objCommandBarComboBox = Application.CommandBars("Formatting").Controls("フォント(&F):") objCommandBarComboBox.Text = "MS 明朝" とすればちゃんと補完リストにも出てくる
183 :
135 :2009/05/24(日) 15:54:03
>>181 ありがとうございます。実際には罫線ツールバー上にある「罫線の作成」「罫線グリッドを作成」の
線スタイルと線の色を選択したかったんです。
とりあえず罫線の作成を使うのはあきらめて、Bordersで選択セルに線引くマクロ作って代用しました。
質問です。 ユーザーフォーム上のコンボボックスでリストの中から 選択すると、その文字が全選択された状態になります。 これを解除してカーソルの状態にするにはどう記述す ればいいのでしょう?
ComboBox1.SelStart = Len(ComboBox1.Text)
自分では、セル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
>>187 Sub 条件判断()
Dim i As Integer
i = Range("a1")
If 90 > i And i >= 75 Then
Range("b1").Value = "合格"
ElseIf i >= 90 Then
Range("b1").Value = "優秀"
Else
Range("b1").Value = "不合格"
End If
End Sub
>>188 ありがとうございます。
>>186 の式だと、ElseIf の文が評価されずに終わるから、ダメ。
という理由で合ってますか?
>>189 If i >= 75 Thenの時点で100の判定はされているので
ElseIf i >= 90 Thenの部分は評価されません。
こう書いた方が分かりやすかったかも
Sub 条件判断()
Dim i As Integer
i = Range("a1")
If i >= 90 Then
Range("b1").Value = "優秀"
ElseIf i >= 75 Then
Range("b1").Value = "合格"
Else
Range("b1").Value = "不合格"
End If
End Sub
こういうパターンは、Select Caseで書く方が判り易いかな。 そして判り難い書き方の例。 Range("b1").Value = Choose(1-(i>=90)-(i>=75),"不合格","合格","優秀")
「分かりやすい」感覚の押しつけには反対です。
分かりやすいって書く前にコードを書いてみたらいいじゃない その方がどちらが分かりやすいか「分かりやすい」だろう
おれならElseIfは使わないかな If i >= 90 Then 優秀 Else If i >= 75 Then 合格 Else 不合格 End If End If
196 :
デフォルトの名無しさん :2009/05/26(火) 22:24:00
VBAで たとえばExcelで Z11に文字が値が入力されていたらA1〜Z11を全選択 A40000に文字が値が入力されていたらA1〜A40000を全選択する文を記述したいのですが これってどうすればいいのでしょうか?
>>196 うーん・・マクロの記録で
ctrl+end
と同じってこと?
UsedRange.Selectで解決しそうな予感
ファイルの検索やフォルダの検索ってできますか? あるルートフォルダから、以下何階層に渡ってフォルダが作られているかは不明で、 指定した文字を含むファイルをルート以下から探して、返したいんだが。。。 全てを探して、名前を含むリストを作りたいんだよね。
とりあえず、FileSearchオブジェクトは使用禁止と言っておく。 Office2007で廃止する気満々だったので。
とうとう俺がVBAに本気出すことにした。 今はまだひよっこだが、いずれ大鷲となって羽ばたいた時 おまえら大鷲先生と呼べよ。
飛んでから言えよw
何か知らんががんばれよ 俺は配列で飽きてC言語やってるわ
Excel VBA FileSearchでぐぐると Dir関数とかの話がでてくるよ
FileSearchってのは使わない方がいいのは何故なんでしょう?
質問です。 Functionプロシージャに渡したい引数が多い場合、構造体を作って Public Type UserType a As integer b As Long c(10) As String End Type Sub AAA() Dim data As UserType Call BBB(data) End Sub Function aaa(ByRef data As UserType) '処理 End Function のように構造体ごと渡してやればスッキリしますよね。 この時dataの中身を値渡しのように使いたいとしても、参照渡しとなるので Functionプロシ−ジャの中でdataの中身が書き換えられる恐れはありますよね? 構造体を渡すけれども、値渡しとして使うという明示的な方法はあるのでしょうか? 宜しくお願いします。
>>208 基本的には無い。やるとしたら以下の3つかな?
@コーディングルール徹底(コメントを残して従う、関数名 etc)
A予め構造体をコピーしておく
B構造体ではなく、必要データだけ渡す
もしかして、byval渡しなら出来たりして。
けど、VBAに限らず上の3つは基本だと思う。
W2K XL2000 配列から重複データを排除しユニークなデータの集合にする方法を教えてちょんまげ
ユニークといえばモニーク
>>214 オートフィルタとかワークシート関数とかを如何に活用するかが
ExcelVBAの醍醐味
>>215 そうだね。
となりに=COUNTIF($A$1:A1,A1)が1になってるとことか、=MATCH(A1,A:A,0)=ROW()がTRUEになってるとこをオートフィルターにかけりゃいいもんな。
配列まで使えるってことはVBAをそれなりに使えると考えられるわけで 既に存在する配列からの削除って事は フィルタかけるくらいなら取り込み時点で排除する方法を採っているだろうと予想できるわけで CreateObject(Scripting.Dictionary)はこれ自体の機能はスマートだけど 結局配列に戻さないといけないから実用レベルで組み込むとコードが鬱陶しいんだよね。 なんか実務家ならではの回答ってないの?おまえら
dictionaryに放り込んでから配列に戻すのが面倒だと感じるならば、 重複判定を積んだ配列に放り込めば良いじゃない。 配列を複数持つ事を嫌うならば、クイックソートで配列を並び替えて、 重複した場合に削除すりゃ良い。 これはワークシートでやってる事と一緒だけどね。 個人的には、作業用配列を作る事に違和感を感じないんで、 別配列に重複判定しながら放り込むけどな。
219 :
217(210) :2009/05/28(木) 19:48:25
いいですね。教えてちょんまげ。 まず「配列に重複判定を積む」ってどうやるんですか? それから、配列から配列を作ろうとする場合、まず二重ループでの処理を思いつくけど 配列を二重ループ内に組み込むとエラーが出ちゃいますよね。 これ、どうやって回避、あるいはどんな他の方法を採ってますか?
1次元配列で良ければDictionaryのKeysメソッドで何も面倒なことないんでない? 別の2次元配列なら重複判定しながら放り込んだ方がいいけどな。
Scripting.Dictionaryがハッシュ使ってて性能いいんじゃね?
>>221 データによるね。
あまりにも多いとCollectionに負けるし、クイックソートして詰める手法にも負ける。
Dictionaryで重複を弾くのは裏道を抜ける感じがするんで、 論理的思考を養う段階のレベルならば、Dictionaryを避けて配列使った方が良いかもなぁ。 でも、pushがデフォルトで搭載されてない言語だから、ステップ数増えるよね。 Dictionaryでもいいかな・・・とも思う。難しいのぉ。 これを機会にクイックソート覚えるのもいいかもね。
CreateObject("System.Collections.SortedList")は?
文字列データはいいとして、ある決まった範囲の整数にまでDictionaryを使うやつはアホだね。 猫も杓子もCreateObject(Scripting.Dictionaryを見るとうんざり。
> なんか実務家ならではの回答ってないの?おまえら スレ違いだからコードそのものは伏せるけど、重複削除の汎用関数作って、 それに放り込むだけだろ ワークシートの機能とかScripting.Dictionaryとか使えない言語でも この手の処理は必要になるから、ちゃんといくつかのアルゴリズムが確立されている ソートみたいに、計算量、必要バッファ量、順序の維持(ソートで言うところの安定ソート)など それぞれ特徴があるから、必要なアルゴリズムを必要な言語に書き換えて用意して おけば良いだけの話
>>226 それがどれなのか分からないから教えてくださいって話じゃね
教えてくださいよ先輩
しかしExcel2007の新機能の重複の削除はひどいな。 どっかで見て俺も試したら笑ってしまった。 重複してないものまで削除することあるんだもんな。
229 :
217(210) :2009/05/28(木) 21:33:53
いろいろありがとう。 >重複削除の汎用関数作って 理想としてはこれでやりたいんだけど、 Functionとの間での配列の引渡し方・受け入れ方が分からないんですよ…
>>229 もう総当たりでやれよ。関数化は後の話だ。
関数化するにも、自前でルーチン作成出来なきゃダメなんだしさ。
forで 配列1 から 配列2 に全要素をコピーするだけだ。
その時に、配列2に対象の要素が含まれていない時って条件付けるだけ。
総当たりでやるのが論理的には一番理解しやすい。
先ずはここから入って、処理速度や負荷の問題が見えてきたら、
その状況に応じて別のルーチンを考えれば良いと思うよ。
そういえば、2007で.netってサポートされてるの? 使える雰囲気が全然無いんだが、2010では.netのサポートがあるかな? 次期Officeにはほかの言語もサポートしてもらえるとうれしいな。
232 :
デフォルトの名無しさん :2009/05/29(金) 10:02:32
質問です。 コマンドボタンを押すとへこんだままになってしまいます。 処理は正しく実行されて、もう一度押すとまた処理が実行された後に元に戻ります。 使う上で問題は無いのですが、直したいです。 設定が悪いのでしょうか?
それ、コマンドボタンじゃなくてチェックボックスだろ
234 :
デフォルトの名無しさん :2009/05/29(金) 10:15:42
いえ、コマンドボタンです。 確認したら処理は最後まで実行されていたんですが、 見た目だけだと処理がフリーズして止まっている様な感じになります。
235 :
デフォルトの名無しさん :2009/05/29(金) 10:27:16
解決しました。 今あるボタンを消して新しく作ってみたら直りました。
作り直して解決って事はやっぱりチェックボックスだったんだろうな グラフィックは全く同じだし、押し下げでも上げ戻しでもClickイベント発生するし
>>231 VSTO使えば.netFrameworkの恩恵をフルに享受することができる。
あまり流行ってないけどね。
Excel2003のVBAで新規のbookを作ってファイル名を YYYYMMDDhhmmssにしたいのですが、 Wbook_out = Year(Date) & _ Right("0" & Month(Date), 2) & _ Right("0" & Day(Date), 2) & _ Right("0" & Hour(Now), 2) & _ Right("0" & Minute(Now), 2) & _ Right("0" & Second(Now), 2) もっと適当な命令や定番テクニックってないですか?
>>238 =Format(Now,"YYYYMMDDHHMMSS")
240 :
238 :2009/05/29(金) 18:39:35
>239 ありがとうございました(ペコリ
今、VBAの勉強してるんですが、自分は仕事しててこういう時にVBAが役立った という経験があったら教えていただきたいのですが。。
VBAのおかげで彼女が出来ました!
>>241 ・古いファイルの正規化
・プリンタの変更→印刷→プリンタの変更、をボタン一つで出来るようになったこと
・他人に作ったシートには関数を入れず、ボタンを押して計算させるようにしたこと(何度言っても計算式の入ってるセルに上書きするアホウがいる為)
・ファイル名の一部をシート名にする、等
・彼女は出来・・ねーよwただ仕事上、仲良くなるきっかけにはなったかもしれない
他細かいことは色々あるけど、とにかくまぁ色々便利。特に中小企業でマクロ使えればかなり便利じゃないかな
逆に大企業だと使う場面が無いかと。VBA無しのアクセスの方がよっぽど使う機会が多かった
テキストエディタのマクロや正規表現は結構使うけど Excelのマクロとか、セキュリティ云々でうるさいからあまり使わないなぁ。
Sub hoge() Dim hoge As Range If (hoge Is Nothing) Or (hoge.Value = 0) Then Exit Sub End If End hoge なぜかエラー出る@2007
>>246 Sub hoge()
Dim hoge As Range
Set hoge = Range("a1")
If (hoge Is Nothing) Or (hoge.Value = 0) Then
Exit Sub
End If
End Sub
set
>>247 hogeに値を代入してないのは、値を読み出そうとしたときにエラーを起こさせるためだよ。
VBAはデフォルトでショートサーキット評価ではないみたいだね。
http://msdn.microsoft.com/ja-jp/library/ea1sssb2 (VS.80).aspx
ショートサーキットで評価をするにはOrElseをつかえということだけど
VBAではこれまた制限されてるみたいだね。
If hoge is Nothing then exit sub
if hoge.Value == 0 then exit sub
と分けて書くしかないかな?
何をやりたいのか分らんが、こういうことじゃないよなぁ。 Select Case True Case hoge Is Nothing, hoge.Value = 0 Exit Sub End Select
250 :
246 :2009/05/29(金) 23:31:58
>>249 おお、それだ。
Select Case Trueとか、なんて変態的なんだw
Delphiのcase Integer of (Cのunionと同義)を思い出させるぜ。
なんかトリッキーすぎて分かりにくいなあ。VBAではこういう書き方って一般的なの?
それとも、Ifを連ねて書く方が一般的?
オレはIf〜Elseを並べてる
言語によってスパスパ頭切り替えられない奴は 向いてないと思う。
職場のEXCEL2000で使うためのマクロを作っています マクロ自体は自宅の2003で組んでいます。OSはどちらもXPです。 D2とA5のセルにそれぞれ値が入っているときに、D5のセル位置を取得する方法ってありませんか? Ctrl+Endで移動する位置を取得したいのです。 ActiveSheet.UsedRangeでいけるかなと思ったのですが、セルが飛び飛びで利用されている場合だと うまく機能しないときがあるようです。
256 :
デフォルトの名無しさん :2009/05/30(土) 07:39:32
>>241 SQL Server とのやり取りが多いから、使わないと仕事にならねぇ
検索結果をExcelにはくことが多いから
#数万行出す場合、他アプリから出力すると遅さに耐えられないw
テキスト取り込んで簡単な集計する場合とか、ボタン一発のほうが楽じゃね?
#簡単じゃない集計はDBに入れてから処理する
worksheet関数を鬼のように駆使する人は、ある意味すごいと思うけど
VBA使ったほうが、楽になるのに・・と思う場合が多い
後でメンテする場合、Cellを延々と追いかけるの、めんどくないかなと思うんだわ
#いや、自分はめんどくさがりや だから
#まぁ コード書くのが本職なんだけどねw
数式が長くなると一覧できなくなるのと コメントが書けないのがワークシート関数の欠点かな 関数一発でいきなり動いて結果が出る手軽さとどっちを取るかだね
delete押すだけで消えてしまうのも怖い
保護
行がたくさんあってゴチャゴチャしてるシートの視認性を良くするために 選択したセルのある行に一時的に色をつける処理を考えてるんですが Private SubWorksheet_SelectionChange(ByVal Target As Range)
誤送信失礼。 行がたくさんあってゴチャゴチャしてるシートの視認性を良くするために 選択したセルのある行全体に一時的に色をつけようと考えてるんですが Private Sub Worksheet_SelectionChange(ByVal Target As Range) Rows(ActiveCell.Row).Interior.ColorIndex = 37 End Sub でとりあえず色はつけられたものの カーソルを移動した後もその行は色がついたままになってしまうので どうにか消せないものかと考えてるんですが、何か方法はありませんでしょうか?
消す処理入れてないんだから消えないのは当然でしょ? Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.Interior.ColorIndex = xlNone Rows(ActiveCell.Row).Interior.ColorIndex = 37 End Sub 但し、行強調以外の色つけも全部消えるからね それじゃ困るというならあとは自分で工夫しな
VBA以前にレイアウトを考えたほうが良いんじゃね?
あー、なるほど 色をつける前に全消ししてしまえばいいんですね 色をつけたあとに前に選択していた行だけを消そうと考えていたせいで思いつきませんでした ありがとうございます
ワークシートの右端の列にフラグを入れるとか
>265 ダッセw
>>261 実際にやってみると分かるけど、すげー重いぞそれ。
とても実用化出来ないほど重い。
余程化石なPC使ってるか、余程システムかExcelが腐ってる状態で使ってるんですね
昔は
>>261 や
>>262 みたいなのは重くて使えなかったのは確かだが、今のパソコンはそれほどでもないんじゃない?
Excel97が出たころは一工夫して下みたいな十字カーソルをやってた。
もっともExcel97はTargetじゃなくSelectionだったかも。
Dim rng As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not rng Is Nothing Then
rng.Interior.ColorIndex = xlColorIndexNone
End If
With Target
Set rng = Union(.EntireRow, .EntireColumn)
End With
rng.Interior.ColorIndex = 8
End Sub
今のExcelは行列番号の色がはっきり違って目立つから全然必要ないと思うんだが。
実はたいして変わらないんだけどね
他ファイルを処理するプログラムの初期処理で、 選択範囲を保管しておきたいです。 選択範囲がセルなら、Selection.Address 選択範囲が図形なら、Selection.Name を保管しておけばいいのだろうけれど、 値にアクセスする前に型を判別できないのでエラーになってしまう。 どうしたらよかんべ?
>>271 なんでわざわざAddressやNameを保持するの?
Selectionそのものを保持すればいいだけじゃん
Dim hoge As Object
Sub 選択保持()
Set hoge = Selection
End Sub
Sub 選択復元()
hoge.Select
End Sub
>>272 サンクス。
Rangeオブジェクトのときは上手くいくのだけど、
画像などの場合、他の箇所で切った貼ったを行ってしまうと、
PictureクラスのSelectメソッドが失敗してしまう。
なので、質問したようなやり方をしたいのだ。
>>270 今はたいして変わらんかも知らんが、昔の低スペック機では全然違ったのよ。
いったん全部色を消すのは使い物にならなかった記憶がある。
>>269 のコードと、普通に書いた下のコードを比較してみれば分るな。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Cells.Interior.ColorIndex = xlColorIndexNone
With Target
Union(.EntireRow, .EntireColumn).Interior.ColorIndex = 8
End With
End Sub
2007でA1:J100を順番にSelectさせてみたら、こっちは約10秒で
>>269 は約2秒だった。
5倍くらい違うということか。
今の高スペック機じゃ一回では体感できないが昔ははっきり体感できたもんな。
>>273 セルと図形って言ってただろ?
なんで画像が出てくるんだ?
>>275 現行機で0.93秒と、1.75秒だった
10年以上前のPen3 450MHzでも1回当たりの体感に差はない
>>277 バージョンによってCellsとかの扱いが違うのかもよ。
とにかくExcel97で275みたいなのは使い物にならなかったのははっきり覚えているよ。
あまり絡むなよ。
覚えていること(人の記憶)と、リアルタイムで実践したことでは 当然ながら後者に信憑性があることは言うまでもないわけで。 あまり絡むなよ。
本当に嫌な性格だねぇ。 Pentium3の発売が何年か知ってるのかよ。 97年当時Pentium3 450MHzなんてないんだよ。
粘着君が97年当時のパソコンをヤフオクで買い求めたりしてw
Office97が出た頃にはWindows98の話題が出ていた 多くの人はWin95にOffice97パッケージを乗せずに、 Win98もしくはWin98SEとOffice97が入ったマシンに買い換えた 1999年、Pentium IIIが現れWin98の情報も溢れてきた頃に
というか、277は10年以上前のPen3 450MHzって書いてるだけで、10年前にPentium3が無かったってなら 突っ込むのも解るが、10年前にはPentium3の550MHzが出てたし、280は何で絡んでるのかよくわからんな。
277=279だったら277が粘着してるが、別人だったら
>>283 の言う通りだね。
というか、件のコードが当時は使い物にならなかったってことにしようと 約一名が躍起になってるだけのように見えて痛々しい
と約1名が躍起になってるようですね。 ほんと痛々しいね。
>>280 化石引っ張り出してきたよ
12年前のPen2 233MHzでも1回当たりの体感に差はない
カーソルキーで連続移動すれば体感差あるけど
カーソルキー移動1回、もしくはマウスクリック1回に置いて
色の切り替わり速度に違いは感じられない
結局認めてるじゃん
まぁ1回ではって書いたの俺だから、俺が悪かったよ。 気が済んだか?
> 今の高スペック機じゃ一回では体感できないが昔ははっきり体感できたもんな。
だから1回ではってのは間違いだよ。すまんね。
使い物にならないのは
>>268 も書いてる通りだ。
294 :
293 :2009/05/31(日) 23:34:53
295 :
288 :2009/05/31(日) 23:36:45
残念、使い物になってるけど
どっちもファイト!
>>276 Excelのオブジェクトでは、図形に画像は包含されるから。
Shape > Picture
紛らわしい書き方だったか。
いやそもそも
>>288 は真実か?
先ずはそこから検証だ
通りすがり わざわざ書くのは 自作自演 字余り
>>299 お前かわいそうなやつだなぁ。
まぁ自作自演じゃないのが分るのは2名だけだけどな。
図星か
本当の通りすがりは、わざわざ通りすがりであることを 強調する必要もないからな。 当人ではなく第三者的な意見だって事に しておきたい場合の策だったんだろうがバレバレすぎるw
違うんだけどな このIDの無い板で自作自演をするのに わざわざハンドル名付ける必要も そもそも自作自演する必要も無いんだけどな
本当に通りすがりなら、勘違いしてる奴なんて放っておけば良いのに 必死に弁明するから実は通りすがりじゃないことが立証されていく まさに泥沼
>>3 .02は普段さんざん自作自演やりまくってるんだよ。
自分がやってるから他人もそうだと思っちゃうかわいそうな人なんだな。
>
>>3 .02
そんなに焦らず、そんなに怯えずに
自己を誤魔化しきれなくなると相手の罵倒に走る、正に王道パターンw
おまいら会って喧嘩しろよ。 勝った方が正義だw ファイト!
というかその前に静かになっちゃったね 自演で1回線2,3役やってたから連投規制でも喰らったかな
かわいそうな人。
ほんと、かわいそう
>>267 会社のパソコンでやってみたらなんか処理重いなと思って来てみたら
俺のへっぽこコードのせいで変な議論になっちゃったみたいですね・・・
消すほうも塗るほうも範囲を指定すれば軽くなるのかな?
良く分からんけど、changeの度に200ms以上のラグが発生したらNGだな。
性能が高すぎるんじゃね? 比較するなら短い方が最低でも2,3秒になるように範囲を調整した方がいいかも。 値が小さくなるほど誤差の影響は大きくなるから。 あとは2007ではなく2003だと、差が少ないのかも知れない。 うちはメインもサブもXPに2003だけど、A1:J100で5回の平均取ったら メイン 1.6秒:3.9秒 2.43倍 サブ 2.3秒:7.1秒 3.08倍 A1:J200だと メイン 2.9秒:8.6秒 2.96倍 サブ 4.6秒:14.1秒 3.06倍 って結果になったよ。約3倍ってところで、2003なら5倍までの差は無いみたい。
318 :
デフォルトの名無しさん :2009/06/01(月) 08:16:53
>>315 気にするな、基地外が一人紛れ込んできただけらしいから。
Excel2000で>269と
>>275 比べて見たが、はっきり体感差があるよ。
>>277 や
>>288 はシートの上の方の行でしか比べてないんだろう。
>>313 のように入力して最終行近くで比べれば1回でもはっきり分かる。
A1〜J100をSelectさせてみたら
>>269 が8秒で
>>275 が66秒だった。
Pentim D 2.8GHzの結構古いパソコンだけど、もっと昔のExce97当時の
パソコンなら多分
>>275 は後ろの行ではとろくて使えないと思う。
319 :
デフォルトの名無しさん :2009/06/01(月) 08:23:23
>>316 だよな。おれも0.2秒ならストレス感じるよ。
しかし最近はSUMPRODUCTなどで鍛えてる人多いから、そういう人たちは我慢強いかもね。
320 :
318 :2009/06/01(月) 08:41:57
ごめん、
>>313 のように入力範囲が広ければ別に最終行近くじゃなくてA1近くでもはっきり体感差があるね。
>>320 1回65536行目近くに移動してから1行目近くににもどった場合
>>275 は重くなるんじゃじゃね?
1行目近くで軽くするにはオブジェクト変数にMe.UsedRangeをセットすればいいみたいよ。
65536行近くだとやっぱ重いけどな。
322 :
318 :2009/06/01(月) 09:49:56
>>321 トンクス
試してみたら確かにそうだった。
最初はたしかA1近くでは重くなかったはずなのに途中で重くなったのでおかしいと思ったよ。
なるほどUsedRangeね。
>>317 結構速いね。
俺はCore 2 Duo3.33GHzだがそちらのサブ機より約3倍近く遅い。
Vistaがクソなのか?
ところで
>>313 が書いてるように広範囲に入力したの?
しかし
>>269 をさんざん罵倒してたやつある意味すごいよな。
他人の言うことは端から聞く耳持たないらしいけど、変な自信はたっぷりあるんだろうね。
負けることは絶対に許されない人かも知らんね。
前からここや総合相談所に統合失調症の疑いがあるやついるんだが彼かもね。
>>323 広範囲に入力しなくても最終行に飛んで1行に戻ってくるだけで重いみたいね。
速度厨 uza
間違いをuzaで済ませられる性格がうらやましいね。 おれなんか落ち込んで死にたくなるよ。 そこをこらえて謝るけどな。
一連の気違い発言が327じゃなかったらすまんね。
>>324 >>269 を罵倒してる奴なんて一人も居ないよ。
>>269 の方が優れていることは認めた上で、
>>262 でも
使い物にならないほど遅くはないって話をしてるだけ。
会社でいつも怒られまくってて被害妄想気味なのかもしれないけど
誰も
>>269 を責めても攻めてもいないから、よく話を読もうね。
来たね。w もう見苦しいからいい加減やめようや。 会社員ねぇw
とりあえず落ち着こう。
今頃
>>262 が使いものになるってアホでつか?
使い物にならない事例がさんざん書かれてるのに見てないのかな。
ほんと見苦しいいいわけにしか見えないや。
>>333 まぁまぁ。
辛抱強い人には200m秒はおいて数秒のレスポンスでも遅いと感じないかも知れないんだから。
人それぞれだよ。
336 :
デフォルトの名無しさん :2009/06/01(月) 22:23:20
For i = 0 to 20000 Cell.Interior.ColorIndex = Int(Rnd()*20) Next i したらマジで気分悪くなってきた
>>336 最新のExcelはCellsじゃなくてもいいのか
338 :
241 :2009/06/02(火) 00:36:45
>>243 >>256 今更だけど、どうもありがとう。
勉強初めて一ヶ月経ったけど、ただテキストを最初から読んでいくだけだと、
あまり身につかないものですね。
VBAを使って何をどうしたいという動機が必要なのかな?
339 :
デフォルトの名無しさん :2009/06/02(火) 02:09:20
時代の変化を受け入れられないんだね
PowerPointのVBAなんだけど、他所にないようなのでここで質問させてほしい。 PowerPointでファイルを開いてVBAを使った処理をするんだけど、 PowerPointにはExcelのGetOpenFilename()に相当するものが存在しないので、 コマンドバーを使ってファイルを開くダイアログを出してみた。 Application.CommandBars.FindControl(ID:=23).Execute これを実行してみると、ダイアログを呼び出してすぐに次の命令に進んでしまう。 つまり、新しくファイルを開く前に先に進んでエラーになってしまう。 今はブレークポイントを設定しておき、ファイルを開いてから再実行するということをしている。 タイマーを使うとか考えてみたけど、どうも現実的ではない。 何とかうまくやる方法はないだろうか。
ごめん これ 閉じてから再実行でした
>>338 作りたいものを作って、少しずつ改良していくのがいいと思う
>>338 やりたいことがわからないで勉強しても無意味だよ
学校に通ってても英語の勉強が今では何の役にも立たないのと一緒
毎回これやるのめんどくせぇな、、、、なんとかならんかな、、、
からvba勉強し始めると
ここの人の手助けもあって2週間位で株の自動発注から返済までが組めるようになった
株ねぇ そういえば俺の尊敬する株屋さんどこ行っちゃったんだろうな。 某Q&Aサロンで女性になりすまして活躍してるという噂を聞いたが。
347 :
デフォルトの名無しさん :2009/06/02(火) 18:21:01
さっき図書館でSE関係の新刊があったのでパラパラとめくりながら読んでたら、 ”VBAにいくら習熟しても金にならないから、優秀な人はどんどん他の言語に移っていく。 VBAは下っ端の奴がやらされる仕事だ。” みたいな意味の事が書いてあった。 薄々、同じような事を思ってたけど、いざ活字で目にするとショックだ。
質問です。 少し時間のかかる処理をさせているんですが、 その処理が動いてる間、 ボタンなしのダイアログ等で『処理中』と表示させ、 処理が済んだら自動で消す、 といったような事はできますか?
349 :
◆.jruuB3RTA :2009/06/02(火) 19:06:59
Cells(Rows.Count,1).End(xlUp).Select Endプロパティは連続したデータ範囲の終端セルを返すので、 表の途中に空白セルがあるとデータを返せない。 と、テキストには書いてあるのですが、 空白セルがあったら、Null値とか文字列とかを入れるプログラムは書けませんか?
>>347 んっとだな。
VBA単体では金にならない。ってのが正しいと思うよ。
事務処理業務+VBA とか、何かの基礎に付随する能力としてのVBAは金になる。
VBAだけしこしこ組んで金にはならん。
DB+VBAとかでも生活出来る程度の金になるし、
転職する時には凄く大きなアドバンテージになる。
>>348 ユーザーフォームで。
もしくは別シートを表示させるとかね。
>>349 何のデータを返したい?
表の途中に空白があったら、そこに文字列を入れたいのかな?
それならば、forで上から判定させながら入れて行くのが良いんじゃないかな。
for i = 1 to cells(rows.count,1).end(xlup).row
if cells(i,1).value = "" then
cells(i,1).value = "空欄"
end if
next
みたいに。
352 :
◆.jruuB3RTA :2009/06/02(火) 19:30:15
>>351 どうもありがとう。
こんな短時間で答えられるなんてすごいなぁ。
図々しくて申し訳ないんだけど、
rows.count,1
の1って、どういう意味ですか?
すいませんが宜しくお願いします。
Cells(Rows.Count, 1)..SelectとかCells(Rows.Count, 2)..Selectなどやってみれば分りますよ。
>>351 ユーザーフォームとは、、
まだ始めたばかりで余り単語とかも分からず…
>>348 VBAでプログレスバーっていうのはどこかにあるよ
プログレスバーってのはvbaだけですよね? excelで使いたいんです。。。 通常のVBは入ってないので。
357 :
デフォルトの名無しさん :2009/06/02(火) 21:54:20
>>347 あくまで道具の一種ですよ。
ほかの言語でやる必要があればその言語を使えば良いだけ。
並列言語とかをのぞけば、要件抽出して、適当にクラスをモデリングするという基本的な作業は変わらん。
>>350 >DB+VBAとかでも生活出来る程度の金になるし、
それは他の分野で優れていて、なおかつそういうサブスキルがあればその分有利になるってだけの話だろ。
それだけで食っていけるなら、失業者なんて出ないよ。
以前、FileSearchについて質問した者です。 更に質問なんですが、 FileSearchで見つかったファイル、ファイルパスをシートにリストにしているんですが、 その見つかった数だけ、隣にコマンドボタンを自動で作り、そのボタンで隣のパスのファイルを開く、 という動作はできますでしょうか?
360 :
254 :2009/06/02(火) 23:32:35
>>255 遅ればせながらありがとうございました。
リンク先S4でやりたかったことができました。
>>359 リンクでやってみようと思います。
それから、FileSearch実行中にステータスバーに検索状況を表示しようと思っているんですが、
どのタイミングで記述すればいいか分かりません。
以下ソース一部です。
.SearchSubFolders = True ' サブフォルダも探索
If .Execute() <> 0 Then
For Each vntF In .FoundFiles
With objFSO.GetFile(vntF)
GYO = GYO + 1
Cells(GYO, 1).Value = .Name
Cells(GYO, 2).Value = .DateLastModified
Cells(GYO, 3).Value = _
Left(.Path, Len(.Path))
With Worksheets("Sheet1")
.Hyperlinks.Add anchor:=Cells(GYO, 3), _
Address:=Cells(GYO, 3).Value
End With
cntFound = cntFound + 1
End With
Next vntF
End If
End With
>>349 >>空白セルがあったら、Null値とか文字列とかを入れるプログラム
Cells(Rows.Count, 1).SpecialCells(xlCellTypeBlanks) = "Nullとか文字列"
はだめ?
363 :
341 :2009/06/03(水) 01:13:32
だめかなー
vbaって廃止されるの? VSTOだけになっちゃうの?
365 :
デフォルトの名無しさん :2009/06/03(水) 07:19:18
VBAって何の為にあるのだろう? 昨日、VBAを使ってACCESSにつなぐのが1時間くらいできなくて、 さっきExcelのリボンからやってみたら1分でできた。 俺の頭が悪いだけなのかw でも、VBAやったおかげで、他のスクリプト言語の理解度が深まった気がするから、 やはり、勉強してみて良かったのかな?
>>365 お前ではどんな言語をやっても意味ないだろうな
単一の機能を呼び出すだけなら、1時間もかかるのはバカだからだとしても VBAのコード書きからやるよりは、メニューやリボン、ツールバーなどからの方が速くて当然 VBAは主に何度も行う定型処理や規則処理、連続処理などに使う スクリプトも使うならそのくらいわかりそうな物だけど
VBAって補助的なツールとして使うだけだな。 使えればそれなりに作業効率がアップする程度かな。
最初は時間かかってもいいからとにかく動くものを作って理解する 作ったものはエクスポートして保管しておく 後はそれをコピペして改造しながら使っていく VBAを飯の種にしてる人以外はこんなもんじゃね?
純粋にVBAだけで食ってるのは、本書いたり教室で教えたりの人だけじゃね? 俺は全社の業務効率化の為にVBAだけで仕事してるけど、 それでも会社の事知らないと作れないから、それだけで食ってるとは言い難いな。
VBAもピボットも機能の一つでしょ。それ以上でもそれ以下でもない 使いどころを間違えれば仕事が遅くなるのは当然
372 :
341 :2009/06/03(水) 22:14:25
>>366 はは。他の言語とか、そんなことないんだけどなー。
Office VBAはやらなかったもんでね。
オブジェクトモデルも理解してないんだよ。
さっと教えてみてくれよ。
>>361 ですが、
特にレスがないってのは出来ないって事でしょうか・・・
それともここにはそれだけの知識を有した方がいないんでしょうか
もう来んな。臭すぎて気分悪いわ。 やっぱり俺が出て行くわ。
> それともここにはそれだけの知識を有した方がいないんでしょうか そうだよ、だから帰ってね
>>341 PowerPointから
CreateObject("Excel.Application")して
GetOpenFileNameするってのもありか
>>374 まあファイル総数を調べた後に1つ1つカウントすればいいんじゃね?
簡単だろ?わからないなら1から10までカウントのプログラム書いてみ?セルに表示するやつ
あとはそれをどう表現するかの問題。セルに色塗ったり、色付きラベルの長さを伸ばしたり・・・
コントロールもあったかもしれん
そもそも経過処理表示を本気で実装するのは難しい(無理)
インスコ等でも分かると思うが、人間の感覚と処理経過に乖離が発生する。
>>374 「vba ステータスバー」でググった一番上。まさにこれかと・・・
そもそもfor文使ってるのに意味分かってないのがアウツ
おまえらほんと優しいな、あからさまに煽ってるやつの相手してあげるなんて
で?
って
/ニYニヽ /( ゚ )( ゚ )ヽ /::::⌒`´⌒::::\ 呼んだ? | ,-)___(-、| | l |-┬-| l | \ `ー'´ /
XP、Office2003を使用しています IEのherf="javascript:clickQuickLink('summary');" これをクリックしてページの推移をしたいのですが このリンクをマウスでクリックするようにvbaでクリックする方法を教えていただけないでしょうか よろしくお願いいたします
>>384 VBAを使ってのExcelの操作ではなくIE(IEオブジェクト)の操作はスレ違い
>>4
いちいち言わなくてよろしい
言わずとも解ってる人には言わなくても良い 言わないと解らない人には言う必要がある スレ違いな質問しちゃう人は後者なので言う必要がある
ほっとけばよろしい
寛容と無秩序を取り違えている人?
うざいよ
スレ違い認定はもういいよ
論では返せず
ならツモで
>>361 です
見付かったファイル状況ならもちろん分かります。
検索しているファイルのカウントを表示させたいんですが、
どこでどのオブジョクトを見ればよいのかが分かりません
395 :
デフォルトの名無しさん :2009/06/04(木) 23:03:46
世の中に自分で書いたソースが理解できない奴なんて居るの?
2年前のソース理解できませんでした。サーセンwww
397 :
341 :2009/06/04(木) 23:04:55
>>373 えらい人だね
>>377 > CreateObject("Excel.Application")して
なるほど。 明日から出張なんで、帰国したら試してみる。
ありがとう。
スレタイ見ようぜ。
executeした後に、どこにファイル検索数を持ってるんでしょう? プロパティやオブジェクトもググっても見つからないし、 executeしたらその.Executeの中身はすぐにhit数になってるし。
オブジョクト
オブジョイ
オブジョイト
EXCELの自動計算がとまってしまうことがあります オプションの自動計算のチェックボックスはonのままです とりあえずマクロの Private Sub Worksheet_Calculate を削除したところ止まらないようになりましたけど・・ 原因がわかりません
404 :
デフォルトの名無しさん :2009/06/05(金) 21:45:53
Worksheets("Sheet1").Delete これをVBAで実行すると、シートを削除するときに本当に消していいのかという 確認ダイアログを求められるのですが これを出さずに強制的に削除する方法ってあるのでしょうか?
>>404 Application.DisplayAlerts = False
407 :
VBA暦12時間 :2009/06/07(日) 14:49:37
すみません 初歩的な所ではまっています。 下記の処理は、 ”■”なら16行目に値をカウント ”□”なら17行目に値をカウント という処理をしています(4列目に実際に加算したい数値が入っています) この場合、何回もボタンを押すとどんどん値がふえてしまうのでボタンをおしたタイミングで16行目と17行目を0クリアしたいのですが、 コメントにしている部分を解除にすると、なぜか計算がされません。(0のまま) どなかたどうかご教授よろしくお願いいたします。 Private Sub CommandButton1_Click() For 列 = 5 To 27 For 行 = 5 To 10 ' Cells(16, 列) = 0 'Cells(17, 列) = 0 If Cells(行, 列) = "■" Then Cells(16, 列) = Cells(16, 列) + Cells(行, 4) ElseIf Cells(行, 列) = "□" Then Cells(17, 列) = Cells(17, 列) + Cells(行, 4) End If Next Next End Sub あと自分のレベルで参考になるVBAサイトもご紹介いただけると助かります。 よろしくお願いいたします
0にクリアするところはFor文の外にしなきゃだめだよ
409 :
VBA暦12時間 :2009/06/07(日) 16:42:40
うわっ!俺あほだ! ありがとうございました!
Option Base 1 Sub a() Dim a Dim b(3, 3) '空いてる数字探し配列bに入れる For n = 1 To 10000000 a = Range("a1:c3") For i = 1 To 3 For k = 1 To 3 If a(i, k) <> 0 Then b(i, k) = a(i, k) End If Next Next '実際に作成 For i = 1 To 3 For k = 1 To 3 If a(i, k) = 0 Then 'bにない数字を探す Do c = Int(9 * Rnd + 1) If (Application.Match(c, b, 0) >= 1) Then GoTo fjk
Loop fjk: b(i, k) = c End If Range("a10:c12") = b Next Next Next If (1 = 2) Then Exit Sub 'ここまで If (Application.Match(c, b, 0) >= 1) Then GoTo fjk の時点で型が違いますとエラーが出ます、これは何故でしょうか? ワークシート関数matchで検索し、配列bの中にcがあるかどうかを調べようとしているのですが、cがどんな数字でもエラーが出てしまいます。どうしてでしょうか? コードの主な内容は、A1:C3を元に乱数で魔方陣を作ってみようというものです 配列aはA1:C3セルの数字、配列bは一時的な計算用配列です
型が違うってことは型が違うんだよ!さっさと死ね!
え・・
んー。癖が強すぎるコードだなぁ。 余談だけど、こんな書き方を推奨してる参考書でもあるの? 条件指定なしのdoを使ってる所見ると、他言語で覚えたかな。 if thenでGoToに飛ばすコードは記憶の限りでは初めて遭遇したんだけど、 他の言語だと一般的なのかな?後学の為に教えてください。 cが宣言無しで突如出てきてるのは、まぁ良いのか。 bは2次元配列のはずなのに、matchでは何も指定されてないけど、 そこが問題じゃない?
Windows:XP オフィス:2003 VBAの勉強を始めようとセルの結合や色付けなど ごく初歩的なマクロを使ってるのですが マクロで実行した操作を戻ることはできないのでしょうか? たとえばA1:B1セルの結合をすると 戻るボタンがグレーになり、保存せずに閉じて開きなおすしか戻る方法がありません。 これをマクロで実現するにはどうすればよいのでしょうか?
>>414 おお!ありがとうございます!!そこでした
doloopとgotoは今回始めて使いました。参考書とかは特に見ていません。
普通はuntilなどと組み合わせるのですね
ワークシート関数のmatchは↓のページを参考にしたのです
ttp://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200706/07060141.txt If (Application.Match(c, b(2, 2), 0) >= 1) Then GoTo fjk
でも
If (Application.Match(c, b, 0) >= 1) Then GoTo fjk
でも型が違うとエラーが出ます。何が悪いのでしょう?
↓できるだけまとめてみました
Option Base 1
Sub a()
Dim b(3, 3)
For i = 1 To 3
For k = 1 To 3
b(i, k) = 5
Next
Next
Do
c = 5
If (Application.Match(c, b(2, 2), 0) >= 1) Then GoTo fjk
Loop
fjk:
End Sub
matchなんて使った事無いんだが、2次元配列内を一発で検索出来るのか?それ。
>>415 マクロで実行した物は戻せない。
結合したものを解除したいなら、結合を解けば良い。
>>417 可能ですよ。存在してたら数字、存在してなかったら型が違うとエラーになります。
ただ
>>416 ではウォッチ式見ても型も同じです
Sub a()
Dim myary
myary = Array( _
"加入者番号:", "加入者:", "会社名:", "登録日:", "加入日:", _
"予定事項:", "担当者:", "部門:", "区分:", "住所:", _
"請求書住所:", "電話:", "請求書電話:", "アドレス:")
MsgBox Application.Match("登録日:", myary, 0)
End Sub
>>420 違います。
本気で分からないので教えてくださいorz
If (Application.Match(c, b(2, 2), 0) >= 1) Then GoTo fjk b(2,2)が配列もしくは範囲ではないから
>>419 Sub test111()
Dim ar As Variant
ar = [{1,2;3,4}]
MsgBox Application.Match(1, ar, 0)
End Sub
2次元配列にmatch掛けられないじゃないか。
存在していても型エラー出る。
425 :
416 :2009/06/07(日) 23:46:36
申し訳ございませんでした!
>>414 BASICではそもそもIF THENの後のGOTOは省略できるってほど
THEN GOTOが人気だったんだぜ…
>>416 この用途だと Exit Doで十分だな。
というか、今時GoToなんて苦行する必要ない。
GOTO 、GOSUBなんてのはユーザー関数が無かったころの名残。
テキストとか読み込みとき、Line InputとFileSystemObjectの機能とどっちを使うほうがいいの?
,-┐ ,ィ─、ri´^-─- 、 .┌f^f^f^f^f^f^f^f^f^┐ く / , ,' ヽ ヽ| ~ ~ ~ ~ ~ ~ ~ ~ ~│ `<' / ,'レイ+tVvヽ!ヽト 知ってるが │ !/ ,' i |' {] , [}|ヽリ お前の態度が | `!_{ iハト、__iフ,ノリ,n 気に入らない | // (^~ ̄ ̄∃_ア____n_____| _r''‐〈 `´ア/トr──!,.--' <_>─}、 `」レ 'ヽ、 ,.ヘーァtイ Y、.,___/ |.| | i `ー'i´
昔はLine Inputだったけど、今ならFileSystemObjectを使うのが一般的
430 :
427 :2009/06/08(月) 22:14:12
431 :
デフォルトの名無しさん :2009/06/08(月) 23:15:19
Function Line(args1) ActiveCell.FormulaR1C1 = "=COUNTIF(Sheet1!R1C[args1]:R30000C[args1],RC[-1])" こういう感じでargs1を変数にして呼び出し元で中身を変えて実行したいのですが どうしてもうまく来ません どうやればいいのか教えてください
>>431 ActiveCell.FormulaR1C1 = "=COUNTIF(Sheet1!R1C[" & args1 & "]:R30000C[" & args1 & "],RC[-1])"
俺なら = replace("=COUNTIF(Sheet1!R1C[@]:R30000C[@],RC[-1])", "@", "1") とやる事が多い
434 :
433 :2009/06/09(火) 09:53:58
= replace("=COUNTIF(Sheet1!R1C[@]:R30000C[@],RC[-1])", "@", args1)
質問です。 例えばですが、「abcdefg」といった文字列に、「def」が含まれているか、 といった処理をさせようとしているんですが、どうやって比較したらよいのでしょうか? *def*または、?def?の使い分けもできるようにしたいんですが、可能でしょうか?
*def*と?def?の使い分けIをnStrでどうやるんだろ? 俺には分らんな。 Like演算子なら使い分けは簡単。 "abcde" Like "?bcd?"ならTrueだが "abcdef" Like "?bcd?"ならFalseだ。
正規表現なら、 .*def.* .def. だぬ。
ADOからSQLで"*def*"とやるとエラーになんだよね "%def%"もしくは"_def_"と覚えたほうがいいと思う
>>437 横スレだけど、
len(str) が5文字かつ、instrが2なら "?bcd?" に該当するんじゃないかな。
正規表現やlike演算子使った方が楽だけど。
×スレ ○レス
442 :
437 :2009/06/10(水) 19:43:01
よこだっ!いいぞ!いいぞ!そう!よこっ!すれっ!すれっ!!よこすれっっ!!!
質問です。 「マクロ→セキュリティ→Visual Basicプロジェクトへのアクセスを信頼する」にチェックを入れるのを、 マクロで行う事って出来ないんでしょうか?
OS:Windows XP Professional SP2 Excel:2000 以下2つなのですが、参照している列と値を格納する配列以外は全く一緒です。 引数の参照渡しとかでまとめることはできませんか? Yousosu=0 For Each Youin In Range(Cells(36,3),Cells(49,3)) If Youin.Value="" Then ReDim Preserve Joken1(Yousosu) Joken1(Yousosu)=Cells(Youin.Row,2).Value Yousosu=Yousosu+1 End If Next Yousosu=0 For Each Youin In Range(Cells(36,4),Cells(49,4)) If Youin.Value="" Then ReDim Preserve Joken2(Yousosu) Joken2(Yousosu)=Cells(Youin.Row,2).Value Yousosu=Yousosu+1 End If Next
できま
448 :
427 :2009/06/11(木) 01:05:01
s(ry
すぇん
>>446 やりたいことが分からんけど
Dim Joken(36 to 49, 3 to 4)
For i=36 to 49
If Cells(i, 3).value = "" Then
Joken(i, 3)=Cells(i, 2).value
endif
If Cells(i, 4).value = "" Then
Joken(i, 4)=Cells(i, 2).value
endif
Next i
VBAの年月を取得したいのですが 以下のように作成したのですが、 年:XXXX 4桁で取得できました。 月:XX 2桁ができません、1桁になります。 5月なら05として取得したいのですが、修正方法がわかりません A1には、2009/5/1と入力しています。 VBAに詳しい方で簡単に、どうぞお願いします。 Sub sample() Dim myDate As Date myDate = Range("A1").Value Range("B7").Value = Year(myDate) Range("C7").Value = Month(myDate) Range("D7").Value = Day(myDate) End Sub
>>445 >>452 ウイルスとかじゃなくて、あちこちアップデートが必要ににりそうなファイルを
自動でパッチあてる感じにしたいんだ
レジストリはVBEマクロでいじれるもんなの?
>>453 A1が日付なら
Range("B7").Resize(, 3).Value = Split(Format$(Range("A1").Value, "yyyy/mm/dd"), "/")
の1行で充分じゃね?
>>453 書式設定か、
Range("C7").Value = "0" & Month(myDate)
>>450 そうなのですが、いろいろ試してもうまくいかなくて…
>>451 すみません。どんな動作をしたいか、書いておくべきでした。
なるほど…2次元ですか。
ただ、できれば動的配列にしたいかなぁなんて思ってまして。
2次元だと、Preserveは片方にしか利かないとか。
ありがとうございました。また、自分でも考えてみます。
>>456 それじゃ10月は010になってまずいんじゃないかなぁ。
右2文字を取り出せばいいけどね。
>>455 >>456 サンクス
宣言した変数(例、TTTTTTT)に05を文字列として入力したい)
A1に2009/5/1と入力して、あるフォルダの2009年05月XXX.xlsというファイルを
読み込むマクロを書いています。
よろしくお願いします。
>>453 Range("C7").Value = "'" & Format(myDate, "mm")
これじゃダメかな?
>>459 Format$(Range("A1").Value,"yyyy年mm月XXX")の文字列を作ってWorkbokks.Openと組み合わせるだけ。
>>460 できました。
サンクス
, - ,----、
(U( )
| |∨T∨
(__)_)
取得した文字列を、すでに宣言した変数名と一致させて 使いたいのですが、できますか? やりたいのは Dim ABCDE As Integer Dim moji As String moji = AB "moji"CDE = 5 みたいな感じです
>>463 変数はただの入れ物だから、無理じゃないかなぁ
何がやりたいか詳しく書いてくれたら、
別の方法になるかもしれないけれど、実現できるコードを考えられるかも
>>464 たぶん
>>463 が言いたいのはリフレクションを使って
動的に変数を追加・参照することは出来ないかってことじゃね?
そんなことをして、なんになるのか分からないが、そういうことだと思う
# javascriptで関数電卓のフレームワーク+プラグイン(関数やらが定義されてたりする)を作ったときに使ったくらいかな?
たぶん、VBAのリフレクションは貧弱だから出来なさそうな気がする。
だけど、サンプルを見る限り、連想配列で良いんじゃね?って思うな。
最終的にやりたいことは
userStatus("Jonson") = "空腹"
userStatus("Harris") = "眠い"
userStatus("cherry") = "ピヨピヨ来た"
ってことでしょ。
VBAでどうやって連想配列を使うか知らないけど。
# たぶん、つかえないだろうなぁ
# 無かったら、自分で作ればいいけど、速度面でどうなんでしょうねぇ。
# 下手なハッシュ関数作るより、 配列二つ並べて、逐一中身を検索した方が早かったりしてw
>>465 なんか、全然わかってなくて書いちゃって恥ずかしいっす。
教えてくれてあんがと。
連想配列の使い方を調べたら、Dictionaryオブジェクトだらしいです。
468 :
463 :2009/06/12(金) 07:51:24
"moji"CDEってのが変数ABCDEのつもりです たとえば takeda aoyama tanaka sirakawa aoyama koyama みたいな50種類くらいの名前がかぶりつつ列挙されてて、それぞれ何個 でてきたかしりたいのです。 変数 aoyama_name,koyama_name,takeda_name と人数分の変数を宣言しておいて、セルの文字列を順に取得し、 その文字列に対応する変数にカウントしていく方法ができないかと
該当したらインクリメントすりゃ良いんでないかい? Instrでもlikeでも正規表現でも、何でも良い様な気がする。
>468 こういうことでいいのかな。 A列に(1行目から)集計対象があり、B列、C列に集計結果を出力する。 Option Explicit Dim 名前(100) As String, 件数(100) As Integer, i As Integer, i_max As Integer, 縦 As Long, 内容 As String Sub カウント() Call 初期処理 内容 = Cells(縦, 1).Value Do While (内容 <> "") If i_max = 0 Then 名前(0) = 内容: 件数(0) = 1: i_max = 1 Else For i = 0 To i_max If 内容 = 名前(i) Then 件数(i) = 件数(i) + 1 Exit For Else If i = i_max Then 名前(i_max) = 内容: 件数(i_max) = 1: i_max = i_max + 1 Exit For End If End If Next i End If 縦 = 縦 + 1: 内容 = Cells(縦, 1).Value Loop For i = 0 To i_max - 1 '集計結果の出力 Cells(i + 1, 2).Value = 名前(i): Cells(i + 1, 3).Value = 件数(i) Next i End Sub to be continued
続きです Private Sub 初期処理() For i = 0 To 100 名前(i) = "": 件数(i) = 0 Next i i_max = 0: 縦 = 1 Exit Sub End Sub 以上 出現順に名前を格納する配列と件数を格納する配列を用意して、セルの内容を読み込む都度 名前配列を順に調べていく、初めてならば添字を+1して名前を格納し、同じ添字の件数配列 に1をセットするというやり方です。もっとスマートな方法があればお知らせください。
>>468 Excelの本来の機能は表計算ソフトだから、個数を集計する方法はいくつもあるよ。
COUNTIFとかピボットテーブルとか。
VBAだけでやろうとするより、ワークシートにデータを入れちゃって集計の関数を使った方が早い。
VBAだけでやりたいならDictionaryって便利な機能がある。同じ物があったかどうかのチェックが
とても簡単。
Sub 集計()
Dim name() As String 'テスト用データを用意
name = Split("takeda,aoyama,tanaka,sirakawa,aoyama,koyama", ",")
Set dic = CreateObject("Scripting.Dictionary")
For Each n In name '配列で集計
If dic.exists(n) Then
dic(n) = dic(n) + 1
Else
dic.Add n, 1
End If
Next
For Each d In dic '結果出力
Debug.Print d, dic(d)
Next
End Sub
473 :
470 :2009/06/12(金) 13:14:48
>472 こういうことができるんですね。 集計対象データが大量の場合は、いったん文字列変数にに","をはさんで連ねていくことになりますね。 Dictionaryの機能は半角英数の大文字・小文字の別とか日本語対応はどうなんでしょう。
>>473 あくまでもサンプルだから , で区切ったデータを用意したけど、
実際のデータはワークシートやファイルから読み込むのが普通。
キーワードには日本語も使える。英字の大小は区別される。
データを "鈴木,高橋,山田,田中,鈴木,高橋" に変えて試してみ。
50件程度なら重複チェックを省略しても、とりたてて問題はない。 For Each n In name '配列で集計 dic(n) = dic(n) + 1 Next たったこれだけで集計できる。 データが増えると遅くなるけど。
UserFormから数式を入力させて、その数式に該当するセルに処理を行いたいのですが、 ヒントになるサイトか関数などあれば教えてください。よろしくお願いします
477 :
463 :2009/06/12(金) 16:27:12
実は集計するだけではなく、 高橋 100点 三根 98点 山田 100点 高橋 100点 青山 97点 山田 99点 (50人くらい、データは1000件くらい) で100点の人だけ集計して100点の高橋が何人いて、 100点の山田が何人いるみたいなことをしたかったので、 100点で検索して左のセルをみて、 文字列を取得して、その取得した文字列と 関連するの配列名にカウントしたかった のですが、どうもdictionaryでできそうです。 みなさんありがとうございました。
「数式に該当するセル」が意味不明 実例を示せ
>>477 その程度ならVBAなんぞ使わんでも一発で集計できるがね
>>478 失礼しました
やりたいことは条件付き書式設定のようなことで、
例えば
30
20
50
60
40
80
というセルを選択した後、ユーザーフォームから数式を入力してボタンを押すと
数式に該当するセルに対して、処理を行うということです。
条件付き書式設定を使えというのは無しでお願いします。。。
列なの行なの? なんなのその数字。
Chr(13)とvbCrlfの使い分けの判断は何?
vbCrLf = Chr(13) & Chr(10) Chr(13) = vbCr Chr(10) = vbLf
>>482 改行コードは状況によって変わることがあるから
Chr(13)とかChr(10)とかに固定すると具合が悪いこともある
ぜんぜん「数式に該当するセル」の説明になってない…
俺がエスパーすると 数式の解に該当する数字の入ったセル
数式: >=50 数式に該当するセル: 50 60 80 ってことじゃね
俺がエスパーすると、 フォームから「A2=A1+10」と入力する。A1に5が入っていたとしたらA2に15を入れる。 どうだ?
463が説明しようとする度にエスパーが大量に必要になりそうな悪寒 何をどうしたいのか細切れに話そうとしてるからますます判らん w
____ /_ノ ヽ、_\ o゚((●)) ((●))゚o ,. -- 、 /::::::⌒(__人__)⌒:::::: / __,>─ 、 | |r┬-| / ヽ | | | | { |__ | | | | } \ ,丿 ヽ | | | | / 、 `┬----‐1 } | | | | / `¬| l ノヽ wwwwwwwwwwwwwwwww \ `ー'ォ / 、 !_/l l / } { \ l / ,' \ ´`ヽ.__,ノ / ノ \ ヽ、\ __,ノ /  ̄ ヽ、_ 〉 ,!、__/
>>480 数式からEvaluateで戻り値を求めて、その戻り値でフィルターにかけりゃいいじゃん。
それともフィルタオプションで検索条件範囲の1行目を空白にして、2行目に=A2=数式と書きだして抽出するとかね。
492 :
491 :2009/06/13(土) 16:24:49
俺のエスパー度はマグニチュード7くらいの自信があるから上で間違いないな。
/ ノノ ノノノ ヾヽ、ヽ / ノj ` ´ i | i { ` , ,-,、´ i | { i )-―-'( i | ヽ i ⌒ } |_,,,. -‐- 、 __)), ,ノ人 、_, ノ''"´ , \ / ` ー--,. '´ . : :`( ゝ、 / : : :: :´: . : :\ , ' ´_ ヽ / r´: : : : : : ,. ' ´ ヽ>'´ ,'ヽ! / γ: : ノ _ ,, 、,, ,,__i 。 ./ ; ,! i ir' " ヽ ,,, ''' ´ `"7 :/ i |、 ° }, ' ` y' / "'''‐‐- ...,,,_| ヽ、ー/ __ _/ / `'''-,,,て ´  ̄ ̄ / ,イ `''-、__/ / ` / ,! _, `''-,,_ ,..、_,,..イ´ i'´ `ゝ''"´ \_ ,,,,,...ゞ、_ |ー-/ ミ〉 !r'´ ヽ ミ/、 /| i i }
496 :
416 :2009/06/14(日) 13:08:25
Sub Macro1() Dim sssss As Range Set sssss = Range("a1:aa27") Do Loop Until sssss <> Range("a1:aa27") End Sub 上記のコード5行目で型が違うとエラーが出ます。どうすればよいでしょうか? doloopの中身はRange("a1:aa27")の内容の変更で、変更しなくなるまで続けるコードです
497 :
496 :2009/06/14(日) 13:09:11
416は別スレの名前が残ってしまいました、すいません
>>496 何がやりたいのか分らんな。
それにおめーどう見てもこのスレの
>>416 じゃないかw
嘘つくんじゃないよ。
ハンドルをコロコロ変えて指摘されると別人だと言い張るやつらと変わらんな。
>>498 スンマセン別に嘘ついたわけじゃないです
違うスレの名前と思ったらここのでした
分かりにくくすいません。
まとめると、
Range("a1:aa27") を一旦変数sssssに入れ、
Range("a1:aa27") の数字を変更した後
sssss <> Range("a1:aa27")
の真偽を確かめたいのです
変更しない場合もありますので、その場合loopから抜け出したいのです
>>499 > Range("a1:aa27") の数字を変更した後
> sssss <> Range("a1:aa27")
> の真偽を確かめたい
これで実現できる事が分からん。
手先のやり方でなくて、最終的な目的を書いた方がレスしやすいよ、あんたの場合。
数字を変更って二通りに解釈できるんだけど。 範囲を変えるのか(たとえばRange("A1:AA27")をRange("A1:AA999")に変える) セル内の数値を変えるのか。(Range("A1").Value=123みたいに)
>>500 ライフゲームを作ってるんです
常に変化する配列で、配列が変化しなくなったら終了しようと思いました
>>501 分かりにくいですね
Range("a1:aa27")のセル一つ一つのVALUEです。
もっと分からなくなってしまった・・・
説明下手で吸いませんでしたorz もう別セルを作業セルとして使います・・
ライフゲームならわかるぞ。 それならワークシートを3枚用意して 1枚目=初期状態 2枚目=次の世代 3枚目=1枚目と2枚目の差を計算する数式、空いてる列にシート全体の合計 みたいにして、その合計の部分が0になったかどうか調べるのが一番簡単かな。遅いけどね。 VBAだけで処理を完結させたかったら、 配列を一気に比較する方法はないので、ループを回すしかない。
>>505 神!!ありがとうございます
しかも自分が作ってるノより楽そうです
507 :
デフォルトの名無しさん :2009/06/14(日) 22:12:02
すみません質問です。 可変する最終行のセルに合計を求めたいのですが。 具体的には・・・ ・A1〜C3の数が埋まっている表がある (この表は可変し、範囲がA1〜C20の時もある) ・例として、A1〜C3の範囲だけの表の時は、A4・B4のセルを結合し、"合計"と表示、 C4にC1〜C3の合計の数値を返す数式。 範囲が可変するのでそれに対応するマクロを組みたいのですが どなたかご教授お願い致します。
>507 それだけならマクロ組む必要はありません。「Excel総合相談所 83」の レス番号80と86を参照してください。
>>507 Sub sample()
Dim LstR As Long
LstR = Range("C65536").End(xlUp).Row
With Range("C" & LstR + 1)
.Value = WorksheetFunction.Sum(Range("C1:" & "C" & LstR))
With .Offset(, -2).Resize(, 2)
.Merge
.Value = "合計"
End With
End With
End Sub
510 :
509 :2009/06/14(日) 22:55:21
C列最終行に数式そのものを入れたいならこっち Sub sample() Dim LstR As Integer LstR = Range("C65536").End(xlUp).Row With Range("C" & LstR + 1) .Formula = "=Sum($C$1:" & "C" & LstR & ")" With .Offset(, -2).Resize(, 2) .Merge .Value = "合計" End With End With End Sub
質問です。 chitest(実測値範囲, 期待値範囲)を使うときに、 実測値範囲, 期待値範囲を変数で指定したいのですが、 どうすればよいでしょうか
>>512 パラメータには配列を使うことができるから、
配列のサイズを、範囲指定用の変数を使ってReDimで変えてやればいいと思う。
(例)
Dim val() As Double
Dim expVal() As Double
ReDim val(3)
ReDim expVal(3)
val(0) = 1
val(1) = 2
val(2) = 3
val(3) = 4
expVal(0) = 2
expVal(1) = 4
expVal(2) = 6
expVal(3) = 8
P = WorksheetFunction.Chitest(val, expVal)
Debug.Print P
if not (cell is nothing) then v = cell.value else v = 0 end if ということがよくあるんだが、 これは三項演算子iffを使うのが一般的?それともifで場合分けするのが一般的?
それは好き々き。 それよりも「セルの内容が不定で、値が入っていたり空白だったりする」ようなシートの設計に 問題がないか考えてみた方がいい。 データの個数が不明ならxlUpとかUsedRangeとか使って処理の必要な範囲を決められるように できないか検討してみる。
VBAって三項演算子実装してるの?
VBAに参考演算子はないが、似たようなものにIIf関数がある。 ただこれを使うのはアフォということになってる。 もうめちゃくちゃ遅いからね。
アホはおまえ
うん、おれもアフォお前もアフォ
まぁ分ってる人はIIf関数は使わんわな。
定数を返す時は普通に使うな。Ifでダラダラ書くの鬱陶しいし。 予め真偽両方の戻り値が評価されてしまうことに注意しとけばOKじゃね? 大体、多少の無駄は、Excelのオブジェクトにアクセスするコストと比べると、 どうでも良いレベルになっちゃうんだよなあ。
IIFってググって見たけど、演算子とは全く性質違うのね。 と言うか、三項演算子とも解釈が全然違う、ただの関数か。 三項演算子じゃないなら、if重ねて書いた方が可読性上がるな。
IIFで速度気にする前にやる事あるだろうがw 一行でかけるのにIF文ずらずら書いてたらウザイわな。 可読性が悪い。
524 :
427 :2009/06/15(月) 22:46:20
おれはIf文のみのが読みやすいけど
つまり Function IIF(exp as boolean, trueValue as valiant, falseValue as valiant) if exp then IIF = trueValue else IIF = falseValue end function とほとんど同じって事か? なら、value = Iif(cell is nothing, 0 , cell.value)しても 結局cell(=noting)を参照することになるから例外発生するじゃないか 代入演算子と比較演算子が同じだから if (cell=Range.Find()) is nothing then〜 という簡略化も出来ないし VBAって難しいんですね
>>523 ifで連ねた方が圧倒的に可読性高い。
他の三項演算子が実装されてる言語でも、
可読性が下がるって理由で三項演算子は避けられる事が多いよ。
Ifなんてネスティングで分岐するのが当たり前な訳で、
無理やりIIFでネストしたら手に負えないだろう。
>可読性が下がるって理由で三項演算子は避けられる事が多いよ。 ソース(ry
If expr Then var = valueA Else var = valueB
var = IIf(expr, valueA, valueB)
こういう単純なパターンならOK、というのが俺基準。
計算式とか入って少しゴチャゴチャしそうなら普通にIfで書く。
>>525 難しいというか面倒。VBAの開発は終了しているから進化はありえないし。
なら.NET経由で、となると今度はプロセス間通信でやりとりのコストが跳ね上がる……
好きなほうつかえ
>>526 知らない奴の可読性が落ちるから、が正解。
常識で考えて Function IIF(exp as boolean, trueValue as valiant, falseValue as valiant) if exp then IIF = trueValue else IIF = falseValue end function でIIF使わねーだろ!例にも限度があるぞ! IFにIFをネストする場合は使わないんだよ。 しかも3項演算子とIIFは別物だから関係ない!
If expr Then var = valueA って一文で書く奴アホやで。 C言語でも可読性考えて必ず{}は省略せずに括って3行にすんだよ。 If expr Then exit sub とかならまだ許せるけどな。
533 :
525 :2009/06/16(火) 02:13:20
>>531 >>532 ひょっとして僕が叩かれてる?
>>532 掲示板にちょっと書くくらい良いじゃないか。
言いたかったのは、IIFが演算子ではなく、関数と同じ
しかも、自分で実装できる程度のものか?ということ。
無駄に一行にまとめるのが愚行だというのは同意しますよ。
#でも、無駄に空行を入れるのはどうかと思いますがw
#さらに言うなら、方言が出ていますよ。自覚しにくいから方言は怖いですね。
>>531 三項演算子とIIFが関係ないのは分かるが
それ以前の文で、何が言いたいのか分からない。
>>528 みたいな事例に限って1回だけなら許せるとしても、ループの中で使うやつはアホだな。
そんなに熱くならないで! たかだかVBAですよ? IIfはご自由に使いなさい!(職場の方針に応じて) ソースは見やすいように書きなさい!(VBAで他の人が修正するようなちっさい仕事ないけどね) 速度は大して気にするな!(VBAで出来るようなちっさい処理で)
/ / i ∧ : 、 ヽ /) ' ' ! / ',: . ヽ ! ///) .| i | / へ. {\ iヘ , | /,.=゙''"/ .!. | |'/ ´ ̄`ヽ ヽ 「∨ | / i f ,.r='"-‐'つl ハ| i′ - 、 ノ ', / | 細かいことは / / _,.-‐'~ 八 | |ィニヽ ,ニ 、∨ ' / ,i ,二ニ⊃ / | |´ ::::: , ⌒ヾ 八/ ,′ いいのよ! / ノ il゙フ / 人 | __ :::: / / ,イ「ト、 ,!,!| / ,..:':::::::::} |、 ( ノ / / / iトヾヽ_/ィ"/r.::::::::::::::::八 ヽ: 、 .イ/ ∧
>>533 ぜんぜん叩かれてはいないから安心して。
でもことさらIIfばっか使ってたら変なこだわりに見えるわな。 普通に書けばIfステートメントだからな。 よくいるよね。ある意味個性はあるけど人より劣った個性ってやつ。
どっちの関数が速いとか、あんまり気にしないなあ。 処理が遅くて困る時は、関数単位で考えるより データ構造とアルゴリズムを見直すべきだと思ってるし。
540 :
デフォルトの名無しさん :2009/06/16(火) 11:15:16
すみません。VBA初心者ですが、質問です。 B列に、顧客名が表示されていて、 "有限会社"・"株式会社"・""・""・"(有)"←全角 の文字列を削除し【株式会社 ○○工業】→【○○工業】 とだけ表示したいのですが、【○○工業】の文字列は左詰めで表示したいと思っております。 Ltrim関数の使い方がよくわかりません。どなたかご教授お願い致します。
>>540 表示ってどこに表示するの?
B列のデータを直接書き換えちゃっていいの?
>>540 とりあえず、B列のデータを直接書き換えてしまうプログラム
LTrim、RTrimは使ってないけど
Sub 形態削除()
Dim 顧客名 As String
Dim list() As String
Dim B As Range
Dim s As Variant
list = Split("有限会社,,(有),(有),株式会社,,(株),(株), , ", ",")
For Each B In Intersect(Range("B:B"), ActiveSheet.UsedRange)
顧客名 = B.Value
For Each s In list
顧客名 = Replace(顧客名, s, "")
Next
B.Value = 顧客名
Next
End Sub
Inc.とかCo.,Ltdは考慮しなくていいんかな
>>539 そんなこたー当たり前だわな。
その上でチューンするときはIIfは使わん。
使い捨てマクロなら使うこともあるけどね。
545 :
540 :2009/06/16(火) 14:17:52
皆様ありがとうございます。 >541 >表示ってどこに表示するの? すみません。複数あるシートの中で、 "顧客リストA"という名のシートと"顧客リストB"という名のシートの B列全てです。 542さんので試しましたが、変化しませんでした・・・ 申し訳ないです。
>>545 ほれ
Sub aaa()
Worksheets("顧客リストA").Activate
形態削除()
Worksheets("顧客リストB").Activate
形態削除()
End Sub
だめじゃん
549 :
540 :2009/06/16(火) 15:53:22
うわあああ! できました! ありがとうございます!
ワークシートのオブジェクト(Sheet1)でtxtという変数に文字列を代入して、 そのオブジェクトでユーザーフォームを表示してる フォームのコードに Sub UserForm1_Initialize() UserForm1.TextBox1.Value = txt End Sub って書いた しかしフォームのテキストボックスには何も表示されない なんで?
552 :
550 :2009/06/16(火) 18:41:36
ごめん言い忘れてた txt変数はモジュールレベルで宣言した
>>552 どのタイミングでtxtに文字列を代入したのか
554 :
550 :2009/06/16(火) 19:00:11
変数たくさん宣言 (このときモジュールレベルでtxt変数宣言) -------------------------------------- 他のプロシージャ色々 -------------------------------------- txtに文字列代入 -------------------------------------- UserForm1.Show ========ここからフォームのコード========= Sub UserForm_Initialize() UserForm1.TextBox1.Value = txt End Sub って感じなんだけど という感じ
>>550 根本的に間違ってるやん
自分のと↓のコードどこが違うか見比べろ
Private Sub UserForm_Initialize()
UserForm1.TextBox1.Value = txt
End Sub
>>554 この2カ所にMsgBox入れて、どっちが先に出るか試してみ
txtに文字列代入
UserForm1.TextBox1.Value = txt
Private ってのが要るんだね 初心者でごめん vba歴1ヶ月なもんで
いや、Privateは別に関係ない
いじくってみたら、フォームのコードまでtxtの値が渡ってないようだった 原因は分かったような気がするが、解決策が分からん
562 :
550 :2009/06/16(火) 19:14:06
>>562 リストから選べばPrivateも自動的に入るはず。わざわざ消した?
>>554 で(このときモジュールレベルでtxt変数宣言)って書いてあるから
>>564 で答えが出ているけどtxtをパブリック変数として宣言すれば解決じゃね?
漠然とした質問ですみません。 勉強しながらマクロを使ってます。 いろんなマクロを作成、使っていて、そんなたいしたマクロではないんですが 何回か走らせてると処理スピードががくんと落ちて終わらなくなることがあります。 (普段なら数秒で終わるループなど) そんな現象がおきるようになったのは自分がオブジェクト変数や配列変数を使うようになってからなので 使いかたが雑なのかと反省して、オブジェクトには使いおわったらNothingを代入、 配列はEraceしてやるなど勉強不足だった点を補ってやってもまだたまに発生します。 いちどExcelを終了するなどしてやればたいがい戻るので自分の知らない「基本」があるんだと思うんですが 原因が特定できずにおります。 このスレの先輩方でこういう経験あるかたがいれば何か思いついてもらえるかもと 書いてみました。 もしこんな質問で思いあたる点あればご教示いただければ幸いです。
>>567 オブジェクト型の変数はかなり初歩の段階から、それとは知らずに使ってるはずだから
(さもないと意味のある作業が殆ど出来ない)関係ないはず。
配列は、よほど大きい(要素の数が10000以上とか)物を使わない限り、関係ない。
個人的な経験では、Win32APIを続けて10000回ぐらいコールするプログラムを
何回か動かしたらGCで15秒ぐらい動作が固まったことがあった。
別に禁止してるわけでもないのに イベントが溜まって固まったように見えることもあるね。 要所にDoEventsをはさむと改善されることがある。
570 :
デフォルトの名無しさん :2009/06/17(水) 02:46:02
AVERAGE関数などを呼び出して連続処理をする際、 不正なセルを指定したり変な値になったりするとプログラムがエラーに なってとまりますが、プログラムがとまらないように、そういうエラーを 無視して#N/Aなどの値を返すようにするにはどうすればいいですか?
>>570 VBAの中では#N/Aを返すことはできないけどOn Errorを使えば
エラーを無視して続行することは可能。
補足。 エラーが発生した時、システム変数Errにエラーコードが自動的に入るようになってるから、 それを調べればいいと思う。
>オブジェクトには使いおわったらNothingを代入、 この必要性がよく分からない。 なんかの変数がそのインスタンスを参照してるとGCorが回収してくれないから Nothingを代入しろって事だと思うけど そもそも、ローカル変数の寿命って関数を出たときだから、Nothingを代入する必要ないんじゃない? 配列に関しても同じ。 実際には、適当なタイミングで一括でGCしてるとおもうけど。
574 :
570 :2009/06/17(水) 03:38:53
575 :
567 :2009/06/17(水) 07:57:49
皆様ありがとうございます参考にします。
>>568 APIがどうとか難しいことしたことないんで
私のは別の理由なんでしょうねえ。
>>569 今回相談のケースとは別に確かにそんなケースもあります。
適当なとこにDoEventsってはさんどけばいいんでしょうか。
まだ使ったことないです。
>>573 そう思ってたんでこれまで代入しっぱなしだったんです。
詳しい人のコードみるとだいたい初期化してるし
自分がたまに困ってるんだから自分が間違ってるんだろうと
最近使うようにしてみたんですがあまり変わりません。
>>575 CPUパワーが足りないとイベントが溜まる可能性が上がるかも。
メモリが足りないとGCの発生率が上がるかも。
どんなスヘ゜ックのマシン使ってる?
577 :
560 :2009/06/17(水) 20:54:28
お礼が遅くなってすいません 何とかできました ありがとうございました
Excel2003を使ってます。 マクロでマクロが書かれたファイル名自体を変えることってできますか? Name fileA As fileB だと、fileAがマクロの書かれたファイル自身でなければうまく動くのですが、 自分自身だとうまく動かないようです。 もしいい方法があれば教えてください。
>>578 SaveAsで保存してから前のファイルをDeleteする。
580 :
579 :2009/06/18(木) 06:26:51
FileSystemObject使わないなら、削除はKillで。
581 :
578 :2009/06/18(木) 12:48:21
os xp Excel 2003 フォームの後ろにBOOKを隠して、Excelを見えないように作成したものがあるのですが (ドラッグして動かしても位置が同期するので常に見えません) このファイルを社内の5台のマシンに移して動作確認をしたところ 一台のみエラーになってしまいます フォームは起動するのですが そこからなにかアクションを起こすとアプリケーションエラーになるのですが、解決できずに、途方に暮れています アドバイスお願いします 試みたのは、対象のマシンがsp2だったのでsp3にしたぐらいです
エラーの種類も具体的なプログラムソースも書かずに何がわかるというんだ… それよりも、何かのウィンドウを隠したい場合は位置を合わせるんじゃなくて そのウィンドウに対してVisible=Falseとやるのが普通。 ほかにも、座標を(10000,10000)にして画面の外に出してしまう手もある。
Application.WindowState = xlMinimized じゃ駄目なのかな
最小化だとタスクバークリックで大きくなっちゃうけどね
EXCELのバージョンは2003 画像のコピーでPicture形式と言うのはBitMapとは違うフォーマットと 言う認識で良いでしょうか? だとしたらShapeが保持している画像のフォーマットを識別するには どうしたら良いのでしょう?それらしきプロパティ等が見つかりません。 やりたい処理は画像フォーマットを識別して対応したコピー方法で Shapeをコピーして行くと言う動作です。
>>585 UserFormがShowされていればタスクバーをクリックできないのでいいと思った
>>586 無理やりBitmapでコピーするとか
Shape.CopyPicture xlScreen, xlBitmap
588 :
デフォルトの名無しさん :2009/06/19(金) 00:28:34
ユーザーフォームで、セルに日時&時刻を自動入力したいのですが Microsoft Date And Time Picker Control を使って 時間のデータを取得することは可能でしょうか? 神様!ご教示をお願い致します!
すみません。 OS=XP SP3 Office2003 です。
ここは人間しかいません
DTPickerの話はスレ違い たぶんできない
592 :
デフォルトの名無しさん :2009/06/19(金) 07:07:10
>>591 ありがとうございます。
ユーザーフォームでの時刻入力の他の方法や
関連部品のありか等、ご存知の神様は、
いらっしゃいませんでしょうか?
VBAの参考書を買いに行きましたが、
ユーザーフォームについて詳しく載っている
本は、なかなかないですね。
>>592 txtbox1.text = Format$(now,"hh:mm:ss")
594 :
デフォルトの名無しさん :2009/06/19(金) 10:56:06
>>593 ありがとうございます。
ヒントになりました。
これにスピンボタンをつけて任意の日時を
入力できるようにしたいと思っています。
できれば「日付と時刻のプロパティ」に似たフォームで
入力できるようになるのが理想なんですが。
がんばって (^_^)
596 :
デフォルトの名無しさん :2009/06/19(金) 18:03:48
質問です 行全体や列全体を指定して罫線を引くにはどうしたらいいですか? (セルのborderではなく)
>>596 こういうこと?
Sub sanple()
With Rows(10) '10行目全体の上下に罫線
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeBottom).LineStyle = xlContinuous
End With
With Columns(10) '10列目全体の左右に罫線
.Borders(xlEdgeRight).LineStyle = xlContinuous
.Borders(xlEdgeLeft).LineStyle = xlContinuous
End With
End Sub
このスレ見てていつも思うのは質問者に対し回答例を出しても反応が遅いな 回答もらっても礼すらしないケースもあるし
きも
あんきも
お礼なんざいらんよ。 中途半端にタメ口で表面面だけのお礼もらうなら、 無視された方がまし。
「いきもの」の おなか の なか には「きも」が はいって る んだね
603 :
596 :2009/06/19(金) 22:28:40
必要な情報があれば拾うし、なければ記憶に留めない。ただそれだけ。
>>598 そんなこたーよくあること。
それに質問者ばかりとは限らんね。
回答者で間違いを指摘されてもお礼言わないでむすっとしてる人もよくいるな。
お礼なんてどうでもいいから、結果報告をきちっとしてほしいね 一番嫌なのは「自己解決しました」って奴だな。 どうやって解決したのかぐらい書けばいいのにな。
607 :
デフォルトの名無しさん :2009/06/20(土) 01:14:08
こんばんははじめましてよろしくお願いします。 ある列にyyyy/mm/ddの形式で入ってるんですが、事情により日付と文字列が混在してます。 それを日付順に昇順で並び替えたいのですが、うまくいきません。 DataOption:=xlSortTextAsNumbers にしてもだめ 並び替えかける前にすべてを数値に変換したあと、並び替えてもだめ 日付に直してもG標準に直してもまったくだめ。 どうしたらいいのかわからず悩んでます。 ちなみに、元日付のやつが先に昇順に並び、そのあと元文字列のやつが昇順に並ぶ。 という感じです。 手動でやると、 数値に変換して昇順で並べ替え 何も変換せずに”数値に見えるものはすべて数値・・云々”のメッセージにチェックを入れる 両方うまくいくのに、VBAにしたとたんできなくなります。 何がだめなんでしょう・・・
日付データって変な癖がアルよね だから、文字列に変換することを考えたら 例:20090620
>>607 数値にに変換して駄目って、きちんと数値になってないんじゃないの?
区切り位置などでちゃんとシリアル値に変換してるのか?
シート上にファイル名を入力し、ファイルをフォルダの中から探し、あった場合は開く、 といった操作をしているんですが、見つかったファイルがどんなファイルであっても、 普段使ってるアプリケーションを使用して開く事は可能ですか? xlsならエクセル、txtならテキスト、bmpならペイントといった感じで、 shellでプログラムを指定することなく開けますか?
611 :
デフォルトの名無しさん :2009/06/20(土) 14:23:20
>>606 文字列に変換ですね。
でも、yyyy/mm/ddを20090101みたいに変換させるプログラムって難しそう・・・(初心者なもので)
>>607 数値に変換した時点で、すべて 38568 みたいなシリアル値になっています。
でもだめなんです。シリアル値でも元日付のやつが先に昇順に並び、
そのあと元文字列のやつが昇順に並ぶんです。
まず30000番台がならんで、その次40000番台がならび、そのあとまた30000番台が並ぶ
みたいになってます。
612 :
デフォルトの名無しさん :2009/06/20(土) 14:40:08
>>611 元のデータが文字列なら"/"を空白に置換する
シリアル値なら書式でyyyymmddと、区切りを入れずに並べる
RegExp.Excuteで得たオブジェクトを他のプロシージャに渡したいんだが どうすればいい? 何型?とりあえず ObjectとVariantはだめみたいなんだが
617 :
デフォルトの名無しさん :2009/06/20(土) 20:36:45
>>614 object型で何も問題ないけど。
ダメだったのは、何がダメだったのかな。
どこでどんなエラーが出たか書かないと分からないよ。
あと、タメ語はやめたほうがいい。
A A C D → C E D G E G というように抜けてるアルファベッドのセルを空白にして 並び替えしたいんですが、どのような命令文書けばできますか? OSはXPで、エクセルは2003もしくは2000です。
そういえば、Aには6?番と言う番号がついててそれで判断できると聞いた覚えがあるのですが・・・。
なんかここが2ちゃんねるだってことが分ってないやついるみたいね。 今までの数々の勘違い発言が分ったような気がする。
object型で何も問題ないですけど。 ダメだったのは、何がダメだったのですか? どこでどんなエラーが出たか書かないと分からないですよ。 あと、タメ語はやめたほうがいいですよ。
>>619 Asc("A")
で文字コードが分かる
s = "ABCDE.....XYZ"
instr(s, Range("A1").value)
で順を探してもよさそう
>619 これでいいと思うけど。環境は同じです。(excel2003) Sub 並べ替え() TATE = 1 For I = Asc("A") To Asc("A") + 25 If Asc(Cells(TATE, 1).Value) = I Then Else Rows(TATE).Insert End If TATE = TATE + 1 Next I End Sub
>>625 If Asc(Cells(TATE, 1).Value) = I Then
Else
Rows(TATE).Insert
End If
何この高度なつり餌
こういう行や列の挿入・削除は後ろからするもんだよな
>>628 挿入・削除は普通やらないな。
大体
>>625 は最後はエラーで止まるわな。
配列にためこんで吐き出した方がいいな。
630 :
625 :2009/06/21(日) 09:00:12
>629 自分で試したときはエラーにならなかった。 エラーになりますか? ループ件数は上限決まってるし。 アルファベットが昇順になってなければ変になるけど。
632 :
デフォルトの名無しさん :2009/06/21(日) 10:19:48
>>619 A A
C C
D D
E E
G G
B
F
こんなデータを用意して2列目でソートすればいい。
633 :
632 :2009/06/21(日) 10:21:22
ごめん。1列目でソート。
Sub test() Dim i, r, wr(1 To 26) For Each r In Range("A1:A26") wr(Asc(r.Value) - 64) = r Next r For i = 1 To 26 Cells(i, 1) = wr(i) Next i End Sub "a"だと97なのでエラーになるよww
wr(Asc(UCase(r.Value)) - 64) = r
>>630 空白セルでAsc(Empty)がエラーにならないか?
2007だとエラーで止まるんだが。
637 :
634 :2009/06/21(日) 12:44:03
For Each r In Range("A1:A26") ↓ For Each r In Range("A1:" & Range("A1").End(xlDown).Row)
速度を考慮しなくて良いならこんな感じじゃね? Const alfCount As Integer = 25 ' なぜかAsc("z") - Asc("a")をコンパイル時に評価してくれない Dim indexFlags(alfCount) As Boolean 'Asc("a") To Asc("z)じゃないのは '0から始まらない配列は扱いが面倒だから Dim data(alfCount) As Variant Dim i As Integer Dim outBaseCell As Range Dim indexCol As Range Dim currentCell As Range Set outBaseCell = Sheet1.Range("A1") Set indexCol = Sheet1.Range("A:A") 'Dim a(alfCount)はalfCount+1個の要素が用意されることに注意(alfCount番目の要素もあると言うこと) For i = 0 To alfCount Set currentCell = indexCol.Find(Chr(i + Asc("a")), LookAt:=xlWhole) indexFlags(i) = Not currentCell Is Nothing If indexFlags(i) Then data(i) = currentCell.Offset(0, 1).Value Next i For i = 0 To alfCount outBaseCell.Offset(i, 0).Value = Chr(i + Asc("a")) outBaseCell.Offset(i, 1).Value = data(i) Next i
こんなソース読みたくない
640 :
625 :2009/06/21(日) 15:43:22
>629、636 失礼しました。テストデータに Z を付け加えてたのでエラーにならなかった。
>>631 大文字のA〜Zのみなら
Sub foo()
Dim rng As Range
Dim v As Variant
Dim strBuf() As String
Dim temp As Variant
Set rng = Range("A1", Range("A" & Rows.Count).End(xlUp))
v = rng.Value
ReDim strBuf(Asc("A") To Asc("Z"), 0)
If Not IsArray(v) Then
v = Array(v)
End If
For Each temp In v
If temp Like "[A-Z]" Then
strBuf(Asc(temp), 0) = temp
End If
Next
With rng.Resize(UBound(strBuf, 1) - LBound(strBuf, 1) + 1)
.ClearContents
.Value = strBuf
End With
End Sub
>>638 「なぜかAsc("z") - Asc("a")をコンパイル時に評価してくれない」 なんて定数なんだから当たり前だよ。
("z") や ("a") が顔文字に見えてしまう漏れは重症
B列に =IF(ISERROR(MATCH(CHAR(ROW()+64),A:A,0)),"",CHAR(ROW()+64))
>>619 データの先頭が半角大文字のアルファベット限定
Sub a()
For r = 1 To 26
x = Cells(r, 1)
If x <> "" Then Cells(Asc(x) - 64, 2) = x
Next
End Sub
ドラッグしたファイルの情報を取得ってどうやりますか? [フォーム] ↑のフォームに、選択したファイルをマウスでドラッグして、パスと名前を取得したい
>>645 VBAだけでは無理。
まずは参照設定を開いて、その中に
Microsoft Visual Basic for Applications Extensibility
ってのがないか確認して。
>>645 フォームへのドロップはVBAではサポートされてない。
エクセルで開ける形式限定なら、フォームじゃなくてブックへドロップすれば
ファイル名が取得できる。(新たに開いたブックの名前を見ればいいだけ)
なるほど >464 家帰ったら確認してみます 取り敢えずリストビューを使ってファイルのゲットは出来るんですが テキストボックスにドロップして、何度か追加操作に対応させたいのです
649 :
648 :2009/06/22(月) 18:13:01
>646 バージョン 5.3をハケーン 現在ユーザーフォームにリストビューを追加して、次のコードを使いシートにドロップしたファイル名を書き出してます Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single) Dim myF() As Variant Dim myI As Long Dim myN As Long Dim obj As Object Set obj = CreateObject("scripting.filesystemobject") myI = 0 myN = 0 myI = Data.Files.Count ReDim myF(myI - 1) As Variant ' ↓の処理は,ボタン押してからすべきな気がするんだけども For myN = 1 To myI myF(myN - 1) = Data.Files(myN) Sheets("処理").Cells(myN + 2, 1) = obj.getparentfoldername(myF(myN - 1)) Sheets("処理").Cells(myN + 2, 2) = obj.getfilename(myF(myN - 1)) Sheets("処理").Cells(myN + 2, 3) = u.l.Caption Next Set obj = Nothing u.c.SetFocus End Sub
>>645 ラベルでもOKだが・・・Listの方が良いの?例えばCSV判定。
他にもfsoやAPIでファイルチェックすればよくね?
Private Sub Lbl_FileDD_OLEDragDrop(data As DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
Dim filePath As String
filePath = data.Files.item(1)
'エラーチェック
If (0 >= InStr(UCase$(filePath), "CSV")) Then
Me.Lbl_FileDD = ""
Else
Me.Lbl_FileDD = filePath
End If
End Sub
他にもdirを用いて、指定フォルダのファイル一覧を取得可能 Dim folderPath As String Dim filePath As String filePath = Dir$(folderPath, vbNormal) Do While filePath <> "" 「セル」 = filePath filePath = Dir$ '次のファイルパス取得 Loop
長々とスマソ。フォルダとファイルの判定はfsoを用いて、 Set hFso = New FileSystemObject If hFso.FileExists(inPath) Then 'ファイルの処理 〜 If hFso.FolderExists(inPath) Then ' フォルダの処理 〜 Set hFso = Nothing それよりも、ファイル or フォルダダイアログで選択させるか・・・
しかし変数のつけかたどうにかならんかなぁ。
フォルダ内のファイルフォルダを取得する場合、どうせFSO使うならDir関数と組み合わせてFileExistsやFolderExistsで 処理分けするのではなく、最初から.Filesや.SubFoldersでファイルのみ、フォルダのみを取得した方がいい あと、Dir関数やGetAttr関数でもファイルかフォルダかの判定は出来る 場合によってはFileExists等の方が都合がよいこともあるが、この件ではわざわざ外部のFileSystemObjectを 使わずとも、組込関数のそれらで十分 しかも、Dir関数の第二引数にvbNormalのみ指定なら、フォルダは取得されないのに処理分けする必要自体が無い ついでに言うとDir関数で取得されるのはfilePathではなくfileNameな 変数名をどう付けようと動作に問題は無いが、勘違いを引き起こしかねない(読解性が悪い)ので注意な 長々とスマソ
うむ。 朝っぱらからご苦労。
いえいえ
With Worksheets(シート名) Range(”X1").Formula = Application.WorksheetFunction.統計関数(range(データレンジ)) End With これだと、統計関数のプロパティが取得できねぇとか言いやがってダメなのな。 結局Worksheets(シート名).activateしろってことか?
>>657 統計関数のプロパティが取得できねぇってのは、その統計関数が.WorksheetFunctionでは使えないやつなんだろ?
それに仮に使えたとしてもFormulaじゃなくてValueだわな。
動くからそれでいいってわけにはいかん。
>>650 ラベルの上にドロップするプロジェクトでいいんだよね
やってみたけど動かない……
エクセル2000なんだけどもが
だから、VBAではラベルやテキストボックスにはドラッグ&ドロップできないんだってば。 不可能ではないけど、そんなに簡単じゃない。 で、手っ取り早くやるには、まずVBAウィンドウのツールメニューのその他のコントロールを開く。 その中に利用可能なコントロールってのがずらっと並んでるから、その中から ドラッグ&ドロップ可能なコントロールを選んで追加する。 定番はリストビュー。「Microsoft ListView Control, version 6.0」ってやつ。バージョンは問わない。 こいつにチェックを入れてやると、ツールボックスにListViewってのが追加される。 フォームにリストビューを貼り付けたらリストビューのプロパティを1カ所変更する。 OLEDropMode を 1 - ccOLEDropManual にする。これで準備完了。 サンプル。実行してリストビューにファイルをドロップしてみ。 Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single) Filename = Data.Files.Item(1) '1番目のファイル名を取り出す MsgBox ("ドロップされたファイル名は" + vbCrLf + Filename + vbCrLf + "です。") End Sub
それVB6の開発ライセンスが必要だろ
基本的にリストビューを使ってドラッグドロップすると ただ、リストビュー以外にもドロップさせられるコントロールがあって、ラベル形式にも対応してい るかどうかは置いとくか ファイル取得したら、テキストボックスコントロール追加とかイベント処理でリストビュー再表示とかすればいいだけだな、把握した
開発じゃなくて頒布ライセンスな
個人使用なら無問題
>>663 どうしてもドラッグドロップできるラベルが欲しいなら、
リストビューのサイズを1行1列に固定してラベルに見せかければいい
無理にVBAでやらずにフリーのVB使えよ めんどくさいことしなくても普通にドラッグ&ドロップに対応してるぞ ワークシートが使いたいんならVBからExcelオブジェクトを使えばいい
頒布じゃなくて開発ライセンスな
細かいことを言えばMSの言語製品は開発「者」ライセンス だからパソコンが何台あっても1ライセンスでインスコできる 「開発ライセンス」のが検索のヒット数が多いけどな で、無料のVS2008EEでもライセンス条件は大差なかったような
一回買えばずっと使えると言うことなのか……知らなかった
ライセンスキーのインストールが必要 KB318597
3行で
>>671 難しいことはそこで聞けばいいじゃん
2chになにを求めているんだい
質問です。 マクロでユーザー設定リストを追加&ソートを行う為に下記を実行しました。 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 しかしソートした結果は あ、い、う、え、お」は降順、その後ろに「あ、い、う、え、お」以外は昇順 となってしまいます。 どのようにすれば「あ、い、う、え、お」を昇順でソートし、その後ろに 「あ、い、う、え、お」以外を昇順にソートできるのでしょうか。 よろしくお願いします。
list_numを使わずに普通にソートしたらいいんとちゃう?
質問です A@ABCD B○○○○○ C○○○○○ D○○○○○ E○○○●○ F○○○○○ こう言う表を作製して、たとえば「C、E」と入力したら●がある場所の文字が 指定した所に出るようにしたいのですが、どうしたらいいのでしょうか?
Aの@を基準して、オフセット使えばいいか 英語はアスキーか何かで数字データに置き換え セット 変数 = A@のレンジ.オフセット(英,数) 出力先 = 変数 変数と処理先を配列にすれば多元処理出来る 詳しいコードは誰かが書く
>>675 ワークシートのこの位置にデータが入っていたとすると
.A.B C D .E .F
1 A@ABCD
2 B○○○○○
3 C○○○○○
4 D○○○○○
5 E○○○●○
6 F○○○○○
=INDEX(A1:F6,MATCH("E",A1:A6),MATCH("C",A1:F1))
>>673 降順てのがわからんね
ARRAY(”あ”,〜”お”,”*”)
にすれば、取り敢えず
あ い う え お 1 5 か き く
とかなるんじゃ
リストにランダムな文字設定してどう並び変わる
>673 SortMethod:=xlPinYin は必要ですか? やりたいことっていうのが 「1バイト文字や2バイト文字の英数字よりもひらがなの あ〜お を優先したい」 ってことなのかな?
>>664 頒布(再頒布)ライセンスは、自作のアプリにMS作のランタイムを同梱する場合に必要な物
これが無い場合、「ランタイムは別な場所から落として導入してください」ってことになる
VBやVSの下位エディションはこれが無く、上位エディションには頒布ライセンスが付いてくる
OfficeVBAからVBランタイムを使用する場合に必要なのは開発ライセンス(VB6等の使用ライセンス)
個人利用なら頒布ライセンスは関係ないので下位エディションでも問題ない
VBランタイムは「VBで作成されたアプリから使う」場合に限り無償で使える物なので、
VB開発環境のライセンス無しにランタイムだけ入れてVBAから使うのは個人利用でも不正行為
タダなんだしVSEE入れとけ
暇だし未解決の質問あったら考えてみる
>>682 それ、何の意味があるの?
VSEE(.NET以降)には、VB6以前用のActiveX系ランタイムの
自由使用権利は含まれないんだけど
無料のVB5CCEも然り
とにかくVBランタイムをVBAで使う権利は、無料では手に入らない
とりあえず潔癖くんには内緒で使え いろいろうるさいから
>>683 今まさに、ライセンスについて未解決
主張はあるが根拠が示されてない
事実ならmsdnのどっかに書いてあるはず
検索してリンクを貼ってくれ
FUDじゃないの?
何見当違いなリンクはってるんだろう?
Excelのバージョンの違いの影響で VBAでセルの書式を設定する時にエラーになるとしたら どんなエラーが考えられますか?
95と2007を比べて?
>>692 いえ、2003用に書いたマクロを2000で実行する場合です。
>>693 マシンが変わると使えるフォントが変わる
ネットワーク上のフォルダを指定して、 FileSearchを使うとパス名がバグるんですが、何故でしょう? \\168.192.10.1\フォルダ1\…の、 フォルダ1の部分が文字化けしてしまいます。 理由と回避方法をご教授願います。
ネット上のしかも2バイト文字ということはUTFなんとかのことかな?
>>696 なんの事でしょう・・・?
後ろの…の部分は普通にただのフォルダなんですが、
フォルダ1ってのはネットワーク上に更に名前の付けられた部分です。
マイコンでネットワークドライブの割り当てをすると、「168.192.10.1のフォルダ1」となる部分なんですが。。。
FileSystemObject、文字化け でググってみると同様の質問がいろんなところでされてます。 今検索中。
フォルダ名を半角英数字にすればいいでないの
listview張り付けて使えるならライセンス持ってるってことだし エラーになれば持ってないってこったな
>>695 フォルダ名をUTF-7にすればいいんでないの
>>702 ホントかどうかは知らんが、
別のアプリの一部だから勝手に横から使っちゃダメなんだとさ
%81%40 みたいな形式にエンコードする
A | B | C | D | E | F 1 品名|店舗|数量| 貸出日 |返却予定日 |2009/6/10 ----------------------------------------- 2 QQQ|三重| 1 |2009/3/25 |2009/6/8 3 CCC|富山| 1 |2009/5/18 |2009/6/8 4 | | | | 5 DDD|愛知| 1 |2009/5/18 |2009/7/1 * 4行目は返却済でブランクになっています。 こんな感じの表から、F1(調査日)の時点で返却予定日を過ぎているものを 同じシートの501行目以降に抽出したいです。 並びはそのまま、空白行を詰めて該当するデータを抜き出すにはどう書けば良いですか? Excel2000/2003です。 宜しくお願いします。
>>706 これでいいの?
Sub a()
予定日 = Range("F1")
Set コピー先 = Range("A501")
For r = 2 To 500
If Cells(r, 5) < 予定日 Then
Cells(r, 1).Resize(1, 5).Copy Destination:=コピー先
Set コピー先 = コピー先.Offset(1, 0)
End If
Next
End Sub
こういうのはVBAでやるんじゃなくて、F列に期限を過ぎたかどうか調べる式を入れて
オートフィルタで取り出すのがExcel本来の使い方なんだけどね。
>>704 ぼけ、そのためのライセンスキーだろが
不正にライセンスキーを操作してなければ、
使える=ライセンスを持ってるってことだろが
あれか ソフトにはいってるけど、課金しないと解除できないコスプレゲームみたいな だから解除したもんを配布するなという箱的な何かなのか
710 :
648 :2009/06/25(木) 02:10:50
なんか 使いやすくてすっごいソフトで安いエクセルがあるっていうから調べたんだけど エクセルソフトピュアっていう トイレットペーパーだった
何で名前抜いてないんだよ!!!
>>707 最初のリストが個人管理のエクセルファイルの一部を取り出しているものなので
この方法のほうが助かります。
ありがとうございます。
713 :
695 :2009/06/25(木) 08:52:39
ありがとうございます。 ネット上のフォルダなので、自分が名前を変える事はできません。 その2バイト文字をうまく戻す方法とかありますか? .SubFolderを使って下の階層のフォルダを走査してますが、 ルート+見たフォルダで値を返せばいいのかと思うんですが、 方法が思い当たらず、、、
ネットワークドライブで「フォルダ1」が化けるって、 うちじゃ再現しないお 鯖がWindowsだと大丈夫なのかなあ
MSが勝手に決めたルールについて聞いてるんだから、 「常識だろ」ではなんの説明にもなっていない。 明文化されたソースがないのであれば、 そりゃ単なるFUDじゃないかと疑いたくもなる。
そーすか?
>>717 少なくとも
>>685 では、VistaでVBAからVB6のコンポーネントを使う場合に何か制限があるとは
書かれていない。
VistaでもXPでもどちらでも良いので、使ってはいけないことが書かれているソースplz
http://support.microsoft.com/kb/409857/ja 不明な項目については、コントロールの使用許諾契約書をご覧ください。
"All Rights Reserved" は、契約書に明記されている項目についてのみ権利があるということを意味するものです。
使用許諾契約書で許可されていない (または許可されているかどうかが不明な) 行為は、ライセンス違反と見なします。
注意 : Visual C++ および Visual Basic に付属する ActiveX コントロールもライセンスされています。
これらを HTML ページで使用する場合にも上記の手順に従ってください。
だってさ。使用許諾契約書で許可されてんのか?ぼけ
おれっちのC:\Windows\System32\には MSCOMCTL.SRG があるからライセンス持ってるってことだな
>>722 そのすぐ下に、「ここに書いてある内容は正しいとは限らないよ」(意訳)
って書いてあるんだよなあ。
どうしよう?
「俺は嘘しか言わない」
この資料は以下の製品について記述したものです。 Microsoft ActiveX SDK それ以外のルートで入手したOCXはどうなんだろう
>>722 なんで回りくどいKBしか貼れないかなー。
今問題になってるのは、VBAでmscomctl.ocxを使用するときに、VB6の開発者ライセンスが
必要かどうかなんだけど。
早く、それをしてはいけないというソース貼れよ
MSに聞けよばか
>>681 は思い込みでした、ごめんなさい
ってことでFA
ぶっちゃけどっちでもいいけど、
>>681 が気にくわないw
Vistaでは、デフォルトでmscomctl.ocxが入ってるそうだし、使おうとするときにライセンスが必要だって言う 警告が出なければ、使っていいんじゃないの? XPでは知らんけど。
>>729 ついでにKBに追加するよう言っとけよ。ほかにもばかがいそうだ
警告出なけりゃ使っていいとか どんだけ俺様ルールなんだよw
なんで荒れてるように見せかけて待ったり雑談してやがんだよksg 質問スレなんだから誰かの常識とか言う回等が意味を成すと思ってんの課ksg
>>734 不正にライセンスキーを操作しない限り、ライセンスキーで守られているってことだろぼけ
ksg=かすが=春日=ハルヒ 京アニ儲の暗号ですね
そこは大阪だろ ちゃうねん
まだやってんの?
商用で使用する場合や、無制限配布する必要が出てきたら、MSに聞けばいいじゃん。
総好かん
744 :
デフォルトの名無しさん :2009/06/26(金) 23:56:45
A1〜A4500にすべてデータが入力されていて、B列は空白の場合 B1〜B4500を選択するにはどうするべき? つまりA1〜データのある一番の行までを選択して、それをそのままを右に1列ずらす形なんですが
>>744 Range("A1:A4500").Offset(, 1).Select
たぶん最後のセルを選択させたいんじゃね
Range("B1:B" & Range("A1").End(xlDown).Row).Select
748 :
デフォルトの名無しさん :2009/06/27(土) 17:03:44
イベントプロシージャを作成中のエラーなんですが、 Worksheets_Change でTarget.valueによって条件分岐したいのですが、 Targetがセル範囲で、さらにChangeの内容がClearContentsの場合、 「型が一致しません」(Selectの選択肢と)というエラーが出ます。 おそらく、ClearContentsによって更新された(消された)後の セルのデータ型が問題なんですが、 @このときのデータ型は何?(ちなみに書式設定は「標準」です) ANullでも""でもダメなので、どういう選択肢を設ければ良いのか? 以上、分かる方、お願いします。 Excel2003使用です。
とりあえずVariant型にSetしてみるというのは? それでブレークポイントかけて中身確認とか。
750 :
デフォルトの名無しさん :2009/06/27(土) 17:23:28
Target.ValueをVariantにするということですね? そうすると、もしTargetがセル範囲だと、配列になってしまって 条件分岐は難しくなりますね。 セル範囲をClearContentsする場合って、内部的には ひとつずつ処理するんですかね? それだと、複数のデータ型が混じっちゃうこともありえますが。 一応、条件分岐の最初で、If IsNumeric(Target.Value)でひっかけては いるんですが。 Targetがセル範囲か単独セルか(If Target.Columns = 1 の構文はダメ でした)判定する方法はありますか?
関数の中で例外が発生した場合の処理ってどうやって書くの? たぶん、参考書かなんかで推奨しているのはVBAの例外棋王を使うことだと思うけど なんか、頼り泣くね?というかON ERRER割り込みとか使いにくくね? 例外が発生したときの戻り値をEmptyにして返して 呼び出し元でIsEmptyでチェックしてたら、IsEmpty(Empty) = Falseになるので使い物にならない。 たぶん、戻り値の型のIntegerやStringがEmptyを許容出来ない、Empty値として格納できない型だからIsEmptyが常に技になるんだと思う (だったら、代入するときにエラー出せよ) 一応現在は、integerなら-1、stringなら""を返して、エラーチェックしてるが どうすれば良いんだ?
>>750 IsEmpty(Target)で空かどうか調べる。
Target.Cells.Countでターゲットが1つのセルかセル範囲か分岐する。
面倒だけど1つずつチェックしていくしかない。
>>751 関数の戻り値はエラーかどうかの結果にして
処理したい変数はByValで渡す
>>750 Sub test()
a = Range("A3:B5")
MsgBox UBound(a, 1)
MsgBox UBound(a, 2)
End Sub
初心者質問でなんですが textboxに数値データ以外打ち込めないようにするには どう入力すればいいんでしょうか?それともプロパティで可? OSはvistaでExcel2007です
>>755 プロパティで出来るかどうかぐらい、リファレンス見れば分かるだろ
オーソドックスなのはOnKeyPressなりで入力させたい文字だけスルーして、入力させたくない文字をKey = 0 というように書き換えればおk
各シートに製品のデータを格納して 各評価方法で、任意の製品の評価値を求めたい この場合、評価値を算出するコードはシートに書いた方が良い? それとも、シートのほかに標準モジュールを作って、それに書いた方が良い? シートにコードを直接添付させると、データとその処理方法の関連性を持たせやすい。 また、Worksheet名を省略できるので、多少スマートにかける。という2つのメリットがあると思われるが どうやらシートに直接コードを書くと、デバッグ時にエラーの発生したコードを特定しにくい(デバッガが特定してくれない)ということもあるようで コードは標準モジュールに書かないとイケナイのかな〜と悩んでます
758 :
757 :2009/06/29(月) 06:29:56
やりたい処理内容が分かりにくかったので具体的に説明します。 シートAには製品の人気が、シートBには製品の体積が載っています。 各シートには独自の評価用の関数があります(形は以下のよう) Function SheetA.GetValue(pid as integer) as double (Bも同様) この関数の内部では、シートの情報(人気など)に基づいてシート独自の計算式により評価値が算出されます。 最終的に、評価値の平均をとるなり、合計をとるなりで総合評価を求めます。 --- 目的はここまで 各シートごとに評価するための方法が違うので、別々にコードを書く必要があり そのコードをどこに書くかで悩んでます。 シート上に書くメリット: コードを参照しやすい、コードがシンプルになる デメリットト: デバッグがしにくい(?) それと、もう一つ質問なんですが クラスモジュールを使ったところで、クラスの派生が出来ないので、 抽象クラスなりインターフェースなりを作っておき。 それに基づいて、各サブクラスを実装する…ということは出来ませんよね? (正直、クラスモジュールの使い道が分からない。構造体+関数?)
好きなほう 俺個人ならば、シートに記述出来るならそうする 出力先が今後不透明になるならコードで出力する
760 :
757 :2009/06/29(月) 08:16:06
画像全部消えてるし
今携帯だから見れない 部品化したモジュールをシートから呼び出す処理をしたらどうか? 引数でも関数でもいいし、怪しげな部分を丸投げしてもいい
良く読むのめんどくさいので勘で。 シートにはコードはなるべく入れない。なぜなら、同じ機能を持ったシートをコピーor追加したときに困るから。 >クラスモジュールを使ったところで、クラスの派生が出来ないので、 >抽象クラスなりインターフェースなりを作っておき。 >それに基づいて、各サブクラスを実装する…ということは出来ませんよね? できる。vba implementsでググれ。 実装の継承は出来ない。 あと、良くわからんけど、raiseとかwith eventsとか調べとけ
witheventsダナ
>デメリット: デバッグがしにくい ひとつの案だけど、デバッグの必要なときはデバッグしやすい形にして、 実行時は実行しやすい形にする、ってどうよ 個人的に、シートにはなるべく書かないようにするけどね
>>766 計算式関数が専用モジュールにまとまっていれば、
それはそれでデバッグしやすいと思うんだけどなぁ?
シートにコードがあると第三者にコピペされた時超面倒
768 :
757 :2009/06/29(月) 19:21:56
>>764 >シートにはコードはなるべく入れない。なぜなら、同じ機能を持ったシートをコピーor追加したときに困るから。
むしろ、同じコードごとコピーされるので都合が良いのでは?
作成するシートが6,10程度であれば
コピー先の変更をコピー元にフィードバックさせたいときには手動でコピペしても良いですし
コピペできないほどの数のシートをExcelで扱うのは厳しそうですしね。
クラスモジュール化して、インスタンスごとにシートを割り当てることを考えても
処理を少し変えたいだけで別のクラスとしてコピペする必要があります。
>implements
なるほど、抽象関数とその実装はVBAでも出来るんですね。
実装済みの関数の処理の追記は出来ないと…
むしろ、すべての関数を上書きする必要があるんですか…
一度、クラスモジュールでくめるか考えてみます。
(Dim/Setの行がまた増えそうです orz
何で宣言と同時に代入が出来ないんだ…
そもそも、LetもSetも出来る型なんて無いんだから、使い分けなくて良いだろうに)
しかし、自分のメンバの関数を呼び出すときに
いちいちAbstractClass_Methodとするのもかっこわるいようなw
>raise
エラーメッセージも送ることが出来るんですね。
定義済みのエラー番号しか送れないかと思ってました。
が、On Errorで受け取る気にはなれないので、自発的に例外を発生させることはないと思います。
769 :
757 :2009/06/29(月) 19:22:57
>raise
エラーメッセージも送ることが出来るんですね。
定義済みのエラー番号しか送れないかと思ってました。
が、On Errorで受け取る気にはなれないので、自発的に例外を発生させることはないと思います。
>WithEvents
なるほど、そういうことも出来るんですか。覚えておきます。
しかし、今回の目的には利用できなさそうです。
>>766 それも考えたんですが、実用的ではありませんでした。
たとえばSheet1にRange("A:A")と書くと、Sheet1.Range("A:A")ですが
Module1にRange("A:A")とかくと、それはActiveSheet.Range("A:A")になります。
なので、thisWorksheet.Range("A:A")のようにオブジェクトを明記する必要がありますが
シートにしろモジュールにしろ、thisWorksheetに代入・初期化するタイミングがないんですよ。
クラスモジュールなら、_Initialize時に代入できますが
シートに転記する際には代入できなくなりますね。
それに、例外の発生するときだけ別の場所に写すなんて出来ませんし
それなら、完全にクラスモジュールとして書くか、地道にトレースした方が楽そうですしね。
また、VBAでクラスを扱う際に出た疑問ですが
各クラスモジュールの親クラスはClassModuleに成るんでしょうか?
プロパティドックにはClassModuleとありますが
オブジェクトブラウザでは検索に引っかからないんですよ。
770 :
757 :2009/06/29(月) 19:49:15
また、静的関数の呼び出しはどうすればいいインでしょうか?
静的関数の宣言はエラーになってませんが、(Public Static Function test() as integer)
呼び出す際に、静的関数として呼び出すことが出来ません。エラーになります
Dim c as Class1
Debug.Print Class1.test 'コンパイル時 エラーになる
Debug.Print c.test '実行時エラーになる
Set c = new Class1
Debug.Print c.test '実行される
class::methodのような特殊な呼び出し方かと思い、検索してみましたが
そもそも、静的メソッドに関するページが見つからない。
できるだけ短くまとめたつもりですが、長くなってしまいました
長文失礼します
>>766 モジュールに書いた方がエラーの特定がしやすいため、
デバッグはしやすくなると思います。
また、第三者の手に渡ったときには、私は絶対に手を出さないので
その点は(・ε・)キニシナイ!! つもりです。
結局、シートに書きたいことは、シートのデータへのインターフェースを書きたいだけだから
そのコードはソノシート内で完結していて、シートをコピーする事による副作用は無いと考えて良いと思います。
実装の継承はできないって書いてるだろうが。よく読め。そして調べろ。 >しかし、今回の目的には利用できなさそうです。 初心者のくせに簡単に判断してんじゃねーよ。 つーか、もっと調べてから質問しろ。 頓珍漢すぎて答える気にならんわ。
メンバ変数にシートを持たせるとか、関数の引数にシートを渡すとか、いろいろあるだろ。
>>757 評価クラス&strategy pattern
エラートラップのオプション変えろ馬鹿
>>757 はプログラマじゃないみたいだから、そうつらくあたるなよ。
コピペでいいじゃない。
マクロの記録だとSelectionがよくでてきますが selectとどう違うのでしょうか?
selectしたものがselection
>>771 >実装の継承はできないって書いてるだろうが。よく読め。そして調べろ。
ええ、それは理解しているつもりです。
実装済み〜上書きする の節は不要でしたね。
実装の継承がされないのですから、元クラスの実装部の有無に関わらず
実装クラス(implements〜がかかれているクラスモジュール) で実装しなければならないのは当然のことです。
>初心者のくせに簡単に判断してんじゃねーよ。
Worksheetで発生したイベント(*1)を処理したいとは考えていません。
ですのでWithEventsは要となるようなキーワードではないと思います。
抽象クラス・インターフェースがつかえることが分かったので
最低限必要な機能を洗い出して、抽象クラスとしてまとめるつもりです。
その際にイベントを定義することはあるかもしれません。
*1: Worksheets.SelectionChange など
>>772 >メンバ変数にシートを持たせる
そのメンバ変数に代入するタイミングがない。
(毎回、空かどうか調べて、Setするのもありかもしれませんが・・・)
>引数に
それをするくらいなら、ほかの方法(クラスモジュール化するとか)をとった方がスマートです。
>>774 変えましたよ。シート内で発生したエラーも捕捉できるようになりましたよ。
すでにシートにコードを書く気は失せてましたけど、
>>778 切れてたので追加
>>774 変えましたよ。シート内で発生したエラーも捕捉できるようになりましたよ。
すでにシートにコードを書く気は失せてましたけど、
一瞬、「やっぱりシートにコードかいても良いかな」とか考えましたよ。
どうせ書きたいコードはインスタンス化する必要のない
静的なものですから、クラスを使うメリット無いなとか
シートにImplements IClass とかつければ、IClassとして扱えるようになって
すべて問題は解決したんじゃないかとか考えてしまいました.
クラスって使ったことないけどいつ使えばいいの? メリットはなんぞ?
>>780 VBA使ってれば、知らないうちにクラスのお世話になってる
>>778 > >初心者のくせに簡単に判断してんじゃねーよ。
> Worksheetで発生したイベント(*1)を処理したいとは考えていません。
> ですのでWithEventsは要となるようなキーワードではないと思います。
classにイベントを定義して、withevents付きでインスタンス化すれば、クラスのイベントを一括して
ハンドリングできたりする。
それと、インスタンス化する関数の引数にシートを渡せばいいじゃん。いやなの?
そのシートでしか使わなくて、拡張性や再利用なんかを考えなくていいみたいだから、 そのままシートにコードを書くのが一番簡単だろ。 悩むことなんか無いのに。
どこでエラーが起こったかわからない問題は解決したんでしょ? ならば、そのままシートにマクロ書けばいいと思うけど、なんか問題あるの?
質問します ユーザーフォームにリストボックスとコマンドボタン(とラベル)を1つずつ作りました リストボックスには他のシートの名前が入っています Private Sub UserForm_Initialize() Start_Sheet_1.ListBox1.AddItem "Sheet1" Start_Sheet_1.ListBox1.AddItem "Sheet2" ここまでは記述したのですが、コマンドボタンを押したとき 選択したシートに移動するコードはどうすればいいのでしょうか 初心者の質問ですみません お答えお願いします
if listbox1.listindex >= 0 then worksheets(listbox1.list(listbox1.listindex)).select end if
787 :
785 :2009/06/30(火) 16:13:27
質問しておきながらすみませんが、 リストボックスよりコンボボックスのほうが使いやすそうでコードもできました すいませんでした
なんとすがすがしい質問者なのだろう。
789 :
デフォルトの名無しさん :2009/06/30(火) 17:54:53
環境WinXP Pro SP3、Excel2003SP3 ピボットテーブルの区切り文字が時々勝手に変わる(ように見える) のですが、何が原因でしょうか… 月次で帳票を作成していて、5月分は データーフィールドが 合計 : Salary と表示され 6月分は 合計 / Salary と、コロンがスラッシュに勝手に変わっているのです な… 何を言ってるのか わからねーと思うが おれも何をされたのかわからなかった… という気分です
スレ違い
おいぃ…… スレチなら誘導くらいしてやろうぜ……?
792 :
デフォルトの名無しさん :2009/06/30(火) 21:41:32
VBAで何かしら取得したデータを 保存していないtxtファイルを新規で立ち上げて そこに出力したいのですが いまいちわからないのですが教えてください 保存しているファイルを立ち上げてとかならググったりして見つかるのですが
>>792 それはVBScriptやVB6でも出来ることで
VBAの分野の話ではないからスレ違い(
>>4 参照)
待ってれば半端な知識をひけらかしたい奴が
答えてくれるかも知れないがなw
>VBAで何かしら取得したデータを と言ってるんだからVBAだろ >VBAで何かしら取得したデータを VBScriptやVB6に渡せないことはないが
with range("A1:F8") .clearcontents .unmarge .marge end with range("A1").borders(xldaigup).linestyle = xlconteinue このコードだとエラーでるんですがどこが駄目なんでしょうか? 上のコードでやろうとしてることは A1からF8までの文字列を消してから A1からF8内の部分的に結合されている所を解除して 次にA1からF8までをすべて結合してひとつのセルにしてから 罫線を引いてみてます。 ちなみにコードのスペルミスはご容赦ください。 いま手元にエクセルがないので 記憶で打っているので細かいスペルがわからんのです。
もともとはマクロの記録からやってて いじくりながら勉強してるとこなんです。
>795 試してはいないけど、罫線引くときのセルの指定は.margecellsを加えて 「a1セルを含むセル範囲」っていう感じにしなきゃいけなかったような。 ちょっと今から試してみる。
799 :
798 :2009/06/30(火) 22:36:12
>795 肝心の綴りから違ってますよ。 ×unmarge ○unmerge ×marge ○merge
800 :
798 :2009/06/30(火) 22:40:15
>795 xlconteinueも綴り間違いみたい。F1キー押しても「キーワードが見つかりません」て出る。
801 :
798 :2009/06/30(火) 22:51:57
これでちゃんとうごきましたよ。(斜め線でいいんですよね?) Sub テスト2() With Range("A1:F8") .ClearContents .UnMerge ←訂正済み .Merge ←訂正済み End With Range("A1").Borders(xlDiagonalUp).LineStyle = xlContinuous ←2カ所訂正済み End Sub ×xldaigup ○xlDiagonalUp ×xlconteinue ○xlContinuous 少なくとも、マクロの記録をしてたら間違うはずないんだけど。
> >VBAで何かしら取得したデータを > と言ってるんだからVBAだろ 最初にVBAでデータ取りしたら その後のExcelに係わらない処理まで全て VBAの範疇になるなんてことは無い
スレ違いだと思うならスルーすればいい そうでないと思う奴が答えればいい 中途半端だろ
>>802 VBS、VB6にデータを渡して処理するのが正解?
開いたテキストファイルのレコード操作ってどーやんの?
>>792 >保存していないtxtファイルを新規で立ち上げて
これってメモ帳とかを起動してそこに書き込みたいってこと?
だったら確かにスレ違いだ
やり方があるとすれば
1.メモ帳を起動してプロセスIDを取得しておく
2.書き込みたいデータをクリップボードに入れる
3.プロセスIDを使って起動したメモ帳に貼り付ける
大雑把に言うとこんな感じになると思う
API使ったりすることになりそうだが
細かいことはスレ違いだしググレ
多アクセスに対応するために、ブックじゃなくてテキストファイルを醤油にしてるけど、軽いし保存が楽だし エクセル使うためにテキスト制御するならスレチってわけでもないんじゃね そもそもFSOだとかなんとかはエクセルVBAに装備されてるし、CSVなんてのもあるし 具体的にはググれ
プライベートファンクションとは何?
>>806 アフォだなぁ。
新規.txtを作って、それを実行すればいいじゃん。
>>793 のせいか知らんが、誰もコードを書かないなw
「txtを立ち上げ」とか、意味がわからん 共通語で書いてくれればスレチでもコードぐらいいくらでも書く
>>808 そのモジュールの中だけで使えるファンクション
>>809 確かにそう最初はそう思った
でも「保存していない」って書いてある以上
VBAでファイルを作ってどうこうなんて論外だと思ってこう書いた
>>811 立ち上げ、じゃなくて、実行ね。
キミひょっとして、.txtをオープンするのに、プログラム名指定したりしてんの?
あーごめん、俺宛のレスじゃなかったのか
IDでないから誰に誰が言ってるのかさっぱりわからん
まぁ
>>806 が正解だろうね。
俺はスレチとは思わんが、コードは書かない。
ここまで俺の自演
どこから?
じゃあここからは俺が
横でスマンが、
>>807 の
>ブックじゃなくてテキストファイルを醤油にしてるけど、
醤油にしてるっつーのはどういう意味?
データソース→(中略)→醤油 だと思われ
しょうゆこと
825 :
822 :2009/07/01(水) 19:12:49
しょうゆうことっすか w ありがと
なんかないの
827 :
デフォルトの名無しさん :2009/07/02(木) 23:14:11
sub 凶悪ループ()
do
msgbox "
>>1 乙"
loop
end sub
こーゆー連続でメッセージボックスが出るマクロってESCキーで止まんないんだけど
どーやって止めんの?
タスクマネージャー開いてエクセル落とせばいいんじゃね?
ctrl+Breakでとまる。
電源おとせばいいんじゃね?
ブレーカー落とせばいんじゃね? ↓
| | | | | ↑ |┌┘ ┌─→ └┴─┬┘ ∧_∧ └─┐ ´・ω・`) ←┐ ┌┘ /U ┌┴──┼────→ | ↓
このスレで質問するのが適切か分かりませんが、質問させてください 今年より社会人として働きはじめました。 業種は平たく言えばリース会社です。 新入社員教育として、ひたすらレポート、書類作成をしてきました。 エクセル自体余り使ったことがなく、書類はエクセルで書いたほうが便利なのかぁ〜っと、先輩から教わりつつ、業務教育を受けていました。 今月に入り突然上司より、VBAでツール作ってもらうからっと言われました。 プログラムなんて完全に未経験ですし、エクセルでもようやく文章をかけるようになった程度です。 そこで質問なのですが、初心者向けの参考書や、勉強法などありましたら、教えてください。 今はエクセル VBAで検索をし、上位に表示されるサイトを参考に勉強しています。 ツール自体どんなものを作るのか不明で、確認をとってみても勉強しといての一点張りです。 恐らく在庫管理かなにかで利用するツールではないかと思うのですが…… 長々となってしまい、また質問内容も明確でないかも知れませんが、よろしくお願いします。 ちなみに私以外ほぼ客先に出ているため、社内で教えてもらうのは不可能です。 自分高卒なんで、会社も属に言うブラックなのかもしれません。
>>833 参考書等:ググル、本屋のVBA本。何でも可。まずやってみる。
ツールの方向性:
◎レポート作成機能:グラフ付きの売り上げ月報をイメージして
・1エクセルで完結
・各シートに拠点毎の売り上げデータがあるとして・・・
@集計機能
A抽出機能
Bレポート/分析/グラフ作成(拠点毎、グループ毎など)
・複数エクセルの連携
・上記と同じ。各エクセルファイルに拠点データがあるとして・・・
◎最終的にアクセスとの連携
何かしらの大量データを分析して、グラフ報告書を作れるようになれば
大抵の機能は作れるようになっていると思われ。
そこまで行くと、多言語実装やアクセス等のDB連携を視野に入れるようになるのでは?
頑張ってね〜
それと勉強の方針としては、次のようにやってみれば? つねに頭に置いておくのは「自動化」。いかにワンタッチで実装するかがポイント。 @9x9表の表示(反復と表示方法) Aシート入力でnxn表の表示(シート入力方法) BAを偶数 or 奇数のみ表示(選択方法) CBの色塗りとか罫線とか(表示方法) DCを別シートや別エクセルに出力(出力方法) あとは小奇麗にまとめればレポート作成機能になりそうじゃね? イメージできるかいな?
837 :
デフォルトの名無しさん :2009/07/04(土) 13:21:26
こんにちは、よろしくお願いします。 特定のセルが空白なら・・・という例はよく見かけますが、 特定の範囲が空白なら・・・というのが見つけられなくて困っています。 当方Excel2007です Dim ran Set ran = Range("A1:E5, A9:T18, A21:T31, A35:T44, A48:T57, A60:T69, A72:T81") If ran.Value = Empty Then とすると、set ran〜の部分で13エラーが出てしまいます。 正しいコードを教えていただけませんか?
ループして中身全部見ろ
839 :
デフォルトの名無しさん :2009/07/04(土) 13:36:23
すみません、エラーが出るのは set ran〜の部分ではなく if ran.vakue〜の部分でした。 loop、でプログラミングしてみたらいいのでしょうか?
for each c in ran if c ... next
>>834-836 親身になりアドバイスを頂き、ありがとうございます。
まず入門向けの参考書を買い勉強
その後サンプル集を買うまたはネットから手に入れマスターしたいと思います。
本当に途方にくれていました。ありがとうございます。
参考書はカラーで絵が多いものが経験上長続きします。
その辺りを考慮し選んできます
>>841 大量データが欲しかったら、適当なHPで株式データを1ヶ月分くらい入手してみ。
個人だと大量データ入手が大変だから。会社データは色々とまずいだろうし。
んで、最初は手作業でいいから移動平均線のグラフとかを出せるようにして、
最終的にはワンタッチで自動更新できるようにするのがよろしいかと。
家計簿や体重なんかのデータも身近でいいな
844 :
デフォルトの名無しさん :2009/07/04(土) 16:40:06
意味のあるデータが大量に欲しいなら、 気象庁へ行けば過去の気温とか置いてあるよ
カレーの食べ方に名前があったなんてw
849 :
デフォルトの名無しさん :2009/07/04(土) 23:50:12
Excelで一覧を作った時に たとえば3行目がタイトル行だとして、 タイトルにはA列は年齢、B列は名前、C列は出身とかあるのですが、 あらかじめ指定されたタイトルを検索して、 その列のタイトル次の行から、一番下の行まで選択するにはどうすればいいのでしょうか? たとえば変数か何かで「名前」と指定すれば、 B4からその列の一番下の行まで選択したいのですが やり方がいまいちわかりません 教えてください
>>849 ヒント: ctrl+↓
これをマクロで書いてみ (ただし途中に空欄がある時は誤動作するけど)
最終行(65535?)からctrl+↑でも似た動作するよ
データが何行目まであるか決めといた方が、もっとスマートに書けると思うよ
>>849 プログラムを作る時は、手順を分解して1つずつ考えるんだよ
この「分解する」ってのが初心者には難しい。
知識と経験がないと、どうやって分けたらいいのかわからないし、
うまく分解できないと検索してもヒットしない
1. タイトルのある行を特定する
2. 検索する文字列を指定する
3. タイトル行から指定された文字列を検索する
4. 一番下の行を調べる
5. タイトルの次から一番下まで選択する
>>846 たった5000件までかよ。
いつもいまいちな回答してるやつ5000件で試してるのかも知らんな。
>>852 文句があるならお前が教えてやれよwww
初心者なんだから5000件でも多いだろwwwwwwww
>>853 配列数式厨には多すぎるくらいのデータだわな。
配列数式厨は
>>846 使って答えるべし。
5,6件のデータを想定するんじゃねーぞ。
アルゴリズムとデータ構造覚えるなら10件程度でよくね? 学校ではそっから始るんだからさ。 まずはVBAより、変数とか配列とかのプログラム自体に慣れるのが吉。
>>856 一般的になプログラミングになれたら、VBAで通用しなかったでござるの巻
理論と実践は違うからなあ 大量のデータを高速に処理しようと思ったら、教科書に載ってる一般論なんて役に立たないし
>>858 データに偏りがあったり、ある法則、特性があるなら
その特性にあった方法をとるアルゴリズムが早くなることは十分にありえる。
必ずデータが1つ以外きれいに並んでいて、その一つのデータのためにソートするなら
クイックソートなんよりバブルソートの方が早いかもしれない。
row = 1次元 row column = 2次元 sheets row column = 3次元 workbooks sheets row column = 4次元 て考えれば、気づいてないだけで誰でも4次元配列まで使えてるはずなんだけどね。
>>860 5次元がフォルダ分けで
6次元がHDD分けかと思ったがそこから先はフォルダの階層を深くしていけばいいのか
Office2000から2007に移行するのだが、ツールバーをいじるマクロって2007だと使えなくなる? 例えば新規にツールバーを作り、そのツールバーから実行するマクロなど。
>>860 セルの中身を1文字ずつ分解すれば、さらに1次元プラス
3次元以上の配列なんて実際に役にたつの? 逆にrow,columnの2次元でも1次元ふたつに分解したほうが扱いやすかったりするような・・・ 配列使いだしたの最近だから、多次元が役立つケースあれば教えてもらえると勉強になる。
>>857 基本もわからず応用をやって、結局何も出来なかったでござる巻
VBAかじった奴に多い罠。
>>864 3次元以上の配列なんてそうそう使わんから気にするな。
そうなる前に、構造体・コレクション・クラスになるよ
1つの配列変数で4次元、5次元と増やすと、主に人間の頭がついていけなくなるという理由で使えなくなるけど、 シートが1枚しか使えないとかブック(ファイル)が1つしか作れない環境を考えたら、それはとても扱いづらくなるだろ? ようするに、増えた分をどうイメージするかって問題だよ。
VBAではやらないけど、構造解析とかやってると 構造データが3次元で、それに応力や温度や時間軸を増やしていったりするから 5次元とか6次元の配列は日常的に使う。 科学技術計算では多次元配列を使いまくるから、ベクトル型のスーパーコンピュータなんかは 配列(実際は行列)どうしを足したり掛けたりするための専用のハードウェアが内蔵されてて、 ループを使わなくても一発で計算できるような構造になってたりする。
>>866 増えた分をどうイメージするかじゃなくて、意味のある次元の割り当て方をしていれば
何次元配列になっても混乱しないし、高次元の配列は作らないだろ
二次元配列をメンバーに持つクラスを格納するリストを用意して、実質3次元に成ることはあっても
単体の配列だけで4次元以上の高次配列に成ることはまず無いだろうな。
そもそも各次元n(i)個の要素を持つn次の行列を逐次アクセスしようと思ったら
Π[i=0,m](n(i))回ループすることになるしな。
VBの配列が貧弱なだけだからOK
> 1つの配列変数で4次元、5次元と増やすと、主に人間の頭がついていけなくなるという理由で使えなくなるけど、 そんな奴居ねーよw 物理次元の話と混同してないか? 物理次元なら4次元以上に付いていけない人が多いのは確かだが、 配列次元が増えることで付いていけなくなることはまずない。 少なくとも、1次元配列が理解できて5次元配列が理解できない奴は、まともな社会生活すら送れないことになる。 何故なら日本国内の住所概念が、都道府県名を第1次元とする5〜11次元配列に相当するからだ。 更に言えば、5次元配列を理解できない奴は、万単位の買い物も出来ない。 0〜99999という10万未満の数値は、0〜9という要素の5次元配列に相当する。 「お会計34567円です」と言われて、どの額面(次元)の紙幣や硬貨が何枚(要素)必要か理解できるなら 5次元配列を理解できていることになる。少なくともVB言語の配列における次元ってのはこのレベルの概念だ。 まぁ5次元配列をプログラムの中で効果的に運用できるかとなると話は別だがな。
そもそもこの世界は11次元で紐(ry 次のネタマダァ-? (・∀・ )っ/凵⌒☆チンチン
>>862 俺も知らんがリボン対応しないと駄目なんじゃね?
>>870 だから、何をイメージするかで理解できるかどうかが変わってくるんだってば。
単純に数字を並べただけだと、それだけで拒否反応を示す人がいる。
「住所みたいなもんだと思えばいいんだよ」ってアドバイスをすれば
すんなりわかってもらえる確率がぐっと上がる。
そういうレベルの話をしてたつもりなんだけど。
874 :
デフォルトの名無しさん :2009/07/05(日) 16:29:29
そう。低レベル。 初心者に説明するのは大変なんだよ。 いっぺん家庭教師とか講師とかやってみるとわかる。
住所や金銭が配列って概念が新しいわw これらはプロパティのイメージだろw
877 :
デフォルトの名無しさん :2009/07/05(日) 17:31:39
学校のPCなのでバージョンは見てませんが、OSはXPのPCで、 学校の宿題として出されたのですが、ExcelのVBで奇数偶数を分けるマクロを、 調べるように言われたのですが、自分の持ってる本には書いてなくて、Excelの 基本操作でもできる物ですが、教えてください。
2で割ってあまりがあったら奇数 なかったら偶数
879 :
864 :2009/07/05(日) 17:42:45
なんだかお騒がせしてるみたいですみません クラスとかあまりわからないからわかる範囲で処理しようとしてかえってややこしくしてるのかもしれませんね 勉強不足ですみません そもそも多次元が不便に感じたきっかけはredimで最終次元しか変更できないからですけど なにか簡単な別手段ありますか?
>877 授業で、ってなると、 2を引きまくって余りが1以下になるまで、とか 無駄にループしてるの作ってほしそうだね
>>877 ふつうは、
>>878 さんのやり方でやるよ。
Mod使って余り出しても良いし、ビット演算子使っても出来る。
∩___∩ | | ノ\ ヽ | / ●゛ ● | | | ∪ ( _●_) ミ i 彡、 |∪| | 877J / ∩ノ ⊃ ヽ ( \ / _ノ | | .\ “ /__| | \ /___ /
mod
885 :
デフォルトの名無しさん :2009/07/05(日) 19:42:48
質問させてください。 OS:Windows XP Professional SP2 Excel2003 VBA歴半月です。プログラミングはJavaをかじったことのある程度です。 一つのブックに商品別売上一覧表のシート(マスタ)と更新されたデータを含むシートがあります。 表示形式はどちらのシートも同じです。 商品コードがユニークなので、マスタにない商品コードを更新シートから検索し マスタの最終データ行の下にデータ行を追加していくプログラムを組んでいます。 なお、商品名ごとに月別売上の小計を計算する行が一行挿入されていて その行の商品コードのセルは空白になっています。 Dim master As Integer (マスタの行カウンタ) Dim update As Integer (更新シートの行カウンタ) Do while master > 最終データ行 If (マスタ)商品cdセル <> "" Then For update = 2行目 To 最終データ行 If (更新)商品cdセル <> "" Then If (マスタ)商品cdセル.Value <>(更新)商品cdセル.Value Then (更新)該当データ行(データのある範囲).Copy (マスタ)最終データ行の一行下.Insert End If Next End If Loop という方法で組んでみたんですが、新規データだけを拾うことができません。 分かりにくくて申し訳ありませんが、ご指摘よろしくお願いします。
>>885 不明点だらけで困るが、デバッグして追ってみれば?
@マスタと更新シートのデータをきちんと拾えているか?
Aコピペするのは良いが、きちんと更新シートをコピってマスタにぺしてる?
片一方のコピペを繰り返していないか?
B上書きしてないか など・・・
>885 If (マスタ)商品cdセル.Value <>(更新)商品cdセル.Value Then ↑ここおかしくない? マスタと更新のデータ位置が同じセルであるわけがないんだから。 matchでエラーなら挿入とかの方がいいんじゃないかね?
>>887 whileとforで回してるっぽいが・・・
確かにマスタと更新の行位置更新について情報無いけどね
889 :
885 :2009/07/05(日) 21:16:07
>>885 です。レスありがとうございます。
>>886 データは拾えてるみたいです。
更新→マスタへのデータのコピーはできるんですが
新規データだけでなく既存コードのデータまで複数件コピーされてしまっています。
>>887 マスタと更新はまったく同じレイアウトですが
新規データが追加されるので、確かにコードの位置はマスタと更新では違います。
そう思って二重ループで回してみたんですが、上記のような状態になってしまいます。
>>887 さんの仰る通り、条件文が変なんだと思います。
ちなみに、matchを使って判定する場合は、
If match(マスタの商品cdセル, 商品cdのセル範囲, 0) = #N/A
というような使い方をするんでしょうか。
一段階踏めば?理解してからmatchとか使わないと結局分からなくなると思うが。 @全データ突合せ。印をつけとく。(行位置確保) Aそれからコピー
>889 match使うならば、エラーが出る=matchしない→コピー必要、だから、 エラーが出たらコピー作業、になる。 かなり適用にしか書いてないからちゃんと直して。 Dim mastercode as string Dim updaterange as range On Error GoTo Datacopy Set mastercode = (マスタ).Range(cd) '←cd部分"master使って表記" Set updaterange = (更新).Range(cd) '←cd部分"update使って表記" If Application.WorksheetFunction.Match(mastercode, updaterange, 0) > 0 Then GoTo Nextcopy Datacopy: コピー作業 Nextcopy: End If Next 〜 Loop
DBで扱うなら、SQL組み込んでいいんじゃね
893 :
885 :2009/07/05(日) 23:45:30
>>890 ご回答ありがとうございます。
もう一度検証してみたところ、ループの通り方がおかしかったようです。
>>885 の処理だとセルの値が同じ時は違う値だけを拾えるんですが、
Else中で違う値に印をつけると、全てのセルに印がついてしまうので
コピー作業をする前に、ループ処理を見直してみます。
>>891 matchを使ったコードのご提示、ありがとうございます。
今は前段階のループでつまずいてしまっていますが、
簡単なサンプルで動かしてみて、matchの働きは大体把握できました。
参考にさせていただきます。
>>892 DBでは使わないので、SQL文は使えません…
もう一度、ループを見直して行位置確保できるよう考えてみます。
分かりずらい説明だったにもかかわらずレスくださった方々
本当にありがとうございました。
>>893 簡単な素数の求め方と同じ原理
2から始まって、2の倍数削除、3の倍数削除、4は飛んで5の倍数削除(ry
Clng(Date) = 40000
エクセルで迷路っぽいのを作る時、ランダムに配置された部屋(セル範囲)を すべて通りつつランダムに通路で繋げるにはどうしたらいいかな?
>>896 分割統治法か動的計画法使えばいんじゃね?
899 :
デフォルトの名無しさん :2009/07/07(火) 16:08:14
はじめまして。よろしければご教授下さい。 os:XP SP2 excel: 2003 あるデータ群のO列のあるセル(仮に("O"&i))がblankの際O列の1行上(仮に("O"&i-1))をコピー、 ("O"&i)にペースト、を実行したいのですが、反応しません。 Sub test() Dim i As Long For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Range("O" & i).Value = 0 Then Range("O" & i).Offset(-1, 0).Copy Destination:=Range("O" & i) End If Next i End Sub フィルタ等を使えば可能なの程度のものかもしれませんが、 割と大きなCSVファイルを展開する途中のものなので できれば手動では行いたくないのです。 宜しくお願い致します。
普通に動くけど 大量データを回すならコピーじゃなくて直接値を入れたほうがいいんじゃね
902 :
899 :2009/07/07(火) 17:06:32
>>900-901 稚拙な質問にご回答頂き有難うございました。
>>901 >コピーじゃなくて直接値を入れたほうが
参考にさせて頂きます。有難うございました。
903 :
デフォルトの名無しさん :2009/07/07(火) 17:53:23
>>896 ローグライク作りたいんだろ?
・部屋と道と分岐点のパターンを各種作成しておく
・部屋作りの前に部屋と分岐点の数を決定する
・後は部屋と道を繋げる。分岐点が足りなければ、
部屋の位置を調整して直線でつなげる
パターンの位置調整がめんどくさいだけじゃね?
その情報じゃこれぐらいしか言えん
こんばんわ、質問させていただきます。 Webの自動実行を行うマクロを作成しています。 文字列代入→ボタン押下というのを繰り返しているだけなのですが、 ボタン押下した際次の画面になるまで Do While objIE.Busy = True Or objIE.document.ReadyState <> 4 DoEvents Loop といった感じに表示待ち処理をいれています。 が、時々ボタン押下時にURLはそのままで画面のみ遷移する場合や、画面上のタブの切り替えを行った場合など 上記の表示待ち処理が終了しても画面が切り替わりきれていないことがあります。 objIE.Document.form(0).item("button1").Click ←画面遷移 表示待ち objIE.Document.form(0).item("button2").Click ←ここで「オブジェクトはこのプロパティまたはメソッドをサポートしていません」とでます。 2,3秒待つと普通にクリックできるようになるので現在は強制的に3秒程待機するようにしていますが、 もし他にボタンが押せるようになるまで待機ができる方法などございましたらご教授いただけませんでしょうか。 わかりにくい質問で申し訳ありません。よろしくお願いします。
>>904 While .item("button2") Is Nothing 〜 でボタンが表示されるのを待つ
質問です。 stringの変数の中に格納されている文字列の、 頭から指定の文字数だけ、置き換えたいのですが、どうやったらうまくいのでしょう? 文字列は、全角、半角混ざっています。
>>904 On Errorでクリックできるまでループ
>>906 VBAでは全角も半角も同じ1文字として数えるから、普通にLeft関数とか使えばいい
leftって文字列を抜き出すんですよね? それを置き換えるのはどうやるんでしょう?
midのほうがいんじゃね
sub 文字列aのc文字目までを文字列bに置き換える() a = b & mid(a,c+1,len(a)-c) end sub
条件小出し案件の予感・・・ Σ(゚д゚lll)
置換というか、代えたい文字+残したい文字なんですね。 ありがとうございます。
>>905 ,907
904です。ありがとうございます。早速試してみます。
915 :
862 :2009/07/08(水) 00:30:52
>>872 情報サンクス。
やはりリボンか・・・マクロの改変ややこしそうだ(´・ω・`)
>>915 それなら普通にVSTO使えばいいんじゃね?
Replace関数使えよ。 "あいうえお"から頭の"あいうえ"を"はげ"に置き換えるなら Replace("あいうえお","あいうえ","はげ") これで”はげお"になる。 ただExcel97だったかExcel2000からのサポートだったか忘れた。
上はちょっと足りなかったか。 "あいうえあいうえお"で"はげはげお"になるな。 Replace("あいうえお","あいうえ","はげ",1,1) これだと"はげあいうえお"になる。 変数aの頭の4文字を"はげ"に置き換えるには Replace(a,Left$(a,4),"はげ",1,1)かな?
もし同じ文字数の別の文字列に置き換えるならMidステートメントが楽だね。
ありがとうございます。 midとReplaceとどちらが勝手がいいか試してみます。
921 :
デフォルトの名無しさん :2009/07/08(水) 17:31:38
グラフのプロットエリアの位置・サイズ指定の方法は、Excel 2007で変更になったのでしょうか? PlotArea.Top(LeftやWidth)=数字 のようにすると 2003だと上手くいくのですが、2007だとエラーが出ます。どなたか、ご教授下さい。
2元配列の入れ換えってどうするんでしょう ↓を取り敢えず考えたんですが dim 配列i() as string dim 配列n() as string dim 変数i as long dim 変数n as long for 変数i = 1 to 任意の数 redim preserv 配列i(1,変数i) as string 配列i(0,変数i) = 任意のstring 配列i(1,変数i) = 任意のstring2 next redim 配列n(変数i,1) as string for 変数n = 0 to 変数i 配列n(変数n,0)=配列i(0,変数n) 配列n(変数n,1)=配列i(1,変数n) NEXT セル範囲 = 配列n
for 変数i = 1 to 任意の数 ↓ for 変数i = 0 to 任意の数 でしたすみません セル範囲に流し込む二元配列にデータを取得するんですが、 その配列に格納するデータが不確定であった場合 redim preservの適用範囲が配列の最終データまでしかなくて困るんです
一回シートに書き出せばいんじゃね
>>922 とりあえず、無意味に変数とか配列とか書くとかえって読みにくいんだけど…俺がなれてないせい?
dim a() as string
dim b() as string
dim i as long
dim j as long
dim n as long 'nは任意の数。つうか任意の数って具体的にどこの数よ?
for i = 1 to n
redim preserv a(1,i) as string
a(0,i) = 任意のstring
a(1,i) = 任意のstring2
' if 〜 then exit for とか書く予定?
next
' 大きめにとっておいて、最後にReDim preservで小さくするか
' 配列のサイズがループ前に既知なら、ループ前に1回確保するだけにとどめておいた方が…
redim b(i,1) as string ' i ->nで良いよね?
for j = 0 to i ' j -> i 、i -> nで良いのでは?
b(j,0)=a(0,j)
b(j,1)=a(1,j)
next
' 代入していないa(0,0)にアクセスしている件につい(ry
セル範囲 = b
-------------------
結局やりたいことは転置?
ひとつ、コンパイラな人に聞きたいんだが、
ループ変数をループ外で利用する、しかもループ脱出後の値をそのまま使うってのはアリなのか?
最適化の面で不利な気がする。 VBAはそのレベルの最適化はかけてなさそうだけど…
とりあえず、2次元配列(ジャグ配列ではない)を転置するやつは 単純に考えればこうなるよね? Sub Transpose(ByRef target() as Variant) Dim input() as Variant Dim output() as Variant Dim x as integer , y as integer ' 既にtargetは領域確保済みで、値が入っているものとする Let input = target '動的配列はVariantだからLetで良いんだっけ? ReDim output(LBound(input,2) To UBound(input,2),LBound(input,1) To UBound(input,1)) for x = LBound(input,1) to UBound(input,1) for y = LBound(input,2) to UBound(input,2) output(y,x) = input(x,y) next y next x Let target = output End Sub たぶん、配列はvariantだから、inputへコピーするのを省くとちょっと早くなるかもしれない。
>>925 変数iはループを終えた時点でn+1になってるからダメ
For i = 1 To 10
Debug.Print i
Next
Debug.Print i
ってやってみ
変数の範囲って @ブック内全部 Aモジュール内全部 B宣言したプロシージャだけ の3つであってますか? Aの場合 Dim hoge as string DIM hoge = "ほげ" sub test () msgbox = "hoge" end sub こういうことじゃないんですか?
自己解決 宣言だけして代入はしてはいかんのですね Dim hoge as string sub test () hoge = "はげ" MsgBox = hoge end sub
そこはDimじゃなくてprivateと書くべき。 sheet1も中身はクラスだよ。 そして何を言いたいのかわからない。
privateはブック内全部って事じゃないのですか? モジュール1でもモジュール2でも宣言した変数を使うときに 書くみたいな
変数のスコープ でググると分かりやすいかも。
>>931 まあ、MSDNの取説見るのが一番手っ取り早いと思うけど
private / publicはクラスの外部から見られるか、見られないかの違いしかない。
実際、モジュールに宣言して、外部からアクセスしてみれば分かる。
それ以外のルール、宣言した識別子が、どの範囲まで通用するかというのは
原則、宣言した場所よりも深いところであれば通用する。(クラスのメンバはそのクラスに属するメソッド内でつかえる)
その逆は、通用しない。(メソッドの中で宣言された物は、同クラスのほかのメソッドからはアクセスできない(つか、する必要性がないがw)
>931 それはpublic
935 :
862 :2009/07/09(木) 21:20:14
>>916 ありがとう。でもVSTOなどのアプリケーションは事情があって
インストールできない環境なのよ。
OfficeのVBAエディタだけで対応するしかない状況。
頑張るよ。。
ネット検索のみでいままでVBAを勉強してきたのですが、 とうとう行き詰ってしまいました・・・ 先生方の手助けを借りられれば幸いと思い書き込みさせていただきます。 イベントWorkbook_BeforeSaveをアドインで機能するようにしたいのですが、 WithEventsを下記のように用いてもうまく機能しません。 どのほうに表現すればよろしいのでしょうか? 以下ThisWorkbookに貼り付け。 ------------------------------------------------------------------------- Private WithEvents app As Application ------------------------------------------------------------------------- Private Sub Workbook_Open() Set app = Application End Sub ------------------------------------------------------------------------- Private Sub app_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) MsgBox "テスト" End Sub ------------------------------------------------------------------------- 説明不足等ございましたら、お手数ですがご指摘お願いいたします。 よろしくお願いいたします。
Range("1:1,3:3,4:4,6:6,7:7,11:11,13:13,15:15,17:17,27:27").Select 上記みたいに行選択をさせたく ある行にある特定の文字列がある行だけを選択させたいのですが Do Whileで回して valsにほしい行をため込んでいって aaa = "" & vals & "" Range(aaa).Select という記述がどうしてもうまくいきません それが1000行近くあるので数の問題かと思っていたら そうでもなさそうですし うまい方法を教えてください
とりあえず、aaaが目的の文字列にきちんとなっているか確認してみたら? うまく繋げられていないだけのような気がする。
>>938 Rangeの引数に指定できる文字列は256文字以下
941 :
デフォルトの名無しさん :2009/07/12(日) 00:42:39
>>939 はい一応デバックで止めて中身を見てもちゃんと入っています
ダブルクォーテーション網膜は行っています
もしくは
データをいじって結果がRange("1:1,3:3").Select
という 数を少なくしてもやはりエラーになります
Range("1:1,3:3").Select
をそのまま記述すればエラーにならないのですが
どうしても
"1:1,3:3"の部分を変数にするとエラーになります
ちなみにエラーの内容は
実行時エラー1004
Rangeメソッドは失敗しました: '_global'オブジェクト
>>941 まず、文字列にダブルクォートを入れたいときは
× aaa = ""
○ aaa = """"
なんだけど、ダブルクォートってのはソースリストの中で文字列の範囲を示すための物だから、
それ自体を文字列変数に入れても仕方がない
つまり
aaa = "" & vals & ""
Range(aaa).Select
じゃなくて
Range(vals).Select
だけでいいはず
あと、上にも書いたようにRangeに指定できる文字列は256文字
正確には256文字未満 つまり255文字まで
>>941 それ標準モジュールに書いてるのか?
シートモジュールじゃないのか?
例えばSheet1のモジュールで
Worksheets("Sheet2").Activate
Range("A1").Select
と書いても動かん。
シートモジュールなら
Range(aaa).Selectじゃなくて
Excel.Range(aaa).Selectとしてみなよ。
しかしActivateとかSelectとかほとんど必要ないんだが、そのアドレスをため込んでいく方法も感心しないな。
前スレで同じような回答したやつに指摘したら逆切れされたよ。
バカはどこにでもいるから仕方がないが。
盲愚の側溝テクニック集にも似たようのがあったかな?
あそこは駄目テクニック満載だがw
>Range("1:1,3:3").Select >をそのまま記述すればエラーにならないのですが とあるかから上は外しだったな。 255文字を超えたんじゃないかと思うが >データをいじって結果がRange("1:1,3:3").Select >という 数を少なくしてもやはりエラーになります とあるから、これも直接の原因じゃないのか。 いずれにしても1000行なら255文字は超えそうだけどな。
もしかしたら余計なダブルクォーテーションが先頭と最後についてるんジャマイカ。 付けてみたら 「実行時エラー1004 Rangeメソッドは失敗しました: '_global'オブジェクト」 のエラーメッセージが出たが。
947 :
946 :2009/07/12(日) 09:13:59
>>937 HELPから引用
省略可能です。引数 varname が ActiveX オブジェクトによって
起動されるイベントへの対応に使われるオブジェクト変数であることを示すキーワードです。
クラス モジュール内でのみ有効です。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
キーワード WithEvents を使用して任意の数の変数を個別に宣言できます。
ただし、配列は作成できません。また、キーワード New はキーワード WithEvents と共には使用できません。
てか、「Excel WithEvents」とかでググればいっぱいでてくる
ttp://msdn.microsoft.com/ja-jp/library/cc376266.aspx
949 :
デフォルトの名無しさん :2009/07/12(日) 11:41:19
>>492-497 対応ありがとうございます
やはりダブルクォーテーションが原因のようでした
>>944 一応思いつくのは方法として思いつくのが
上記のやり方か
フィルタで特定の文字の行だけを抽出して全選択ぐらいしか思いつかないのですが
他にうまいやり方とかあるのでしょうか?
950 :
937 :2009/07/12(日) 12:11:58
>>948 ありがとうございます。
参考URLより、うまく機能させることが出来ました。
ありがとうございました。
>>949 そのまとめて処理という発想をすてて、一つ一つ処理した方が確実。
ただ一つ一つSelectして処理は駄目。
Selectしない方法を身につけないと。
>>951 一つ一つ処理したら何が確実になるの?
一つ一つSelectして処理したらどうして駄目なの?
横レスだけど、 1つに対して出来たら、後はforやfor eachで対象を増やすだけ。 selectしなくても直接操作できるならしない方が動作が早い。
954 :
デフォルトの名無しさん :2009/07/12(日) 18:30:54
>>953 >1つに対して出来たら、後はforやfor eachで対象を増やすだけ。
例えば1行1列の行列掛け算プログラムを正しく作ったとして、
それをn行n列の行列掛け算に拡張するとする。
その拡張が正しいというのはどのように判断するの?
2行のデータをソートするプログラムを正しく作ったとして、
それをn行のソートに拡張するとする。
その拡張が正しいというのはどのように判断するの?
まとめてやった方が早いかどうかは処理によるんじゃね?
956 :
デフォルトの名無しさん :2009/07/12(日) 18:34:41
>>953 >selectしなくても直接操作できるならしない方が動作が早い。
早く動作させたい場合、データを一つ一つループで回して処理するより、
データの塊りをライブラリに与えるほうが速いことが多いよ。
>>951 >>953 データを集合で扱ったほうが、確実(正しい処理)で速いよ。
selectがどうとかバカらしいよ。
とりあえず速さがどうとか言ってる奴はサンプルを提示して、実行速度の比較結果をここに貼れよ
>>954 ダミーデータ入れて検証するか、ステップアップで確認しろよw
まとめて処理が速いと思ってる馬鹿どもが、例の低レベルUnion使ったりするんだろうねぇ。 なにせ普通にUnion使ったらエリア数の惨状に比例して遅くなる。
高レベルのロジックを貼ってください><
いちいちSelectするよりRangeオブジェクトをそのままメソッドに渡した方が速いことが多い。 これはあくまでも一般論。 Selectしたあと何をやるか質問者が一切書いてないのに先走ってケンカして、単なるアホ。
963 :
デフォルトの名無しさん :2009/07/12(日) 20:28:13
>>962 Selectした後コピーして別のシートに貼り付ける
>>960 を受けてだが、A1:CV10000に1〜100のランダムな数値を入れて、各行の最大値のセルに色を付けるコードを書け。
ただし条件付き書式は使わないものとする。
まぁ条件付き書式でも実用に耐えるものを設定出来るやつ何人いるか分らんが。
ちなみに=A1=MAX($A1:$CV1)の条件は不合格です。
>>962 実際よくUnuion使った手法を見るから
>>960 が書いてるように勘違いしてるやつは多い。
>>959 行列計算やソートしてくれるライブラリがあるなら、そっちを使うなあ。
検証好きなんだな。お前。
荒れると伸びるよなお前ら 速さの話題出るたびに検証検証言ってるのは一人だけなのか? 質問が早さを求めていない以上レスポンス云々の回答が的外れであるのは否めないが 何度もそう健勝言われてもうざいです^^q^
>>951 みたいなやつが出てくるとからかいたくなる。
>そのまとめて処理という発想をすてて、一つ一つ処理した方が確実。
ほうどうして?
>ただ一つ一つSelectして処理は駄目。
>Selectしない方法を身につけないと。
へえなんで?
>>970 は引っ込んだ方がいいんじゃねーの?
Selectしないなんてのはごく一般常識だ。
>>969 質問が速さを求めてないんだから確実に動かない
>>938 は駄目だね。
ダブルクォーテーションの問題をクリアーしても255文字の制限で駄目なのは目に見えてる。
>>971 Selectしたってちゃんとした結果が出るんならいいじゃない。
視野がせまいんじゃないの?
まったく500連発級のアホがいるなw
>>964 なんとなく試したら平均2秒もかかるコードしか組めなんだ。
しかも、各行の最大値は重複しないという条件で。
ところで、
>ちなみに=A1=MAX($A1:$CV1)の条件は不合格です。
は何故不合格なのか教えてもらえるとうれしい
>>975 2秒だろうが10秒だろうが、手作業よりよほど速いんだから気にすんな。
Selectしようがしまいがちゃんと結果を出せるんなら実用上問題ない。
それよりも本当に最大値を間違いなく出せているのか?
それだけが重要だ。
UNIONがだめとか何言ってるの 複数のコード書いて質問者に選ばせればいいじゃん 自分のスタンスじゃないからって否定すんなよ 行選択ならrows()の組み合わせが使えるんじゃね
>>977 たとえばもクソもねーよ。
255文字を超えると使えないような手法が使えるわけねーじゃん。
それこそ誰かがどこかで書いてた小売店レベルでしか使えねーな。
>>975 もしかして1〜100の乱数書き込みを入れての時間?
そうじゃなかった少し古いパソコン?
Vista 2007 Core2Duo3.00GHzでおまいの書いたであろうコードを書いてみたら0.7秒だった。
重複対応のmatch使わないで配列ぶん回すやつはこれに0.1秒余計にかかるだけだった。
ちなみに普通にUnion使ったら20分だったw
>>979 255文字を超えない文字数で何回かに分けて処理する方法はあるよ。
ただかなり複雑になるけど。
>普通にUnion がさっぱりわからん。
>>984 Unionでも工夫すれば速くなるとかいう達人が前にいたからねぇ。
その工夫がめちゃめちゃ面倒で、俺みたいな凡人にはとても書けるものじゃなかったよ。
普通のUnionならたとえば下みたいなのじゃね?
Sub foo()
Dim r As Range, c As Range, u As Range, maxV As Double
With Application.WorksheetFunction
For Each r In Range("a1:cv10000").Rows
maxV = .Max(r)
For Each c In r.Cells
If c.Value = maxV Then
If u Is Nothing Then
Set u = c
Else
Set u = Union(u, c)
End If
End If
Next
Next
u.Interior.ColorIndex = 3
End Sub
これなら数十分かかるかもね。
配列やItemプロパティで工夫しても同じようにUnion使う限り似たような時間だろう。
>>975 の重複なしのやつは多分下みたいなやつだろう。
With Application.WorksheetFunction
For Each r In Range("a1:cv10000").Rows
r.Cells(.Match(.Max(r), r, 0)).Interior.ColorIndex = 3
Next
End With
エクセルに表示されている省略されているアドレスを 本来のアドレスに戻すことはできますか? リンクの編集からリンク先のリンクがわかるのですが、 それをいちいちコピペで変換するのが大変なので。
>>985 何がしたいのか知らんけど、バグってるよねそのコード
>>986 マクロ使わないと無理
Range("A1").Hyperlinks(1).Address
>>979 どうでもいいんだが、「小売店」の意味を勘違いしてる
まあお前が言い出したんじゃないかもしれないけど
VBAだからどうでも良いって考える人が多いだろうけど、 プログラムをやるならば、他人がメンテする事も踏まえて可読性の高い、 一般的かつ美しいロジックの構文を心掛けるべきだな。 省略した方が一般的ならば省略すべきだし、 省略すると、動くけどマニアックならば省略すべきでは無い。 デフォルトプロパティの省略なんか分かりやすいかな。
>>988 B列にあるアドレスということで
Range("B").Hyperlinks(1).Address
としてやってみたのですが、駄目でした。
マクロは
Sub リンク()
Range("B1").Hyperlinks(1).Address
End Sub
こんな感じになってます。最後のaddressってのが黄色く表示されます。
>>990 そうだねぇ。
省略するのが一般的なものの一番はItemだな。
Set w =Worksheets.Item("Sheet1")とかやられるとかなりくどくて嫌味だな。
>>987 End Withが抜けてるだけだな。
インデントつけりゃすぐわかることだ。
Application. とか普通つけないしな
Microsoft Excel では、ワークシート上で =0^0 という数式を入力すると #NUM! というエラーを返すが、 同ソフトウェアに搭載されている VBA では1と定義されている。
SelectしないのはSelectの省略とは言わんなぁ。 あれはつけないのが当たり前だからな。 つけたら可読性は最低レベルだ。
>>996 VBAでは、0^0が1というより、n^0が1(nが負数なら-1)となる
算術演算的には0^0はエラーでいいんだが
論理演算的には1や-1になった方が都合がよいからな
銀河鉄道
Windows
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。