初心者です。お時間がありましたら、アドバイス願います。
「自分のペースでゆったり学ぶ EXCEL VBA」という本を使って
勉強しています。シートを任意の場所にコピーするという項目で、
エラーが出てしまいます。
Sub 納品書シート作成()
ThisWorkbook.Worksheets("納品書").Copy _
After := ThisWorkbook.Worksheets(3)
End Sub
これを実行すると、「修正候補:式」と出て、「After :=」の部分が赤色になります。
何が問題なのでしょうか。よろしければ教えてください。
EXCEL2010を使用しております。
>>4
こっちも2010
そのプロシージャまんまコピーして(勿論「納品書」シートも作って)実行したけど正常終了
念のためワークシート数を2枚にして実行すればエラーになるけどそれはインデックスが有効な範囲にないというエラーで
そちらのエラーにはならない。
一応確認しておくけど、VBEditorの画面で上のデバッグ(D)からコンパイルをしてエラーは無い? >>4
時間がないやつは最初からアドバイスなんて出来ない。読むのめんどくさいだけだからそういう社交辞令は書かないほうが良い
で、2010だけどエラーが出なかった。式はおかしくないはず
Worksheets(3) は、3つめのシートを表す。シートが3つ以下だとエラーが立つが、その場合は「インデックス~」のエラーになる
もし可能ならブックごとアップロードしてほしい >>4
改行のアンダーバーの前にスペース入れ忘れてるとかそんなんは? >>4>>8
よく分からない。普通にうまくいく(シート「納品書」がなかったからテキトーに作ったけど)
>>8
マクロを含むファイルは xlsm で保存しないとダメじゃね? >>4
出版社のページでダウンロードしてきたらどうでしょうか?
正誤表は無いみたいですね。 >>8
まず最初にエクスプローラーのツール→フォルダーオプションの
表示タブで”登録されている拡張子は表示しない”のチェック外せ。
んで、拡張子xlsxとxlsmの違いについてVBAのその入門書の最初から読んで
勉強し直せ vbaってpcのスペック関係あるん?
オフィス2010の32ビットでメモリー4gで全てのシートの枠線を一括して色変えろってのをやってるけど
すぐ動作しなくなるんだよね、俺のマクロが可笑しく書いてるだけかな
>>14
ある
Excelは割りと最適化してくれるけど、最適化しないとこは猛烈に重い
あと、ヘタにvbaコード書くよりマクロの記録をまるまるコピペしたほうがいい場合も多い たしかに枠線の色はパンチ効いてそうだな、メモリ的に
枠線じゃなくて罫線ね
色に関する機能はとにかく重い
どのくらいの大きさのものか、どのくらいの処理から重いと言うのかにもよるけど、
>>14と変わらない環境で5000行50列を縦横別々の判定で罫線引いてセルの背景色を行毎に変えて重要項目に個別に色付けてって処理でも五秒もあれば完了するし、
実務に影響が出るほど遅いって事なら、たぶんUnionでセルをまとめずに一つ一つに処理が発生するような事してるのでは?
処理の順番や組み合わせ次第で装飾的な処理はかなり軽く出来るはず。
GPU並の応答速度をセルに要求するなら知らんけど。 銀行にはデータセンターがあって、機械で文字識別に失敗したものが、処理される
3人の職員が、画像を見ながら、金額を打ち込んで、3人とも同じなら合格
殴り書きの人がいるから。
これは、郵便局でも同じ
スレ違いだけど
その銀行のシステムをExcelで作っているのでなければどうでもいいな
点数 人数 名前
10 0
9
8 3 foo bar moge
7 5 piyo poo
…
こういう感じのn行×3列の表があります。
人数は、その点数を取った人数です。
すみません、途中で投稿してしまいました。
点数 人数 名前
10 0
9 1 hoge
8 4 foo bar moge
7 5 piyo poo…
6 9 …
…
こういう感じのn行×3列の表があります。
人数は、1列目の点数を取った人の数です。
人数を上から足していって、初めて10を超えた行より上の行の背景色を変える、ということは、
「条件付き書式」で可能でしょうか?
>>22
ここVBAスレだからエクセルのスレで聞いた方がいいのでは。
VBAやってる人間って基本的にエクセルの機能知らなくて、
自分で実装した後にそういう機能がある事知って悶絶するのが普通だし。 >>22
人数の累積が10以上かどうかを示す列を追加したら
こんな感じで出来るんでない?
=OR(AND($D4=0, $D5=1), $D5=0)
D列が累積10以上かどうかの列
0なら10未満、1なら10以上
上の例は5行目に設定した条件付き書式 >>22
俺ならD列には上からの合計人数を出す式を追加して
D列の値が10未満かどうかで条件付き式書式を設定する Sub SetGUID()
'On Error GoTo Err_Check:
Dim ref As Reference
End Sub
でコンパイルエラーが出ました。Referenceをで意義してなとのことです。
Referenceをインポートしなければいけないのでしょうか?
>>22
B列に条件付き書式で
=SUM($B$1:$B1)<10
いけるんじゃね。 皆様ありがとうございます。
累積人数の作業列を用意するやり方でできました。
>>29
何で列を追加する必要がある?
一番上のセルを絶対座標にして下のセルの行番号を相対にすれば各行迄の累積人数取れるじゃん。 ExcelではなくPowerPointのVBAになるのですが、該当するスレがないので質問させてください。
PowerPointのpptxにmsoEmbeddedOLEObjectの形で埋め込まれているエクセルファイル(xls,xlsx両方あり)を、
マクロを使って連続的に(複数埋められている)取り出し、別ファイルに保存したいと考えています。
(大本のファイルの破損のため、埋め込みファイルから復元する必要がある)
zipに拡張子変更して解凍、とすれば取れるのは知っているのですが、ファイル名の対応が取れなくなるため、
マクロ上で番号を付けて保存するのが目的です。
大まかにこのような形になるはず、と、抜き出し直前までの処理を作ったのですが、実際の保存処理について、
いろいろ試したのですがうまくいきませんでした。
PowerPoint上でのVBAマクロはニッチすぎてググっても情報に出くわさず、ましてやデータの抜き出しのような
ものはさらに見当たらない状態で、詰んでしまいました。
どのようにすれば保存できるか、ご教授願えますでしょうか?
For Each oSld In ActivePresentation.Slides
For Each oShp In oSld.Shapes
Select Case oShp.Type
Case msoEmbeddedOLEObject
If (Left(oShp.OLEFormat.ProgID, 5) = "Excel") Then
'ここに処理を入れるはず
End If
End Select
Next
Next
>>35
SaveAsやSaveCopyAsで動かないってことなのかな?
PowerPoint/Excelのバージョンやうまく行かなかった方法とエラー内容書かないとわからないね
正攻法でダメなら新しいExcelブックを作ってコンテンツコピーして保存するとか エクセルVBAの課題ですがコードがわかりません。教えてください
下記がコードになります。
参考書の該当構文はInStrRev関数を使う事になるのですが半角スペースを指定する方法がわかりません
Dim temp As String
Dim pos As Long
Dim vName As String
Dim i As Long
For i = 2 To 6
temp = Cells(i, 2).Value
'半角スペースの位置をInStrRev関数を使用して取得し、変数posに代入する
'「氏名」から「名」のみを取得して変数vNameに代入する
Debug.Print vName
Next
考えたコードは下記でシングルクォテーションの間にスペースを入れればスペースを検索できるかと思ったのですが
エラーになりました。
pos = InStrReV(VPath," ")
ちなみに、B列に氏名、C列にフリガナが入力されています。
>>35
取りあえず出来たけど今PC閉じたんで書き込めない。
PC開ける環境までもう少し待ってくれ。
>>37
良さそうなんだけど、1つ教えてくれ。
VPathって何だ?
コードの中に見あたら無いんだが。
tempとVPathの関係はどうなってる?
と書けばミスに気付くんじゃないかな。 ついでに言うと、そもそもvって何よw
stringなのに。
>>35
PC開ける場所が無いから駅のホームで開けたったわ。
さて、PowerPointでやってみようとしたらマクロの記録って無いんだな。
どうせ、オブジェクトの埋め込みって他でも似たようなもんだろと思ってWordで埋め込みを記録してみた。
で、出来たコード見てPowerPointでも同じようにいけそうと見当を付けてからWord上で今度は埋め込まれたExcelオブジェクトを右クリックメニューから開くのを記録しようと思ったらメニュー表示されなくて記録出来なかった。
で、記録は出来なかったけどWordでも同じようにいけそうと分かったのでWordで埋め込みオブジェクトについてググったら下記が見つかった。
https://support.microsoft.com/ja-jp/help/408493
これを参考に下記の真ん中の文でいける思って実行してみたらブックは出来てたけど開くとシートが表示されない。
表示リボンの再表示ボタン押したら表示されたんで、保存前に表示しとけば良いのかと思って再表示処理のコードをPowerPointにあわせて修正したのが最初の文。
それからシートが表示されてないブックをVBEのプロジェクトエクスプローラで見ると他のブックも表示されてる。
PowerPointに張り付けたExcelオブジェクトは複数で、それらが開いたまま保存すると参照も保存されるようなので保存後に閉じる最後の文の処理を追加して他への影響を回避した。
(開いて保存を繰り返すと後の保存では前に開いて保存後に開いたままになってるのが影響する)
'hogeの後、連番のファイル名で保存
oShp.OLEFormat.Object.Windows(1).Visible = True
oShp.OLEFormat.Object.SaveAs "C:\Users\hoge\Desktop\hoge" & CStr(i) & ".xlsx"
oShp.OLEFormat.Object.Windows(1).Close
i = i + 1 38できました。ありがとうございます。
サンプルコードコピペで何となく打ってたので変数が違ってました。
それ以外の変数は課題の変数名なので、なぜといわれても。
VBAもなかなか難しい
どなたかご存知でしたらご教示ください
ADODBのレコードセットから特定のフィールドを削除するにはどうしたら良いのでしょうか
Set rs = cn.Execute(select * from foo)
rs.Close
rs.Fields.Delete(n)
rs.Open
レコードセットが開いていると Delete メソッドがエラーになるので、いったん Close してから Delete するのですが、再度 Open したときに削除したはずのフィールドが復活してしまいます
起動済みのインターネットエクスプローラを操作する上手い方法ありますか?
そら、Recordset 消してるだけだしな 毎回Recordset 消してどうしたいねん っていう
Save せんでええのんか っていう
select * なんてせずに使いたい行だけselect するってのはダメなんかい
>>45
Save メソッドですか?
Recordset をファイルまたは Stream オブジェクトに保存します。
とMSDNに書いてあるから、やりたいこととは少し違う気がします
とはいえ、削除をコミットしたいという感覚は間違いありません
>>46
>>42のSQLはあくまでサンプルですが、SQL文そのものはインプットなので、編集はできない状態だと考えていただきたいです
その上で結果のレコードセットを編集して出力することを考えています >>52
レコードセットから列を削除したいのです
やりたいことはこんな感じです
'1.クエリの実行
Set rs = cn.Execute("select A,B,C from foo")
'2.レコードセットから列Bを削除する
rs.Fields.Delete("B")
'3.残った列A,CをA1セル起点に貼り付ける
Range("A1").CopyFromRecordset rs
このとき、Fields.Delete メソッドはレコードセットが開いているとエラーになってしまいます
なので、>>42のように前後にClose、Openで挟んだのですが、Open実行時に削除したはずの列が復活してしまいます >>53
> レコードセットから列を削除したいのです
取得しなきゃいいだけだろ...
'1.クエリの実行
> Set rs = cn.Execute("select A,C from foo") >>54
>>49でSQLは編集出来ないということらしい。
なんか、物凄く特殊なことしてるね。
レコード数から2次元配列作って1件ずつ入れてくといった泥臭い方法ぐらいしか無いんかね。 >>53
3貼り付けがAとCだけにすれば2は要らないのでは? 初めからBをselectしなければ良いだけだけど、それが無理なら
張りつけてからB列消せば良いんじゃね
>>55
> SQLは編集出来ないということらしい。
ああ、なるほど見落としてたわ
なら俺も泥臭い方法かSQLをパースして特定の列を抜いたSQLを組み立てるとかのトリッキーな方法しか思い付かんわ みなさんレスありがとうございます
>>55
やっぱりそうするしかないのでしょうかね
いったん配列に落とすとセルに貼り付けた時データ型やレコード数なども気にしなきゃならなくなるので、できればレコードセットのままなんとかしたいのですが…
>>57
そうなんだろうけど、CopyFromRecordsetだと全フィールド張り付いてしまいます
ループで1セルずつ貼り付けて行くと、>>55の言うような「泥臭い方法」と変わらなくなってしまいます
>>58
なるほど、レコードセットでどうにかできなければそれが一番いい方法かもしれません
>>60
それも考えましたが、rs2に複製の際にエラーが出てしまいました
今は手元に環境がないので、エラーの内容についてはまたの機会にします
>>61
SQLは select * になるかもしれないし、予想がつきません どういうSQLが来るかも分からないのに特定の列を消す必要があるという事だけは分かるのか
文章の中から下みたいな文字列(URL)だけを削除するにはどうしたら良いんだろか。
http://2ちゃん.com/test/20170123456789
数字の部分がうまく処理できない。 >>64
正規表現を使うといいかもです
スマホで手打ちしてるんで細かい部分で間違いがあるかもしれませんが、イメージはこんな感じです
(特にスラッシュのエスケープとか)
Dim strOrg as Sting
Dim strNew as Sting
strOrg = ※文章を代入
With CreateObject("VBScript.RegExp")
.Pattern = "http:////.*$"
.IgnoreCase = True
.Global = True
strNew = .Relpace(strOrg, "")
End With コンパイルエラー:subまたはfunctionが定義されていませんと出ます。
Callされる関数の引数に問題があるのかと思うのですが、原因が分かりません。
Call ShowInIE(ie, "http://www.vba-ie.net/", , 0, 0, 700, 200)
で
Sub ShowInIE(ie As InternetExplorer,
url As String,
Optional viewFlg = True,
top As Integer,
left As Integer,
width As Integer,
height As Integer)
を設定して渡すで良いのでしょうか?
http://pastebin.com/aJLAUnfc 「vba subまたはfunctionが定義されていません」で検索!
てか破り方誰でもわかるセキュリティなんて何もしてねえのと同じだ
目からウ●コが落ちた
>>66
・1行の文を途中で改行する際の末尾アンダーバー( _ )を付け忘れている。
・Optional を付けたらそれ以降の引数もすべてOptional じゃないといけない >>68
ない
MSですら公式に「間違って変更しないためのパスワードであり、セキュリティ云々ではない」と言ってる
ソースはどっか行った 「ない」ってあんたそんなズバリと(^ ^;
APIのエキスパートなら自分でどうとでもするだろうけど
人に聞いて知ってるような方法はないってことですね
しょーがないか
>>68
パスワードの文字数を多くするとか
記号を使うとか文字の種類を多くする そういう問題じゃないんで・・
パスワードを解析するんじゃなく、記録してるとこからそれ自体引っ張り出して
解除させちゃうマクロらしいから、パスワードの複雑さ関係がないんで
まず使い方が間違ってる
Excelのパスワードの目的は秘密を守るためじゃなくて、
素人がマクロやシートをうっかり改変して業務に支障を来すのを防ぐのが目的と言われてる
簡単に破れる方法であっても、意図的な操作がなければ破られることはないんで、目的は達成できている
まあパスワードかけるなら出来合いじゃなくて
プログラマのハシクレなら自分でそんくらい作れってことかね
他人をあてにするもんじゃないっすね
一体どういう目的でパスワードかけるんだろう。実装をどうしても隠したいとかでなけりゃ破られても構わんだろ。
社内で使ってるけど皆が改変して収拾がつかなくなって管理出来なくなるのを防ぐとかだったな。
前に見たパスワード掛けてたとこは。
MSの公式見解だとパスワードはワークグループを分けて誤操作を防ぐ為のものであって、セキュリティ性は無いとされているね。
一応、VBAはバイナリファイルを読み書き出来るから、自分で暗号化技術調べてAES的な暗号化ファイルとか生成出来るぞ。
でも苦労して実装しても運用する奴らが素人だと暗号化した意味が無くなるから作り損だぞ。
ソフト名忘れたけどVectorにあるExcelアドインで>>68の手法が失敗するやつあったな >>83
しかし、LibreOfficeのCalcからならあっさり見えてしまうんだな。
見えるからコピペし放題 >>83
ほおそれは興味深いですねえ
探してみます >>85
そんなんで解決できるなら誰も苦労せんわ
「何もやってないのに勝手におかしくなった」は聞き飽きた 「何もやってないのに勝手におかしくなった」
これ一番イラッと来るよな
「パソコンが壊れたー(フリーズしてるだけ)」
とか。
「改変したい点がある。自分でやるのでパスワードを教えてください。」と
直球で要望が来たらどうするの?
チーム開発でも修正ルールがあるし
会社のシステムを書き換えるには上司の許可いるだろ
>>89
そいつ用にパスワード外して送ればいいんじゃね
もちろん改変後の質問は受けない >>89
普通の会社では許可しない
規定のフォーマットで要望書をシステム課に出せ >>91
vbaには無い。
こういうのは一般事務の女の子向けに男がヘラヘラ書いたもの、ってかvbaが安易に書き換えられる仕様は常識
会社の基幹システムはもちろん無理だけどね
変更許可は絶対に降りない。然るべき手続きが必要 >>94
基幹に近い所でVBAが動いてるうちの会社みたいなところもあるんやで
一部上場でテレビCMもガンガン流してて誰でも知ってる大企業
入力ミスをなくすためにワークシートにロックかけて入力から印刷までフォームなしのVBAで組んである
モッサリでめっちゃ使いにくいシステムで見積書とか作らされてる
下っ端の俺にはどうしようもない >>95
世間知らずでスマンかった…
ご愁傷様なのだ 売り上げ金額が合わなかったので勝手に書き換えておきましたとかやってんのか?
知らない人がいつの間にか勝手に書き換えてましたじゃ駄目だろ
>>97
それ現場、現場の人間はマクロを触る能力なんかない
現場では調整用貯金箱とか作って、金が多かった日は貯金、少なかった日はそこから取り崩しとかやる 後は、客はパスワード解除しないだろう、出来ないだろうという前提でパスワード掛けてたことも有ったな。
客の別の部署の奴がプログラムの仕組みが見れては困るという要望に対して。
そういう案件の場合はExcelでやらずにちゃんとシステム組むべきという俺の指摘は営業的事情により却下されたな。
客がそんなに金使いたく無いんだとよ。
>>94
それやって収拾がつかなくなって、ちゃんと管理しましょうという話になってパスワード掛けることになる。 Range("J5:J12").Value = "AVERAGE (RC[-7]:RC[-2])"
これどういう意味ですか?
エクセルVBAの課題ですが分かりません。
Dim Target As Range
Dim temp As String
For Each Target In Range("C2:C6")
'セルの値をすべて全角に置換して変数tempに代入する。変換する文字列は、Valueプロパティを使って取得する
temp = StrConv(Target.Value, vbUpperCase) ←
'置換後の値の全角スペースを半角スペースに変換し、元のセルに入力する
Range("C2:C6") = temp ←
Next
End Sub
元の値は半角カタカナで別の名前が各セルの記入されています。
矢印の個所が参考書を元に記述しました。
>>103
こうじゃないの?
Range("J5:J12").FormulaR1C1 = "=AVERAGE(RC[-7]:RC[-2])"
範囲上のセルに数式を入力する >>105
何が分からんのか具体的に
後多分コードが間違っている
Sub a()
For Each target In Range("C2:C6")
'セルの値をすべて全角に置換して変数tempに代入する。変換する文字列は、Valueプロパティを使って取得する
temp = StrConv(target.Value, vbUpperCase)
'置換後の値の全角スペースを半角スペースに変換し、元のセルに入力する
target.Value = temp
Next
End Sub >>104
右辺は単なる文字列です
セルにそういう「数式みたいな」文字列が入るだけ というか、どうしても解除されたくなかったらxllアドインとかにすべきでしょ。
>>107
ああ、それ俺も買ったけど良かったよ。VBEを開こうとすると途端にエラーが出るので
大抵は諦めるね。俺はそれに加えてvbeのフォントを白にして嫁ないようにした。 >>105
何がわからないのか全然わからない
そのソースコードを実行するとどうなるのか、期待値は何なのか書かないと
まあ、ひとまず temp を配列にしないとダメじゃない?
Dim temp() As String
Dim i As Integer
Redim temp(Range("C2:C6").Rows.Count)
i=0
For Each Target In Range("C2:C6")
temp(i) = StrConv(Target.Value, vbUpperCase)
i = i + 1
Next
Range("C2:C6") = temp >>115
1セルずつループして処理すればtempを配列にする必要なんてない
どうでもいいけど、全角はvbWideじゃないのかね
全角スペースを半角にするのはReplaceあたり使えば良いんじゃね
課題ならその課題出した奴に聞けよと思うが >>115
速度稼ぐために配列にしてるなら読み出し側もやるべき >>105
矢印の業務が空行の状態が問題文、矢印の行は君が書いた、と解釈した。
矢印1行目は、vbuppercaseじゃなくて、vbwide。uppercaseは大文字だ。
2行目は、target=temp
そういう問題じゃないようだが、高速化するなら、
Rangeを配列に代入
配列内で計算
配列をrangeに書き戻し
する。 >>119
(誤)矢印の業務
(正)矢印の行
スマン なんで君らは
>置換後の値の全角スペースを半角スペースに変換し
は放置なの?
>>121
質問の仕方が悪いから、だな。
では>>119の2行目を
target=replace(temp, "◻︎", " ")
# ◻︎は全角スペースと読んでくれ
に変更。 target=replace(temp, "全角スペースと読んでくれ", " ")
3万行前後ある列のデータの隣セルに、別シート5000行前後の列から、if条件に該当したものをループで貼り付ける処理をしているけど処理が遅い
3万行の列が外側ループi、5000行の列が内側ループjで回してる
処理時間短縮の為に、最初にiとjのデータを配列で取得して比較を行い
該当するものをセルに出力するように変更した結果、配列使用前より処理時間が短くなった
もっと処理時間を早くするにはどうすればいいかお知恵をください
>>124
5000がユニークデータなら
コレクション >>124
別シート5000をディクショナリーに放り込んで、引いてくれば良いんでない?その手の話で高速化したいなら二重ループはナンセンス。 >>124
条件と出力形式が分からないからハッキリとは言えないけど、
もし該当したものを都度吐き出しているなら、結果自体を配列にして最後に吐き出す様に直すと早くなるはず。 >>125-126
ありがとうございます!
なるほど、コレクションかディクショナリーで連想配列を使用すれば早いってことか
イマイチ使い方が分からず使用していなかった
大量にデータを処理する場合は活用すれば、処理が早くなる可能性があるって事なんですね
今後は意識して使わせていただきます
>>127
ありがとうございます!
今のコードは ifがTrue時にその都度セルに出力するコードです。
if 配列A(i)=配列B(j) then
worksheets(出力先シート)cells(i,出力先列)=配列B(j)
end if
結果自体を配列にするというのこういう処理でいいでしょうか?
結果を取得する配列Cを宣言
if 配列A(i)=配列B(j) then
配列C(i)=配列B(j)
end if
この後の処理は、配列C(i)の値をループでシートに出力する以下の処理でしょうか?
worksheets(出力先シート)cells(i,出力先列)=配列C(i)
>>128
ありがとうございます!
これは普通のキーワードでネットで調べてもヒットした記憶がないワードです
今後に活用させていただきます ハッシュテーブルはハッシュの算出方法で変わるからな
対象データに対して衝突が少なくて計算の軽いハッシュ関数じゃないと
>>129
配列とセルは相互に直接的なやりとりが出来るんで調べてみて。
いちいちループ回さなくていいから。
簡単に言えば
Dim A As Variant
A = Range(範囲).Cells
とすれば配列Aに範囲の中身が入り、
Range(範囲) = A
とすれば配列Aの中身が範囲に入る。 ネットでエクセルVBAを勉強中なんですがオススメ参考本とかないでか?
特にユーザーフォームを使って作業が多いです。
>>124
条件の内容にもよるけど、ワークシート関数のvlookupは使えないの? >>133
横からすまん。試してみりゃいいんだろうけど...
vlookup(ワークシート関数)って、マクロから使うメリットがあるほど速いの? >>134
試せよw
って言いたけど昔試験したから教えるわ
実はvlookupは参照範囲を広くしなければかなり早い
ただ2003の頃の話だから、今はどうかしらん たかがソフト買うのに個人情報を洗いざらい要求してくるセキュリティ企業って・・・
なんで俺の住所や電話番号がいるんだよ。なんに使う気だ
しかもダウンロードしようとしたら送ってきたパスワード
そっくりコピペなのにエラー出るじゃねえか
大丈夫かここ
会社紹介を見る限りまともじゃなさそう
ツールの中身も海外フォーラムに載ってるソースコピペしてたりしてな
標準のワークシート関数ってVBAで作ってある上に、色々な目的に使えるように冗長性があるから、
目的に対して最も効率的な処理方法であるという条件下だと処理時間は必ず
ワークシート関数 ≧ VBAマクロ
が成り立つ。
特にVLookupとかはセル毎に走査してるから共有可能な部分も個別に計算してるんで効率面はお察し。
ただしワークシート関数とほぼ同じ機能をVBAマクロで実装するのが時間の無駄って事もあるので、
マクロ内でワークシート関数を利用するという状況を考えるのは難しくない。
>>136
ありがとう。
なんか>>139の言う(汎用|冗長)性による低速処理の懸念があって、あまりワークシート関数を使う事考えないんだよね。 お前らが書いた腐ったvbaコードよりワークシート関数が遅いとかw
どんだけ頭がお花畑なんだよw
ワークシート関数は条件さえ整えばマルチスレッドで動くぞ
確実にVBAより早いわ
>>141,142
例えば、>>124の質問内容を試しに書いて動かしてみたら、90msecで終わった。これを「vlookup使えばもっと早くなる」と言われても、「別にこれ以上早くなくていいし」って感じ。 例えばこんな感じ?
Dim Temp (30000,1)
For i=0 To 30000
Temp(i,1)=Application.WorkSheetFunction.Vlookup(Sheet1.Cells(i,1),Sheet2.Range("A:A"),1,False)
Next
Sheet1.Range("B1:B30000)=Temp
10000×1000で試してみたけど、>>131を二重ループで回した場合5秒かかってたところが、 このvlookupは1秒でできた。
ちなみにExcel2002(職場のクソマシン)だから、また今は違うのかもしれないけど。 >>145
うーん、
Sub test1()
Dim Temp(1 To 30000, 1 To 1)
For i = 1 To 30000
Temp(i, 1) = WorksheetFunction.VLookup(Worksheets(1).Cells(i, 1), Sheet2.Range("A:A"), 1, False)
Next
Worksheets(1).Range("B1:B30000") = Temp
End Sub
Sub test2()
Dim d As Dictionary: Set d = New Dictionary
b = Sheet2.Range("A1:A5000").Value
For Each c In b
If Not d.Exists(c) Then d.Add c, c
Next
a = Sheet1.Range("A1:B30000").Value
For i = 1 To 30000
If d.Exists(a(i, 1)) Then a(i, 2) = d(a(i, 1))
Next
Sheet1.Range("A1:B30000") = a
End Sub
この二つだとtest2の方が早い。といっても数字を周期的に並べただけだし、test1の方はヒットしない数字があるとエラー吐く。
もっとフェアなデータでやれば話は違ってくるかもしれないけど、この例だとワークシート関数の方が遅いね。 おまえら>>128にパフォーマンステストの結果が載ってるのになぜ見ない
[lookupテーブル件数:200k, lookup回数:25kの結果]
- VLOOKUP: 11.97sec
- VBA Dictionary: 0.45sec (※Dictionaryの生成時間は含まない)
- DOUBLE TRUE VLOOKUP: 0.05sec
VLOOKUPで最後のオプションをFALSEにするとリニアサーチだから遅い
TRUEにするとバイナリサーチだから速い O(N)とO(log N)の違い
ただ見つからない場合に不都合が出るからそれを解決するためのDOUBLE TRUE VLOOKUP
同じリニアサーチでもVLOOKUPが単純な二重ループより数倍速いのはC/C++使って最適化してるから >>147
なるほどー
これは速い
勉強になった
>>124
余談だけど、こんなやり方もどうぞ
コード量は少なさなら一番
速度は>>147の方が速かったけど
Range("A1:A30000")="vlookup(Sheet!A1,Sheet2!A:A,1,false"
Range("A1:A30000").value=Range("A1:A30000").value
2行目は式を消してる >>149
ごめん、いろいろとおかしかった
Range("B1:B30000")="vlookup(Sheet1!A1,Sheet2!A:A,1,false"
Range("B1:B30000").value=Range("B1:B30000").value ほんとグダグダで申し訳ない
しばらくROMります…
Range("B1:B30000")="=vlookup(Sheet1!A1,Sheet2!A:A,1,false"
Range("B1:B30000").value=Range("B1:B30000").value
>>147
あー
> b = Sheet2.Range("A1:A5000").Value
でvalue(のみ)を配列につっこめるんか、あー
ありがとう(・ω・)ノ >>124で処理時間高速化の質問させてもらった者です
>>131
ありがとうございます!
このスレの内容にあるようにセルを配列に入れてから、if文は配列同士で比較して、結果も配列で取得するように修正しました
配列の値を、一度にセル範囲に出力するコードに修正したら8分前後かかっていた処理が、1分〜2分前後になって、処理時間がめちゃめちゃ早くなって快適になりました
みなさんが言われてるように、VBAでワークシート関数を使用した場合の処理時間は、
おなじみオフィス田中さんのページに、配列をセル範囲に出力するのと同じぐらいの処理時間が高速だと書いてありますね
3万行と比較する列データが、複数シートで複数列だったので、次回同じような処理を作成する時は
VLOOKUP用の一時シートを追加して、3万行の列を一番左の列の検索キーにして、比較列はVLOOKUPで取得する実装をしてみます >>153
分単位はかかり過ぎだと思うなぁ。
データや環境の違いがあるから、純粋に比較はできんだろうが、124の内容を素直に読んでコード書いて動かして見たが、100msecかからんかったよ。
ちな、
3万行のデータを配列1に丸ごと代入
5千行のデータを配列2に丸ごと代入
配列2から辞書を作成
配列1を先頭から順に見て、辞書に存在しない値を消す
3万行データの隣に配列1を丸ごと貼る VBAにも新規参入者がいて20年くらい前の話題が新たになされるのにちょっと感動した
Windows10のアップデートでIEオブジェクトの挙動がまた変わったらしい?
データ収集とかしてる人はアップデートしない方がいいかも
この期にIEオブジェクトをわざわさ生成するやり方はやめたらいいと思う
>>157
EdgeではなくIEの挙動が変わったのか?
にわかには信じかたいが。 あるシートに所属するプロシージャから
自分の所属するシートを参照するにはどうしたらいいのでしょうか?
プロシージャを他のシートにコピペしたら
コードを書き換えなくてもコピペ先のシートを参照するようなコードを
書きたいのですが
>>162
シートモジュールは、その中で完結する処理を書く場所なので、
シートを飛び越えた処理を行いたいなら標準モジュールに書くべき。 >>163
いや、むしろシートを飛び越えないでほしいんですが
シートで完結した処理にしたいのでシート名や番号による
シートの指定を排除して、所属するシートのセルを参照したいのですが
検索して調べるとセルを参照する方法としては
シート名を決め打ちする方法ばかりが出てくるので困っているのです Active Sheet とSheet名以外でSheet 特定できるんだっけ?
application.callerでチェックボックスの動きの判定をするようにしたらメチャ重いんだが、これなんとかならない?
>>162
Sub foo()
Debug.Print Me.Name
End Sub
何故かthisworksheetは存在しない
Meを使う セルはもちろんこんな感じね
Sub foo()
Debug.Print Me.Cells(1, 1)
End Sub
>>169
なるほどイベント抑止か。
ありがとう、やってみる >>164
シートモジュールに直書きする場合はSheetsの部分を省略してCellsやRangeから書ける。
シートを指定しない場合の振る舞いが、
標準モジュールではActiveSheet(見えているシート)だったものが、
シートモジュールではそのシートに限定されるという変化をするので併用する場合は注意が必要。 標準モジュールに書いて、対象シートはsetした方がいいと思うけどなぁ
>>167
ありがとうございます。
まさに求めていた回答です。Meとは気づきませんでした。 >>169
うへえ。
確かにそれは効果が高いが、それだけでOKとか、どんだけレベル低いんだ?
むしろ速度を意識したプログラム書いてる奴にとってはそれやっても速度なんて変わらんのだが。 それで駄目ならマルチプロセスにする。
適用出来ないことも多いけどな。
objEx1=CreateObject("Excel.Application")
を複数作ってそれぞれに独立した計算をさせる。
>>176
ありがとう、ここまで出来るとは思わなかった
他にも関数で高速化極めてて驚いたわ
良いものを見れた シート作ったりセルに書き込んだりというエクセル側の操作をすると、
その度にイベントが走ることになるから、これを如何に抑えるかってのが重要なんだけど、
最初から全部覚えようとするとパンクする。
どんだけ頑張ってコード書いても、大量の演算は結局ピボットの方が高速なんだよな
For i = Lbound(X) to Ubound(X)
a = MATCH関数でXを検証
if XとMATCH関数が一致 Then
For j = Lbound(Z,2) to Ubound(Z,2)
Z(k,j) = cells(a,j-1).value
k = k + 1
next j
end if
Debug.print i
Next i
Xは要素が3万ほど
シートの列数も3万ほどでXと同じ値を格納
シートの列数は50程度
これでDebug.printの表示感覚が1秒ごとくらいなんだけど遅いですか?
30000 * 50 = 150000ループ
実に8時間ほどで納得行かない遅さなんです
>>181
ファイルを上げてくれないか
実際に試してみないと分からん >>181
そのコードの処理を見る限り、早くする方法はいくらでもあるけど、
処理がくっそ遅いMatch関数使って何かやってるんだから処理速度的にはそんなもんじゃないの。 何をするプログラムなのか最初に書いてくれないと、どこを観点に見ればいいかわからない
まあ、とにかくRangeを二重ループで触っちゃイカンよ
つーか、>>124と同じ課題か? >>182
仕事用なんですいません…
>>183
MATCH関数遅いんですか?
元は3万行のシート回してたけどそれも遅かったんでMATCH関数使ったんですが MATCHもmatch_typeに1か-1を指定した時はバイナリサーチだから遅くないよ
0を指定してるとリニアサーチだから件数に比例して遅くなる
>>186
駆け出しのマです
>>187
少ない件数なら激早なんですけど多いと影響あるんですね
仕事だから検証に時間さくわけにもいかないけど納得行かないんですよね
連休に試してみますね >>189
上司に聞いてみたら?恒久的に超早くなりそうなんで何時間か遊ばせてもらえませんかって
家でも研究中といえば良い
俺が上司なら、ルーチンワークは最優先で効率化させるけどな 仕事でプログラマやってんなら、それこそ会社に理解があろうがなかろうが検証時間取れないなんて事はないだろう。
どっちにしろ>>124と条件が被ってるんで>>147のtest2を参考に作り直せば速度的にはどうにかなるんじゃないの。 >>172
オブジェクト変数多用は速度低下の一因になるぞ 表示シートのセルA1に『SD11』と入力してからコマンドボタン1を押したらマスターシートのA列をFINDで検索かけて下に一行ずつ表示シートの項目別にそれぞれ転記するにはどうすればいいですか?
検索まで出きるんですが、転記とループのやり方が分かりません。
>>197
たぶんこれ、マスターシート?の一行目が項目になっている事から、
編集→テーブルでテーブル化してフィルタで絞ってコピペした方が早いんじゃないの。
種類の所だけ
Sub foo()
For Each x In Range("A1:A12")
if Len(x.Value) Then y = x.Value Else x.Value = y
Next
End Sub
みたいな形で空白を埋めるようにして。 どっちがマスターシートかすらわからないのは俺だけなのか?
>>201
父をたずねて三千里の旅に出るよ...
昆虫記 excel2010使ってます。
apiを使ってアプリケーション外の任意の座標のピクセル情報を監視していますが、視覚的に監視している場所がわからないので、当該場所にbitmapを最前面に描画したいのですが、良い方法はないでしょうか?
あるいは、マウスのカーソルをその位置に描画する。とかも考えています。
>>204
WIndow作ってWM_PAINTで描画(GDI/GDI+)
Excelで直接やらなくてもいい気がするけど >>206
昔、そういうプログラム書いてたな。
CreateCompatibleDCとか。
GDI+はステータスバーの数字を取得する為に使ったことがある。
よくあるウインドウハンドルから取得する方法やUIAutomation使う方法で取得出来なかったんで直接Bitbltかなんかで描画してるとしか思えなかった時に。 vbaでpdfをこのようにバイナリ変換?して仕事で使うサイトにpostしたいのですがどうすれば変換できますか?
(普通のブラウザで送信した際の通信データを出力したもの)
ググった結果出てきたバイナリ変換?は2種類試しましたが↓変換はされるのですが形式が違うのか上手くいきませんでした(文字化けの感じも違いました)
strfilenameにはpdfのフルパスが入ります
Function GetFile2(strFileName As String) As String
Dim strFile As String
Dim nFile
' Grap the file
nFile = FreeFile
' Open strFileName For Binary As #nFile
Open strFileName For Binary As #nFile
strFile = String(LOF(nFile), " ")
Get #nFile, , strFile
Close #nFile
GetFile = strFile
End Function
Function GetFile(strFileName As String) As String
Dim FileContents() As Byte, FileNumber As Integer
ReDim FileContents(FileLen(strFileName) - 1)
FileNumber = FreeFile
Open strFileName For Binary As FileNumber
Get FileNumber, , FileContents
Close FileNumber
GetFile = StrConv(FileContents, vbUnicode)
End Function >>208
pdfは元々バイナリファイル
それをテキストエディタで開けばその画像みたいになる
エディタで開く時のエンコーディングが違えば文字化けの見た目も変わる
postするときになんで変換しないといけないの? >>209
普段のブラウザでpdfを投稿した際のpostデータを解析したらpostしているデータの中でpdfを>>208の画像の形で投稿していたので
excelで投稿する際も自分のpcにあるpdfをテキスト状に?変換してpostするものだと思いました
自分としてもファイルのフルパスだけ指定して投稿できたら楽だとは思うのですが・・・ そしてこれが>>208のマクロでpdfを変換してvbaから投稿した時のpostしているデータです
明らかに文字化けの雰囲気が違うこれだと投稿したpdfを開こうとしても「画像データに不足があります」と出てpdfが開けません
postデータは同じツールで表示していますのでvbaでの変換の方法に問題があるのかと思ってます
>>208の画像がこの画像と違ってどういう形式?なのか分かれば調べようもあると思うのですがいかがでしょうか >>212
前にそちらのサイトも参考にさせて頂いて、投稿はできたのですがpdfが開けなくて、
送信データももっとひどい文字化けになってしまい諦めてました
unicodeで送信しているのを調整する必要があると書かれていたのですがそれが原因でしょうか・・・
ちなみに自分の使い方としてはそのサイトのようにグループウェアのキャビネットに投稿する形では無く、
仕事で使っているサイトのフォームで投稿する際に添付ファイルとしてpdfを付けるのが目的なのですが
下の方に書いてあるのはSet objIE = CreateObject("Internetexplorer.Application") 的なIEに直接vbaでsubmitさせるメソッドの事でしょうか?
今のところ、投稿する際にプルダウンや入力フォームで様々な値を入力しなければならなくて、
添付ファイルが無い状態での投稿は問題無く行えるようになったのですが
添付ファイルだけはどうにも壊れてしまうというのが現状なので何とかpdfもこのままpostできないかなぁ・・・というのが現状です
説明が下手で申し訳ないのですがどなたかアドバイス頂けたらと思います セルB4から始めて、右に8列‘’○‘’を順番に書き込んでからB5に下がってまた8列書き込む。それを10行繰り返すにはどういうコードになります?
>>214
Forで二重ループ
Cells(5, 2)から始めて必要な列数だけ○を書き込む処理を10行分行うだけ >>215
Cells(5, 2)から始めて→Cells(4, 2)から始めて ネットワーク上のフォルダにファイルを保存する時、
初回時のみ若干保存に時間がかかります。
一度実行したあとにすぐ実行すると、
既にネットワーク接続が確立しているからなのか、比較的早く保存できます。
保存は普通にsaveasで、UNCパスで保存しているのですが、
この初回保存時に時間がかからずに保存できる方法ないでしょうか。
>>214
「セルB4から始めて、右に8列‘’○‘’を順番に書き込んでからB5に下がってまた8列書き込む。それを10行繰り返す」コード。 >>217
VBAの問題じゃなくてネットワークやSMBプロトコルの問題じゃないかなあ。
或いは名前解決問題も含んでいるとか。 >>219
全部"○"なの?
Range(B4:I13).Value="○"
じゃ駄目なの?
シート2で選択した人の時間データをシート1からシート2の各セルにコピペしたいです
イベントプロシージャで名前変更時にマクロ起動は出来ました
名前検索&シートを跨いだコピペがどうしても出来ないのでご助力下さい >>222
Accessでデータ管理してSQLで取り出すのが一番苦労がないと思うんだが。 >>222
普通にVLOOKUPで引っ張ってくれば
マクロは必要ないのではなかろうか。
どうしてもVBAでやりたいなら
WorksheetFunction.Matchで検索してみよう。
シート間コピペはRangeの前にワークシートオブジェクトを指定すればできます。
範囲でやる場合はValueを書かないとだめです。
Worksheets("シート2").Range("*:*").Value = Worksheets("シート1").Range("*:*").Value
実際には決め打ちじゃなくてCellsで検索結果に応じて可変にすればよいでしょう。 >>221
実際には別シートの値をみて条件付けてYESなら右に一個ずつ値を引っ張りたいだけです。 >>222ですがコピペ記述できました助言ありがとうございました
Sub
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim name As String
Dim r As Variant
Set ws1 = Worksheets("シート1")
Set ws2 = Worksheets("シート2")
name = Worksheets("シート2").Range("*").Value
r = Application.WorksheetFunction.Match(name, Worksheets("シート1").Columns("a"), 0)
Application.ScreenUpdating = False
ws1.Activate
ws1.Cells(r, 4).Select
Selection.Resize(1,6).Select
Selection.Copy
ws2.Range("a6:a11").PasteSpecial (xlPasteValues)
Application.ScreenUpdating = True
End Sub
シート切り替え時の画面ちらつきを消すために見よう見まねでScreenUpdatingを入れました
期待通りの動きをしてくれてますがもっと上手い記述を参考程度に教えていただきたいです
VLOOKUPだと直接セルに入力する場合があってその時困るのでVBAでやってみようと思った次第です
ACCESSは諸事情で使えません この小汚いコードなんとかなりませんか?
>>227
まず写真じゃなくてプリントスクリーンで >>226
たぶんマクロ記録を改造しているんだと思いますが
Select、Activateはする必要なく
転記処理は
ws2.Range("a6:f6").Value = ws1.Range(ws1.Cells(r,4),ws1.Cells(r,9)).Value
この1行だけでいけるはず。
=の右辺と左辺が同じ大きさの範囲である必要あり。
範囲は実際のシートのに書き換えてお試しを。 >>228
パソコンのネットがゴミ過ぎてパソコンからは書き込めないんです... >>227
応用シートを変数に突っ込む
WithにRange指定まで突っ込む
RangeをCellsにして列参照を変数にする
オフセットの数値を変数にする
これでループで変数をインクリメントしていけばスッキリしそう。 >>227
Sub foo()
Str_NowRng = FindRange.Offset(0, 1).Address
Str_ShuName = FindRange.Offset(0, 1).Value
Set 基礎 = Worksheets("基礎")
Set 応用 = Worksheets("応用")
i = 4
Do While Str_ShuName = "A"
For j = 1 To 5
応用.Cells(i, j + 1).Value = 基礎.Range(Str_NowRng).Offset(0, j).Value
If j = 3 Then 応用.Cells(i, j + 1).Value = 応用.Cells(i, j + 1).Value + Val(MSUN)
Next
With 基礎.Range(Str_NowRng).Offset(1, 0)
Str_ShuName = .Value
Str_NowRng = .Address
End With
Loop
End Sub
設計が腐ってる臭いがするので、小手先直したところで意味ないと思うけど。 >>229
うおおおおおお
その1行だけで動きました
ありがとうございます
マクロ記録ではなくググった記述の真似ですが検索が下手だったみたいです userform2のcaptionをそのままuserform8のcaptionに代入使用しています。
型が一致しませんのエラーが出ます。
先ほどまで問題なく動いていたのですが、突然出るようになりました。
UserForm8.Caption = UserForm2.Caption
や
Dim FormName as string
FormName = UserForm2.Caption
Userform8.Caption = FormName
でもエラーが出てしまいます・・・。
>>234
何でそんなことやってるか知らんけど…
標準モジュールに書いたら動いた
Sub foo()
UserForm1.Caption = UserForm2.Caption
End Sub
とりあえずイミディエイトウィンドウやウオッチ士気で、
UserForm2.Caption
に何が入ってるか見てみたら? Str_NowRng=FindRange.Offset(0,1).address
Str_ShuName=FindRange.Offset(0,1).Value
With Worksheets(〃基礎〃)
i=4
Do While Str_ShuName=〃A〃
Worksheets(〃応用〃).Range(〃B〃&i).Value=.Range(〃Str_NowRng〃).Offset(0,1).Value
Worksheets(〃応用〃).Range(〃C〃&i).Value=.Range(〃Str_NowRng〃).Offset(0,2).Value
Worksheets(〃応用〃).Range(〃D〃&i).Value=.Range(〃Str_NowRng〃).Offset(0,3).Value+val(MSun).Value
Worksheets(〃応用〃).Range(〃E〃&i).Value=.Range(〃Str_NowRng〃).Offset(0,4).Value
Worksheets(〃応用〃).Range(〃F〃&i).Value=.Range(〃Str_NowRng〃).Offset(0,5).Value
Str_Name=.Range(〃Str_NowRng〃).Offset(1,0).Value
Str_NowRng=Range(Str_NowRng).Offset(1,0).address
i=i+1
Loop
i=14
Do While Str_ShuName=〃B〃
中身同じ
Loop
i=32
Do While Str_ShuName=〃C〃
中身同じ
Loop
こんな感じです。
パソコン見ながら打ったので間違って打ってたらごめんなさい。
>>232
ありがとうございます。すごい助かります。感謝です! >>235 ありがとうございます。 他のユーザーフォームではできましたので、USERFROM8自体がおかしくなっている?
直前にエクセルが動作停止しました。その際に壊れてしまい、USERFORM8のオブジェクト名を理解できていないようです。
そんなことはありますでしょうか? >>241
さーねぇ。まぁあるかないかならあると思うけど、安易に答えは出さないけど、
どうでもいいマクロならさっさとuserform8消して新しく作り直すほうがいいかもな >>226
>>229の言う通り
ws1.Activate
ws1.Cells(r, 4).Select
Selection.Resize(1,6).Select
Selection.Copy
ws2.Range("a6:a11").PasteSpecial (xlPasteValues)
は
ws1.Cells(r, 4).Resize(1,6).Copy
ws2.Range("a6:a11").PasteSpecial xlPasteValues
でOK。
1行ずつ意味を考えて上達して行こう。
ところで、PasteSpecialの後ってカッコ無しでスペースだよね。 >>227
インデント統一してる?
俺は4つ(標準)にしてるけど、少しでもズレてる所があると気持ち悪い。
こういうコード貰ったらCtrl + A押して、
Shift + Tabを連続20回ぐらい押してしまう。
んで、全ての行のインデント振り直す。
それから、2つのシート使ってるようだけど自分ならそれぞれを変数に入れるな。
1つはWith使ってるから良いとして、もう1つだけでも変数に入れる。
まあ、自分の場合は基本的にブックから省略しないのでWithや変数に入れないと長くなるんだわ。
それからDo While〜Loopの中だけど、Offsetとiの併用してるのは何で?
全部iで書き直したら?
そうすればStr_ShuNameとかStr_NowRngとか必要無くなるよ。
Str_ShuNameの場所もi使って1つずつ下がって行くんでしょ。
Do Whileの条件もi使って表したらStr_ShuNameへの代入も必要無いよね。
それから、Range("B" & i ).Valueって記述だけど、RangeじゃなくてCells使えば列方向もj使って繰り返しが使えるよね。
まあ、真ん中だけ少し違うから恩恵少ないけど。 >>244
sublimnetextとか使ってみてはどうだろう
コピペするだけであら不思議、自動インデント
VBEと連携できたら便利なんだけど、残念ながらできない >>245
自動でやるならmougでsmart indenter紹介してたな。
多分連携できるはず。 >>246
うお、こんな便利なもんあったのか
ありがとう早速試してみる >>221
それはテクニック。質問者は
「セルB4から始めて、右に8列‘’○‘’を順番に書き込んでからB5に下がってまた8列書き込む。それを10行繰り返す」方法を訊いている。 >>248
でも二重ループでセルを回すとか、実際にはやらない、というかむしろやっちゃいけないようなこと質問されてもね >>250
やっちゃいけないってなんだよw
foreach in rangeって言いたいんだろうけど、excelは行列の削除があるから二重ループでいいだろう
セルじゃなければforeachでいいけどな 列数 = 8
行数 = 10
Range("B4").Resize(列数, 行数).Value = "○"
>>248
初心者は設計に問題がある場合が多いわけで。
真面目に回答してもすったもんだして結局>>221が採用されることも多い。
質問の仕方もダメダメな場合が多いから、回答も段々きつくなる。
>>251
すべきじゃ無いのはむしろセル回す方だと思うが。
配列からの一括挿入にすべきだろ。 問題もクソもこういう場合質問者はループを回したいなど微塵も思ってない
無知ゆえに質問の仕方がぎこちないだけだ
教えたがりならそれくらい察しろよ
二重ループってのもある種のテクニックだから、そのやり方を訊いているのかも知れん。for nextでカウンタiとjを使って...とか。
そうでないなら、例えば、同様の効果を得る処理時間の短い方法を知りたいなどと訊くべし。
>>254
それを察したから>>221を書いたんだろ。
したら>>248の突っ込みが入って今に至ると。
それと初心者の場合、無知なんじゃ無くて自分で色々試してみるということをしないが故ということも多い。
動く結果を欲しがり、動く仕組みを自分のものにしない。
質問でRange("K15:O20")などと出てくるだけでガッカリ。
その範囲は今問題になってるお前の表そのものだろと。
結局貰ったコードそのままコピペして使うんだろうなと想像ついちまう。 「何をどうすればいいのか見当がつかない」というのは根本を理解していないが故だしな。
それにVBAはだいたいネット検索すれば解決策が載ってるんで(凡例が少ないという事はあるけど)、
自分で解決してから「こういう方法以外にどのような解法があるか」と聞いてくるのが一番正常なのかもしれないね。
初心者がいるってことは新規参入者がいるってことなので、考えようによってはありがたいことだ。
つべこべ文句言ってねえでお前らなんかに質問してくれるだけ有り難いと思えよ
>>260
内容による
とりあえず内容書いてみればok >>261
B2〜B40までのセルをダブルクリックすると検索ボックスが出てきてE2〜E25までのデータを検索出来るようにしたいです(実際のデータは1500個くらいありますが)
検索ボックスにaと入力するとaを含むデータがリスト化されて出てきて、そのリストをダブルクリックするとBの列にそのデータが貼り付けされる
っていうのを作りたいです
なんで(R1C1形式じゃなくて)A1形式なんだろうなぁ。あれ(A1形式)って感覚的に分かるの?
>>262
とりあえず写真じゃなくスクリーンショットで頼む
モアレになって鬱陶しい
要するにE列を文字列で絞り込んでB列に貼り付けたいってことね
で、考えた
・openイベントでuseformをExcelとは別に動くようにshowする。要するに常時表示させる検索ウィンドウ。モーダルか、モーダレスか忘れた。
・テキストボックスに入力するとB列が次々と変化
1500ぐらいならリアルタイムで変化させても余裕だろう
誰も作って無かったら明日の夜作るよ >>263
分からん。全然分からん。
ただ既存のシートにマクロでclearcontentsする時はA1形式にする事はよくある >>262
GUIいじりはエクセルVBAの守備範囲外だからやめたほうがいい。
リボンを改造して専用のボタンを用意する方法があるので、
そこからフォームを呼び出してツールであるかのように見せるのが限界。 >>265
ありがとうございます
スクショは今は撮れませんが明日できれば撮ります デジカメでモニターを撮影するのだって広義のスクショなんだけど
むしろ初期はカメラをモニターの前に置くしか方法がない場合が大多数だった
変な作り話しなくても、会社とか学校のPCとかで内部データ持ち出せない場合は、
そういう風にするしかないって擁護すればいいんじゃないの。(その場合でも画面の写真撮るのは拙いけど)
>>262
B列のダブルクリックとか設計がよろしくないね。
検索ボックスってのはフォームと推測。
B列への入力ってのは検索したリストの中から選択したものを入力ってことと推測。
以下のようなものを作成してみた。
・[アドイン]リボンの[E列データ作成]を押すとE列に10万行のランダムデータ作成
・[アドイン]リボンの[E列から検索]を押すと検索用フォームを表示
・検索用フォームでテキストボックスに入力してEnterキー押下するとリストボックスに検索結果表示
・リストボックスでダブルクリックするとB列に選択されたセルにダブルクリックした文字列を入力
https://pastebin.com/ye8PZecY >>265,267,271,272
みなさんありがとうございました
色々コピペですがおかげで何とか出来ました >>272
設計がよろしくないねwwww
しゃしゃんな無能w
おめーの設計()の方がよっぽどよろしくないわw
煽りじゃなくてマジもんのクソだっつーのそのUI
しかもコードは小学生の初めてのプログラミングレベルだぞお前 ちなみにこんなのが出来ました
B5をダブルクリックすると画像のように検索フォームが出て来る
フォームにabと入力してエンター押すとabを含んだリストが出て来る
リストのabdをダブルクリックするとB5にabdが貼り付けされて検索フォームが閉じる
↓を参考にしてみたけどRowSourceに値をセットするっていうのがよくわからなかったから空欄にした
http://infith.com/system/excel/vba_form_find/
VBAというかプログラミング初めてなので勉強になりました
みなさまありがとう >>276
乙。よー頑張った
こういう報告は嬉しいもんやね >>274
初心者の人?
今回の質問自体が簡単な部類だけど、それでも俺の書いたコードが非難されるようなものかどうかも区別つかないの?
批判にも具体的な指摘が全く無いし。 >>278
以前から居る病気の人だから構わないであげて
VBAのコードが読めないのに何故かこのスレに張り付いてんのよ >>276
そこのサイトのコードだと毎回下記手順になるんだけどそれでOK?
セルダブルクリック
テキストボックス入力
リストボックスダブルクリック
以下繰り返し
間違って別のセルダブルクリックしたらフォーム閉じなきゃならんし、
連続して入力していくならフォームはモードレスにしてリストボックスのダブルクリックで閉じないようにした方が良い。
セルダブルクリックの中の
frm_Kamoku.Show
を
frm_Kamoku.Show vbModeless
に変更して
リストボックスダブルクリックの中の
Unload Me
をコメントアウトするだけ。
フォーム表示中にリストボックスダブルクリックで入力するセルが選択できるようになる。
フォームの終了はxボタンで。 >>278
初心者の人?wwwwwww
いやw初心者はお前だからw
何をどう勘違いしたらこうもマヌケな発言が出来るのかねw
そもそもお前のクズコードなんぞ批評の土台にすら登っとらんわ
のぼせ上がんのもいい加減にしろクズ >>281
例えばね、>>276のリンク先の人のコ−ドを見ればすぐに、そこそこ書けると分かるのよ。
書ける人ってのはコード見ればその人の力量がすぐ分かるもんなんだ。
>>276のリンク先の人がそこそこ以上かどうかは扱っている内容が初心者向けだから分からないけど一定以上のレベルにあることは分かる。
残念だが、君はとっても恥ずかしい人だ。
というかね、煽るだけで具体的な内容が無い。
どこが悪いか全く言及出来てないのが笑える。 こんな華やかなコメントアウトって使う?
'*********:*********:*********:
' このプログラムはaでbです
'*********:*********:*********:
>>276
自分がよく使う、なんちゃってインクリメンタルサーチコードを差し上げよう。
一文字打つごとに検索結果が絞り込まれるよ。
検索ボックスのChangeイベントにコピペしてオブジェクト名は書き換えて試してみてね。
数百件ならラグもないはず。
Private Sub TextBox1_Change()
Dim ce As Range
Dim ws As Worksheet
Set ws = Worksheets("対象シート")
If TextBox1.Text = "" Then Exit Sub
With ListBox1 ’検索結果を表示するリストボックス
.Clear
For Each ce In ws.Range("検索するセル範囲")
If StrConv(UCase(ce.Text), vbNarrow) Like "*" & StrConv(UCase(TextBox1.Text), vbNarrow) & "*" Then
.AddItem ce.Text
End If
Next
End With
End Sub >>283
???
使う人もいるでしょ。
俺も使う時あるし。
こんなのも使うな
' /////////////////////////////////////////////////////////////////////////////////////
' //#名称 Auto_Open
' //
' //#概要 ブックを開いたときの処理(Excelの特殊関数)
' //
' //#引数 なし
' //
' //#戻値 なし
' //
' //#解説
' //
' //#履歴 2017/09/21
' // Coded by Hogeta Hogeo
' //
' ///////////////////////////////////////////////////////////////////////////////////// >>276
>>280に書いた内容だけど、よく考えたらB列以外にも入力されちまうわ。
元々の処理ではフォーム表示で入力セル固定だけど>>280では固定じゃ無くすので。
リストボックスダブルクリックの処理でアクティブセルに入力するようになってると思うけど、>>280を試すならアクティブセルの列がBの時だけ入力するようにしないといかんね。 >>282
朝から笑わせてもらったw
なぜお前らはそこまで勘違い出来るのか?
勘違いこそが教えたがりクンになれる素養なのか?
大体分かってたけどw
まあお前らが勝手に勘違いしてるだけならいいが
他人に嘘を教えようとしたら盛大に告発させてもらうわw >>285
あぁ、そういう風に使うのか、ありがとう >>287
どこが悪いのか指摘出来ないというのが苦しいね。
批判出来るということは悪い所がわかるということの筈なんだけどな。
悪い所が分かる程の能力は無いけど、取りあえず煽ってみましたってところかな。
ところで君は自分の書いたコード晒したこと有るのかね?
君が俺より出来るなら>>204に答えてあげなよ。
>>204の質問って、ここでは高度な内容になる筈だからさ。
ま、無理だろうけど。 >>293
そもそも、どうしてRowSourceにこだわってんの?
君のやりたいことでは必要無いと思ってたんだが。
RowSourceってのは融通が効かないから自分は基本使わないんだが、エラーになってるとしたらRowSourceとAddItemが共存出来ると思ってるとかかな。
RowSourceはシートの指定範囲のデータをリストにするもので、そこに追加やそこから削除は出来ない。
指定範囲のデータだけでリストは完結することになる。
そこでそのリンク先でも絞り込みの前に.RowSource=""を入れてる。 >>293
RowSourceプロパティに事前に値入れてもエラーにはならんよ。
シート名!A1:A10
とか入れてみなよ。
変数は使えないのは分かるよね。
動く前なんだし。 >>292
批判wwwwww
批評の土台にすら登ってないと何度言えばw
自分の無知無能に蓋をして見たいものしか見てないんだよお前らは
勇気を出して一度自分の無能と真剣に向きあってみ?
頭が悪くても少しは世界が変わるから…何も変わらんかもしれんけどなw >>296
何だ、何も言えるだけの技術的要素を持ってない人か。
具体的な指摘も一切出来ないし、わざわざ>>204の話を振ってやっても何をどうすれば良いかも思い付かないんだろう。
ちなみに俺は3〜4パターンは思い付いてる。
例えば、ビットマップ描画じゃなくても透明ウィンドウに円形リージョン使った輪っかウィンドウ表示するとか。
リージョン使わなくても透明ウィンドウだけで同じようなの作るとか。
ま、何言ってるか分からないだろうけど。 >>298
技術的要素wwwwwww
とことん笑わせてくれるなお前w
相手にされてないのに必死にアピールして虚しくならないのかバカという人種はw
これがお前らの大好きな承認欲求ってやつだろw
他人に認められたかったらまず自分の無知無能を自覚しろよ
話はそこからだ、そうすれば少しは周りも認めてくれるんじゃね?
…あ、バカが居る…てなw >>299
小学生でもお前のレベルは低いと言うことは出来る。
本当に自分の方がレベルが上かを示さなくて良いならな。
それがお前だ。
技術的要素無しであの葡萄は酸っぱいと言ってるキツネのようだ。 本当に、何言ってるか理解出来ないから、振った話には一切言及出来ない。
こういう所でレベルが透けるんだよなあ。
もうなりふり構ってられなくなったなw
いいよその調子w
久しぶりにこのスレ戻ってきたけどまた随分荒れてるね。
まぁどんな手法で作った方が良いかなんてそのときのシュチュエーションで決まるものだから
議論してもあまり意味がないと思うよ。
そんなことより変更に対して厳しく、追加に対しては寛容になるような作りにするような
もっと基本的なことを念頭におくようにした方がより効率的に改修出来たりするよ。
まず>>306が質問でも回答でもない時点で何を言っているんだーおまえわー
自分だけは特別だと思ってる自意識過剰かー
単なるバカなのかー >>308
条件に応じて関数を選択してそれのAddressOf値を返すことはできるから
強いて言えばあると言えばあるね >>306
ぁあ?
だったら昔みたいにガッチガチにルールで縛りつけたスレ立ててそこで1人でやれやボケ ルールで縛らないで良いなら質問と回答以外書き込むなと書くこともアリだろ。
アホなこと書いても良いが、その分そいつが批判されるのも仕方ないということ。
アホな初心者がかつて批判されたことを根にもって相手の力量も分からずに噛みついてるんだから批判されても仕方ない。
>>309
すんません、表現が良くなかったです。
mapとかfoldとかfilterとか、それらに付随してラムダ式とかです。
調べたけどなさそうですね。MSさん、用意して欲しいな、、 >>311
VBAみたいに片手間でやるような言語のスレで
初心者って言われてもなぁ >>313
HaskellでNLPやってて、小回り利くなと感じた。エクセルの事務作業と相性いい。
>315
エクセルのフィルターとまさに同じ、
例えば[10,2,34,401]から偶数を抜きたければ、
filter (\x -> mod x 2 == 0) [10,2,34,401]などとやる。
桁が三桁のを抜くなら、
filter (\x -> length x == 3) [10,2,34,401]とか。 EXCELはシートにSQLが使えるから場合によってはそっちの方が使えるのでは。
LINQやラムダ式でガッツリやりたいのであれば
もうEXCELの範疇を超えているので
.netでentityFreamworkとか使ってやった方がいいと思うよ。
do while not eofと do until eofは同じですか?
>>323
同じじゃないと思える根拠を書いてくれないか?doの後じゃなく
Loopの後に条件を書いたらそりゃ違うだろうけど。 >>324
ありがとうございます
同じことでも言い換えられるんですね >>324-325
特定の状況では結果が異なるから完全に同一ではないけどな
Sub test()
Dim eof As Variant
eof = Null
Do Until eof
MsgBox "Untilを実行した"
Exit Do
Loop
Do While Not eof
MsgBox "While実行した"
Exit Do
Loop
End Sub
eofがTrue/Falseしかないなら同じ動作だけど、そのどっちでもない場合は同じ動作するとは限らん
Null扱うなら覚えておかないとはまるぞ Notはビット反転だから真偽値以外だと挙動が変わるわな。
Nullは色んな判定を挟む前にFalseを返す仕組みのはずだから、また問題が違うような気もするけど。
>>327
VBAには暗黙の変換ってのがあってな
>Notはビット反転
数値型に対してはな
真偽値にたいしてビット演算は規定されていないはず
>Nullは色んな判定を挟む前にFalseを返す
Nullが常にFalseを返すなら、>>326みたいな事にはならん
Nullには伝播性ってのがあってな、基本的にNullを含む式はNullを返す
返してるのはあくまでNullであって、TrueでもFalseでもない
Do Loopのヘルプにわざわざ
>引数 condition の値が Null 値の場合、引数 condition は偽 (False) であるとみなされます。
ってかいてあるだろ >引数 condition は偽 (False) であるとみなされます。
自分で答えを書いているように思うが。
俺が「Falseを返す」と表現したのが悪かったな。
「Nullが含まれる式は必ずFalseとして判定される」と書かなきゃいけなかった。
関係ないけど Not 1 が False 扱いにならないのは地味に不便だ
>>330
それが分かってれば問題はないんだけど、分かってても勘違いしたりするからなぁ
Nullの扱いが直感的じゃないってのが最大の敵
>>331
VBAのTrueは-1だからな
Not -1とかNot CBool(1)とかならFalse扱いだし vbaとExcelで数値とbooleanの変換が変わるのは怖い
ハイ戻ってきましたぁ!
また調子こいた教えたがりがしゃしゃってんのか?
バカはどいつだ?
>>331
Not 1と書くシーンがわからんが、素直に(?)Not TrueとかFalse とか書けば? ツール→参照設定で全てを参照する方法はありますか?
>>314
ここで言われてる初心者ってのは殆どの場合、他の言語も初心者ってことだぞ。
技術的に初心者だから初心者と呼ばれてる訳じゃない。
自分の画面を見ることが出来ない相手にも伝わるように書くとか、条件を小出しにするとか、相手をロボットか何かと勘違いしてるような初心者以前の問題が有るから否定的な意味で初心者と言われてる。
それにVBAを片手間とか簡単に言うのもどうなんかね?
あまり使ったこと無い奴ほどそういうこと言ってるような気がするね。
内容が何ーつ無くて罵倒しか出来ない初心者君の真価が問われてる。 >>341
> 内容が何ーつ無くて罵倒しか出来ない初心者君の真価が問われてる。
ブーメラン w >>339
ワシにとって Not 1はNot true程度には奇抜や Not 1 は普通に使うけど?
LSB だけ変更したい時とか
「Not 1」と直接書くわけじゃなくて0/1を返す関数の返り値に対してのことだろ
>>344
うむ、ただ>>331は「Not 1 が False 扱いにならない」事を嘆いて(?)いるから、君とも意見が合わないかも知れない。 >>342
内容あるじゃねーか。
日本語も理解出来ないほど無能か? >>348
スッカスカの内容あるとか言われてもなぁ w >>349
君のレスには内容ないけど、Sa6b-XzByは内容のあるレスをし続けているぞ >>349
>>351
バーカ。
>自分の画面を見ることが出来ない相手にも伝わるように書くとか、条件を小出しにするとか
これが内容だ。
クズコードだとかお前の設計の方がよろしくないだとかはどこがどう駄目なのか言ってないから何も言ってないのと同じだ。
この違いも分からないから無能と呼ばれるんだよ。 このバカよっぽど悔しかったんだなw
支離滅裂だけど悔しさだけは痛い程伝わるよ ID:SDtHFGLjaくん
だが俺にバカを嘲笑うのをやめろと言うのは土台無理な話だ
だってバカは面白いんだものw
これくらいはその小さな脳ミソでも理解出来るよね?おバカさんw
この罵倒しかしないヤツはVBAコードの一つも読めないのに何年も前から張り付いている本当の意味での異常者で、
どうも現実の生活で誰にも構ってもらえないからネットで罵倒を繰り返してレスポンスをもらって喜んでいるみたいなので、
各員は餌を与えないでください。いつまでも無意味なレスがついて荒れるだけです。
対策として「晒したコードに対し具体的なコードをつけて指摘しているもの以外は相手にしない」っていうテンプレでも追加してほしい。
>>354
ほら、やっぱり内容がまるで無い。
小学生と変わらん。 >>343
すまん、どっちも始めて見た
1をbooleanにするのはテストでifを書く時だけだな
if 1 then
ってこれ間違ってた事に今気づいたわ。本来なら
if -1 then
だったわ そんなことより、
0以外の数値をTrue扱いしたいのに、
If Not x が IfNot (x)じゃなくて If (Not x) なのが非常によろしくない
>>358
いや、
If 0 Then
も
If 1 Then
も想像してる通りに動きますよ。
少し直観と食い違うのは Not が絡むとき >>358
コメントの代わりに
#If 0 Then
は昔よく使ってたなあ。
最近は全く使わなくなった。
Not 1もNot TrueもIf -1 Thenも使ったこと無いな。
こういうのはその人の趣味というか癖みたいな問題だわな。
どれが良いとか悪いとかの問題じゃない。 しかし言うほど
If Not [Integer] Then
という書き方をするだろうか?
If Not Book Is Nothing Then
みたいな書き方はするけど、数値でNot使う事自体あんまりない気がする。
MS系のBASICはずっと昔から「0」と「0以外」で真偽を判定するから、論理式では1もNot 1もありえない
もちろん-1なんかも使わない
俺の知る限り、約40年前に発売されたN-BASICの時代からこの仕様は変わってない
>>357
だからいちいち相手するなよ
おまえの内容とやらもたいしたこと言ってないんだし >>359
> If Not x が IfNot (x)じゃなくて If (Not x) なのが非常によろしくない
それ一緒だろ w
C言語みたいに論理否定(!)があればいいだけの話 >>362
数値型にnotは使ったこと無い。特に言語によってfalseが変わるから怖くて使えない
後者は普通に使う >>330
> 「Nullが含まれる式は必ずFalseとして判定される」と書かなきゃいけなかった。
ところがどっこい
If 2 Or Null Then 〜 Else 〜 End If
は True (と言うか整数の2)と評価されたりするんだな
0 Or Null は Null になるとか挙動が読めないけど
@Excel 2013 >>364
俺の書いた回答に対してアホが罵倒したのが最初だよ。
お前の書いた>>344なんて初心者でもやらんわとでも言われたら頭来るだろ。 >>366
True ならわかるけどFalseが0以外の言語ってあったっけ? >>368
単にビット演算の必要がなかっただけなんだろうなとしか思わん
まあ内心でレベルひくって思うけど w >>370
俺はそれなりの奴から根拠ある批判をされた場合は何とも思わん。
びっくりするぐらいレベルの低い奴から根拠の無い批判をされた時は赦さんね。 >>358
だろうな。ワシも書いたの初めてや。そのレベルの奇抜さって事。 isSomeStatusが整数を返す関数のとき
If isSomeStatus(x) Then 〜
を使ってて、つい
If Not isSomeStatus(x) Then 〜
と書いてしまうことはない?
>>368
人並みに頭に来てんだおバカさんw
結構結構、もう少し熱くなって一度爆発でもしていまえば少しはクールになるかもねw
お前のちっぽけな脳ミソもw
あ、後もう一つ、お前はもうしゃべるな >>373
> isSomeStatusが整数を返す関数のとき
なら
> If isSomeStatus(x) Then 〜
なんて書かないで
If isSomeStatus(x) <> 0 Then 〜
って書く >>373
無い。つか、そう書かない事を理想としている。
変数も定数もプロシージャも型を意識するようにこころがけている。 使ってるうちに関数の返値型は暗記するし、そもそも一度は確認するだろうから、
真偽値以外でNotをうっかり使うというケースはあんまりなさそう。
というかうっかりNot 整数をやっちゃったぜって事ならイミディエイトウィンドウで確認する癖を付けた方がいいと思う。
組み込みの Is〜 が As Boolean になっているけど
自分の Is〜 は As Long にしたくてそうしてるんだけど、返り値を受けた時の書き方を
統一的に扱えないのが悩みの種なんですよね...
>>379
それは(失礼を承知で言えば、)ネーミングにセンスが無い。isほにゃららFunctionはBooleanに統一すべし。 >>380
そうなんだけど...
返り値を合計したものが「〜にあてはまるもの」の数に一致させたいんですよ 同じ関数名で宣言するとユーザー定義関数の方が優先されるはずだから、
いっそ組み込み系のIs〜を全て再定義してしまえばいいのではないだろうか。
もちろん「Isなんちゃら〜」の返り値を合計した後で -1 をかければいいんだけど、
Trueが-1であることに依存するのもなんかこう、しっくりこないんですよね。
>>381
うむ、気持ちはわからないでは無いがそれは駄目だ。関数名cntなんとかとかnumなんとかとか「〜の数を返す」ヤツらルールを決めて統一すべし。 >>383
-1をかける、とかそんな言語仕様に強く依存する(グロテスクな)コーディングはしないほうが良いと思わない? >>380,384
うーん、しょうがない。
これから大改造するか。 >>386
あ
大改造になっちゃうの?それはすまない。
けど、
Function isほにゃらら() As Long
は、やはり美しくないよ。 >>374
小学生に罵倒されれば誰でも頭に来る。
内容が無ければ尚更だ。
それに、小学生はきちんと躾ける主義でね。
バカにはちゃんとバカと言うべきなんだ。
質問に関係無いことしか書かないバカが人に対してここに来るななどと言う資格があるわけ無いだろう。
そんなことも分からないから小学生と呼ばれるんだ。 >>381
Isで始まる名前を変えれば良いと思うのは俺だけ?
或いは戻り値はBooleanだけど引数をもう1つ用意して、そこに合計を返すとか。 >>389
お前小学生にもバカにされてんのかwwww
最近の小学生もすてたもんでもないなw 元の引数の値に合計を入れて返しちゃうのはさすがに変な気がするけど。
>>391
ここまで言われて内容がまるで無いから呆れる。
百害あって一利なしだ。 >>393
お?少しは謙遜の気持ちも芽生えてきたか?w
でもお前は百害どころか毒にも薬にもならんよw
だってバカなんだからw笑えるけどwww 誰か助けてください。
今日一日かけて作ったマクロが、先程エクセルがクラッシュしてしまい自動修復が働き、マクロだけ消失してしまいました。
クラッシュ直後のxlsmファイルをZIPにして「vbaProject.bin」を取り出したりは出来たのですが、
新しいxlsmに取り込んでもやっぱり開くと修復で消えてしまうようで・・・
何とかしてソースコードを取り出すことはできないでしょうか・・。
一日で作れるマクロなら大した分量じゃないだろうしもう一回同じコードを組めば良いんじゃね
>>395
こまめに保存しないとそういう目に合うという経験を得られてよかったね
次から気を付けないとね >>397
保存はしてあったんだが、ファイルそのものが破損してた。
定期的にExcel落とさないとダメみたいだね。 >>398
自分はモジュールごと定期的に保存フォルダにドラッグ&ドロップしてる
いちいち「ファイルのエクスポート(E)...」とかしなくてもできることを知って楽になった。 >>398
確かにエクセルは保存をかけても終了するまで保存しないんだよな。たぶんXML形式にして保存する関係からだとは思うけど。
自動バックアップからなら修復の可能性はあるけど、マクロだけ消えたならそのファイル自体は元々マクロ書く前の状態なんじゃないかな。 あはは、俺なんかそんなのしょっちゅうだぜW
ノリノリで良さげなコードが書けてる時に限って突然落ちやがるWW
もうね、マメに保存する癖を付けないとどうにもならないよね
>>367
Orのヘルプに書いてある通り
True Or Null はTrue
False Or Null はNull
で、
CBool(2)はTrue
CBool(0)はFalse
なので、仕様通りの動作ではある
Orはどちらかが真なら真なので、片方が不定でも真だという理屈だな
ショートサーキットしないくせにな
どちらかが偽なら、もう片方に従うから、もう片方が不定なら不定
まあ、理屈として考えれば納得はできる >>396
朝から書き続けてたから1000行以上ある。かなりつらい。
何度同じような書いてもクラッシュするので原因を調査していたのですが、判明したので報告します。
Windows10 / Excel 2016
1.一番最初のコーディング中にクラッシュした原因
※そもそも取得のために引数にした配列を直接書き換えようとするのが間違いか。
↓下記変数を関数で生成
Dim fl() as string
call GetFileList(fl)
-----
function GetFileList(ByRef fl() as string)
Redim fl(1 to 123,1 to 1)
end function
-----
↓この構文を入力してEnter押すと必ずエクセルがクラッシュする。
ReDim Preserve fl(, 1 To 2)
↓正しいコード。これならクラッシュしない。
ReDim Preserve fl(LBound(fl) To UBound(fl), 1 To 2)
次レスへ続く >>403
2.クラッシュした後にマクロが消失した理由
とあるモジュール(*.bas)を取り込むと、上書き保存は問題なくできるのだが次回ブックを開いた時必ず「vbaProject.bin」が消失することが判明した。
クラッシュしなくなるまでの手順
@新規エクセルブックに移行
Aインポートしたbasのコードだけをコピーして新規モジュールに貼り付け
B下記のような定数があったので、FileSystemObjectのクラスと競合しないよう別の名前に変更
Enum flGetMode
File = 1
Folder = 2
All = 3
End Enum
↓
Enum flGetMode
flFile = 1
flFolder = 2
flAll = 3
End Enum
>>399
そうだな・・・今度からエクセル落とす前にモジュールだけ取り出すことにするわ。
>>400
エクセル、マジ、怖い EMK
>>401
今回のはマメに保存するというより、ブックを別ファイルにバックアップしないと対処できないかな。
今度から毎時間スナップショット撮るようにするわ >>394
よっぽどアホな質問して怒られたのが悔しかったのか?
碌にコードも書けないのに居残ってるってことはw >>400
そうなの?
保存したのにされてないってのは経験無いなあ。
>>399
バックアップするマクロとか書いてたけどウィルス判定されることもあるし、最近はやってないわ。 >>404
列挙の場合、自分はメンバーの先頭にすべてenmを付けてるな。
昔、誰かがこれやってるの見てからは。 ExcelがクラッシュするならWord VBAで書けばいいのに
(半分マジ)
>>399
ファイルのエクスポートってのは知ってるけど「モジュールごと」ってのは具体的にどうするんです? スプレッドシートで開いてみるとか
ファイル壊れてたらダメ化
>>341
はっきり言おう
VBA自体が間口が広いために初心者が扱い易い言語ではあるが
大きなシステムやWeb系には向いていないために
全体から見れば「VBAの上級者」というのは
所詮井の中の蛙に過ぎない。
自称VBA上級者よりVBAの上級者じゃなくても
JAVAや.Netの知識を多少なりとも持っていて
そっちも出来るという方が基本的に給料が高いというのはそのせい。
つまりここで初心者がどうのと煽っている奴も
所詮は初心者の域を超えていない。
初心者が初心者を煽ってるだけ。
もっとも俺も自分を初心者じゃないなんてとても
おこがましくて言えないけどね。 >>409
VBEのプロジェクトエクスプローラでモジュール名を右クリ >>409
コードのコピペとか右クリからエクスポート(E)...じゃなくて直接ドラッグ&ドロップするの >>411
自分が初心者なら皆初心者に違いないってかw
賢いふりをしてるけどお前も>>341となんも変わらない無知を知らぬバカやぞwww 403だけど、会社のEXCELでも試してみたらやっぱりクラッシュする
redim aaa(,1 to 2)
まぁコードとしては間違いだから滅多にこんな書き方しないんだけどさ
でも
redim aaa(,1)
なら、ただのエラー(赤字)になるだけでクラッシュしないから納得行かないわ
一応MSには送っておいた。
参考まで。
>>411
JAVAや.netのできる上級者も多いと思うが。
というか、上級者は他の言語もできる奴が多いだろ。
主戦上がどこかというだけだし、そもそも主戦上だって他言語の人もいるだろ。
俺がどうあってもかなわないと思う人はVBA上でアセンブラ使ってるし。
実際、俺も大したレベルじゃないがCやJAVA、.netも書くしアセンブラも勉強中。
VBA使いだからといってレベルが低いわけじゃない。 >>418
正確にはマシン語だね。
VBAとアセンブラでググれば見つかる。
マシン語のコードを変数に格納してメモリ操作して実行させる。
VBAの制限のために普通じゃ出来ないことをしようとする場合や普通に書くとどうしてもスマートじゃない場合に使う。
個人的に使いたい場面が2つ有るけど技術的に自分のものに出来て無いので使ったことは無いが。 俺もマシン語とアセンブラ言語を勉強したなぁ。
早見表片手にバイナリ読むくらいのところまではいけたけど、
実際にメモリに転写して実行するとか手間が多すぎてあきらめたわ。
マシン語もシミュレータでOS作りに挑戦してHello Worldで止まってる。
>>421
VBA上でやる場合はアセンブラが主体じゃなくてVBAで出来ない部分だけに適用するわけだから、アセンブラ自体はそれほど複雑じゃないと思う。
自分の場合は別の言語でmemcmp使ったことがあって、それをVBAに移植する場合に使いたい。
ただ、そのプログラムをVBAで実現する意味が薄いように感じるのと別にmemcmp使わなくても代替あるかもしれないんで実際に組むかどうかは分からないんだけど。 >>423-424
まぁそこまでするなら別の言語にした方がいいというか、そもそも発想が逆というか。
オフィス製品を拡張する上で「守られた」プログラミングが出来るのがVBAの特徴だし、
目的を絞っているから実用的なプログラムを短時間でくみ上げられるという長所があるのであって、
マシン語まで勉強してやるくらいなら、その手の目的で作られたC++言語辺りを頼るべきなんだよな。
もちろんそれが出来ない環境だから俺もマシン語を勉強するに至ったんだけど、
けっきょく型安全すら保証されない世界で何かを組み上げるってのは趣味の世界の話であってVBAの本質からずれてるしね。
ちなみに勉強中にC言語ですらマシン語で直接組むよりも非効率になる可能性が高いと知ったんで学ぶ意味はあったけど。 一体何の話をしているのか?
VBA補完というならC/C++で十二分だろうに
それで「実行環境がVBA」という気軽さは保てるんだし
>>424
自分はものにして無いので、そこまでしてない。
ものにしてる人にとってはそこまでしてなどと思ってないと思う。
別言語でdll作ってVBAから呼び出すことも出来るだろうけど、そこだけで完結しないのがスマートさに欠けるように感じるからかな。 >>426
確かに話がとっちらかって分かりにくくなったが、つまりそういう話をしてる。
でもVBA以外の環境を持てない職場なので仕方なくVBAが補完できる範囲だけでやるしかない。
その補完範囲にマシン語を含めるのはVBAの長所を殺しているのでVBAが想定している範囲の中で最善策を練るべきだと。
ちなみに個人的経験では次善の策としてSQLを使ったら地獄を見た。 >>426
正解。
@まず保守性が酷い。都度ハンドアセンブルするのかって話。
Aラベルが付けられないからブランチ命令などは変更があったとき常にアドレスの相対位置を
設定し直さなければならない。ジャンプ命令みたいな絶対アドレス指定の場合はどうすんだろ。
B生産性が皆無
C中間言語を介在していないのでアーキテキクチャが異なるCPUでは使えない。
どうしてもアセンブラで組みたければC++のインラインアセンブラで素直にdllファイル作れって話。
こんなものどうやって普通にVBA組んでるやつに引き継ぐつもりなんだろうな。
出来ない環境でなければ設計自体を見直すか諦めろと。 >>429
引き継ぎとかは別にして、まず楽しいのかと >>427
完結ってどういう意味?
「VBA アセンブラ」でググって出てくるページ見ると、既存のcdecl関数を呼び出すことを目標にしてるみたいだけど、
自分はどっちかっていうと「なるべく自分で作ったもので間に合わせたい」という気持ちの方が強いな。 >>425
VBAでCのコード扱えれば良いんだけどね。
それに既にWin32APIで色々やってるし、その中には適切に使わないと危険なものもたくさんあるから、別に使っても良いと思うけど。
>>429
まず、アーキテクチャが異なるCPUについては既にWin32APIの時点で使えない。
それにアセンブラが主ではない。
memcmpの部分で使うだけで使う方は呼び出すだけだ。 >>431
例えばdllを作るとブックと一緒にdllがついてまわることになるでしょ。
ブックだけでは機能しないというのがちょっと...
ということ。 >>432
>まず、アーキテクチャが異なるCPUについては既にWin32APIの時点で使えない。
は?何言ってるの? VBAの環境なのにマシン語使ってやったぜー
ワイルドだろー
って自慢したいだけ
お前ら素直に感心する事も出来んのかw
惨めやのうwww
そうゆうひねくれた心を持っとるからいつまでたってもバカなんやで
ちなみにどこに感心すればいいの?
機械語の知識が殆ど無いこと?
VBA上でごく中途半端な機械語を走らせる方法をネットで見つけたこと?
VBAだけじゃどうにもならない、別途dllとの込みで扱うのはスマートじゃない。
そういう場合に使える方法があるということ。
他にもこの方法を使えればプログラムがスマートになるのにという場面もある。
これはVBAの制限によるものだけれど。
もっとも殆どの場合、これを必要とするコードを書くような事態自体ない。
普通はVBAではこの機能は実現出来ませんと回答することになるだろう。
>>434
すまんね。
君がどういうレベルの話をしてるのか、いまいち掴めない。
実際、そういうことも分からないから勉強中なんでね。
アーキテクチャが違うCPUってのが何のことを言っていて、使えないCPUについて具体的にどうして使えないのか示して貰えるかな。 >>441
dll大好きマンの俺としてはその意見に賛成する事態自体ないな 今どきアセンブラじゃないと
ダメな場面なんてほとんどない
速度が欲しいならC/C++で実用上十分
>>444
この場合は速度とか関係無いんで。
Cとかでも確かに外部dllを作れば可能だけど。
まあ、でもdll作る方が正論だわな。
問題は自分の望むdll作る能力が自分に無いことだね。 VBAだけで実現できない機能があるならDLLでいい
今どきのWindowsでアセンブラなんてまず必要ない
Visual Studio利用が前提ならdll作るのに大した苦労はいらないぜ。
Expressでもいいんだしな。
アドインを入れろというだけで嫌がられるのに・・・。DLLなんて言った日にゃ「何それ食えるの?おいしいの?」ってなもんで。
更にregsvr32で登録とか説明した途端「そんなメンドくさい事をやらずに出来ないの?」とかぬかされてムカついた今日此の頃
いやDLLが嫌がられてるからって
毎回アセンブラで書いてたら
「これだけのことにそんな時間掛かるの?」とか
文句が変わるだけだろ
dllの登録とかはグループポリシーとスタートアップスクリプトで処理すればいいよ
>>448
ふざけてんなら教えてやんねぇから自分でやれ って言ってやれ シートをSQLでアクセスしたあとどうも変なことが起こる。
あしたデータをDBに入れてからSQLでアクセスして同じ現象が起きたら自分のプログラムミスだろうけど、
起きなければODBC for Excelを疑ってしまいそうだ
まぁdllくらいは面倒くさがらず設定出来ないとな。
今後デプロイ作業とかやるようになったらそれどころじゃないしな。
結局自分の知識を言いたいだけのお前らw
ババアの井戸端会議より無法地帯だなw