X



Excel VBA 質問スレ Part57
■ このスレッドは過去ログ倉庫に格納されています
0749デフォルトの名無しさん
垢版 |
2018/10/24(水) 21:19:25.29ID:I9F6CV18
昔アセンブラやってたけど
今はアセンブラの知識なんて
まず糞の役にもたたない
悪いことは言わないから
IL止まりにしておいて
残りの時間を他の言語の学習に回した方がいい
0750デフォルトの名無しさん
垢版 |
2018/10/24(水) 23:52:56.26ID:PFCPc8y/
VBAってWinAPI 使えるんだな
入力もエクセルのシート利用できるし使いがっていいなこれ
自分だけ使うものはこれで十分な気がしてきた
0753デフォルトの名無しさん
垢版 |
2018/10/25(木) 09:32:39.27ID:r31i+JfI
人間が抽象化なしで無理なく扱えるデータは二次元の表までなのは確かだな
特別な技能を持たない人間の能力的限界がExcel
0754デフォルトの名無しさん
垢版 |
2018/10/25(木) 11:20:28.64ID:Poeqy0yu
行(列)をベクトルだとみなすと何次元にでもなるでしょ
テンソル入れ物にするメリットってあるか?
レベル上がると有益になるのかな
0755デフォルトの名無しさん
垢版 |
2018/10/25(木) 18:41:01.78ID:lvTxqVIL
>752
文字列と数値。ってかこれ以外セルには入れられないでしょ。オブジェクトは入れられないし
0760デフォルトの名無しさん
垢版 |
2018/10/26(金) 10:34:09.86ID:FHu9JUdN
>>750
当然だがWinAPIだけじゃなくVB呼び出しに適う任意のAPIが呼べるから、自分だけの環境なら何だって可能
0761デフォルトの名無しさん
垢版 |
2018/10/26(金) 10:45:47.31ID:REmVcuAB
解凍・圧縮用のdllであるunlha32やらunzip32なんかもちゃんと用意されていて、vbaから利用できるしな
0764デフォルトの名無しさん
垢版 |
2018/10/26(金) 20:18:33.42ID:7acxRmxq
それ言い出すとシェル呼び出してそこから外部プログラムの実行でなんでもできるわな
0767デフォルトの名無しさん
垢版 |
2018/10/27(土) 12:17:32.77ID:nqyfF+/M
なんで何でもできたら悪いみたいな言い方やねん
0770デフォルトの名無しさん
垢版 |
2018/10/27(土) 20:08:09.98ID:9XazvJsa
助けてあげても一瞬感謝されるだけで何も起こらないぞ
下手すると感謝すらされない
0773デフォルトの名無しさん
垢版 |
2018/10/28(日) 06:55:12.79ID:xmv6f/Y+
全然助けれとらんやんwプロさんあわれwww
0774デフォルトの名無しさん
垢版 |
2018/10/28(日) 09:41:11.55ID:U+AZbxUR
ちょっとしたことでいいからピンポイントで教えてあげる。
食いついてこなかったら諦める。
0776デフォルトの名無しさん
垢版 |
2018/10/28(日) 11:02:16.86ID:eT9vyE0h
ランダムアクセスファイルでデータ管理をしています。
いままで動いていたものが GET PUT で 「レコード長が一致しない」となります。

一部こんな感じです。
Const MONTH_SIZE As Long = 60
Type M_Rec
S_code As Long
Stock As Long
byCode As String * 8
M_id_Cre(MONTH_SIZE) As Integer
End Type
Public S_MAIN_REC As M_Rec

Open FileName For Random As #SmainNO Len = Len(S_MAIN_REC)
Get #SmainNO, indexNo, S_MAIN_REC

この標準モジュールを破棄して同じモジュールをインポートすると
正常に動きますがワークブックを保存して再起動し同じ処理をすると
エラーになります。
Public S_MAIN_REC As M_Rec の 記述場所を移動させると正常に
動きましたがモジュール内に新規プロシージャを追加したらまた
エラーが出るようになりました。
モジュールが壊れていると思い新しく作成しても同じでした。
ご意見お願いします。
現在ユーザ定義 の M_id_Cre(MONTH_SIZE) As Integer の配列を
61に変更し正常動作中です。
0777デフォルトの名無しさん
垢版 |
2018/10/28(日) 11:41:59.08ID:THaxkhg7
さすがに時代遅れにも程がある
そんな黴の生えたゴミカスは今すぐ捨てて普通にワークシートで管理するかDBにしろ
0779776
垢版 |
2018/10/28(日) 16:59:37.36ID:eT9vyE0h
すみません
もともとはワークシートで管理していたのですがファイルのほうが
都合が良いので変更しました。
0780デフォルトの名無しさん
垢版 |
2018/10/28(日) 17:01:07.70ID:ISWax1Kh
で、今まさにその前提が間違っていたことが判明したんだろ?
直ちに戻しなさい
0781デフォルトの名無しさん
垢版 |
2018/10/28(日) 20:08:41.54ID:4pkRNiip
馬鹿の特徴

動きません
エラーが起きます

決して具体的なエラーメッセージを書かない
0782デフォルトの名無しさん
垢版 |
2018/10/28(日) 21:40:15.40ID:uzLWPyey
バカの特徴
書いてあるエラーメッセージを理解できずに自爆 w

> GET PUT で 「レコード長が一致しない」となります。
0783デフォルトの名無しさん
垢版 |
2018/10/28(日) 23:30:32.75ID:9UvKiQNH
ここの住人回答者は居丈高だからteratailにでも質問なさい。
ただコード具体例とエラー詳細はいずれにせよ求められるけど
0784デフォルトの名無しさん
垢版 |
2018/10/29(月) 00:30:55.69ID:4Xu2UR6y
>>782
馬鹿は表面的なことしか見えない
0786デフォルトの名無しさん
垢版 |
2018/10/29(月) 09:45:00.02ID:uMisuGYK
初心者には環境とかエラーの詳細な条件を明記することへの心理的な障壁があります
その心理の正体は一体何でしょう?
0787デフォルトの名無しさん
垢版 |
2018/10/29(月) 10:53:33.28ID:VYDzXbvz
慣れの問題かと
・自信ないのでミス指摘されたくないなどの自尊心問題
・コンプライアンスリスクとの取り違え
・個人情報リスクとの取り違え
0788776
垢版 |
2018/10/29(月) 11:24:48.23ID:aqnyYxuj
少し荒れてしまいましたね、すみません

エラーは書いてあるとおり「レコード長が一致しない」
Openステートメントで指定された長さと異なるということなのですが
レコード変数やOpen Get Putのプロシージャなど変更せずに
このエラーが発生しました。多分VBAのバグだと思うのですが
詳しい方に教えていただきたく思いまして書き込みしました。
タイミングが悪かったですね。
0789デフォルトの名無しさん
垢版 |
2018/10/29(月) 11:33:02.57ID:f3zS/Ojj
確かにタイミングが悪かったな
20年遅いわ
今回お前が苦労して解決しても後で他の誰にも分からないんだぞ?
そんなもん押し付けられる方の身にもなってみろ
0792デフォルトの名無しさん
垢版 |
2018/10/29(月) 14:25:31.25ID:gsxtgvfG
>多分VBAのバグだと思うのですが

まぁ言語の方に責任を押し付けたくなるのは判るがなw
0794デフォルトの名無しさん
垢版 |
2018/10/29(月) 16:45:28.78ID:gkooAort
>>788
バイナリエディターでレコードファイルを確認するのと、テスト環境作ってレコードを減らしても発生するかみる
0796776
垢版 |
2018/10/29(月) 19:56:48.16ID:aqnyYxuj
>>794
エラーになる状態ですと、新規にファイルを作成しても1レコード目でエラーとなりますので
ファイルがおかしいとは思えません。ユーザー定義のレコードサイズ、モジュール変数の
メモリ設定があやしいと思うのですが。
0797デフォルトの名無しさん
垢版 |
2018/10/29(月) 23:29:14.96ID:cO8xV5Br
素人質問ですみません
エクセルで消費税を算出したいのですが、一つのセル内で完結できないでしょうか
ググっても税抜き価格と税込み価格の、二つのセルを使うものばかりでして
0798デフォルトの名無しさん
垢版 |
2018/10/29(月) 23:52:48.29ID:g/o5tBon
>>791
まさかな、と思ってぐぐってみたら本当だった。
しかもqiitaの新着記事にもそんなのあるし。

なぜなのか?
0801デフォルトの名無しさん
垢版 |
2018/10/30(火) 12:34:46.04ID:MiaEkZFI
>>797
税抜き価格を入力したら、そのセルの数値を自動的に1.08倍するマクロ

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Target.Value = Int(Target.Value * 1.08)
Application.EnableEvents = True
End Sub
0804デフォルトの名無しさん
垢版 |
2018/10/30(火) 18:40:58.23ID:bEYZFX0T
くだらない質問だと思いますが、会社のバーコードで在庫 納品書 委託 委託精算 等 連携したものを作成する場合は初心者でどのくらい作成期間がかかるものでしょうか?
0806デフォルトの名無しさん
垢版 |
2018/10/30(火) 18:53:25.90ID:E+8/TrgC
少なくとも、SIerに委託するより>>804の給料の方が遥かに高くつくくらいの期間は間違いなくかかるよ
0807デフォルトの名無しさん
垢版 |
2018/10/30(火) 19:15:41.01ID:bEYZFX0T
>>806
因みに幾らくらいかかるものでしょうか?
0809デフォルトの名無しさん
垢版 |
2018/10/30(火) 20:01:06.67ID:UXC/r+zj
テーブル(lo)を列毎に配列で取り出して処理したいのですが、キーを列名、値に列範囲を格納すればforループで代入できて簡潔なのでDictionaryを使ってみようと思っています。

Dim dic As Dictionary: Set dic = New Dictionary
Dim lc As ListColumn
For Each lc In lo.ListColumns
_dic.add lc.name, WorksheetFunction.Transpose(lc.DataBodyRange.value)
next lc

以上で作成した「Dictionaryの値」に格納した「配列の値」に代入が出来ません。
例えば

debug.print dic(見出しA)(1) '「ピカチュウ」が表示
dic(見出しA)(1) = "ライチュウ"
debug.print dic(見出しA)(1) '「ピカチュウ」が表示

となってしまいます。しかし以下の様に配列を格納し直すと反映されます。

debug.print dic(見出しA)(1) '「ピカチュウ」が表示
dic(見出しA) = Array("","ライチュウ", dic(見出しA)(2),・・・
debug.print dic(見出しA)(1) '「ライチュウ」が表示

修正があるたびに配列を代入し直すのは面倒なので出来れば値を直接書き換えたいのですが、どうすればいいのでしょうか。
0810デフォルトの名無しさん
垢版 |
2018/10/30(火) 20:25:09.48ID:4tQqoM/4
>>809
そもそもlo.ListColumns(lc.Name).Range.Item(Index).Value でテーブル内のセル値のセッターにアクセス出来るので、わざわざそんなことをやる必要がないと思う
仕様上ListObjectは列名重複が許されないし、ListColumnsコレクション自体がDictionaryと殆ど等価のハッシュテーブルになる
0811デフォルトの名無しさん
垢版 |
2018/10/30(火) 20:50:28.74ID:UXC/r+zj
ありがとうございます
現在はそうしているのですが(元々それがやりたくて全部テーブルに置き換えたのですが)
値を取り出すときに毎回ListColumns(lc.Name).DataBodyRange(Index).Valueと長々書く為コードが読みづらいのと、配列にすればちょっと速度改善が見込めるかなと思って試していました。
0812デフォルトの名無しさん
垢版 |
2018/10/31(水) 13:51:41.06ID:OKzw5dxl
Dictionaryの代替以外の回答もお待ちしてます。


あと追加で質問なのですが、先ほどのTransposeの様にワークシート関数を利用するなら配列ではなくセル範囲の方が速いという記事を見つけました。
どういう原因でそうなるのでしょうか?
0813デフォルトの名無しさん
垢版 |
2018/10/31(水) 17:54:26.42ID:Dz4usJiG
一般的にユーザーによる同等のVBAコードよりワークシート関数の方が速い
C#とかよりC++ネイティブの方が数〜倍速くなるのと同じ
0815デフォルトの名無しさん
垢版 |
2018/10/31(水) 18:30:36.22ID:b54HYVzl
>>812
組込みの機能はアプリケーション内でリソース管理が最適化されてるのでね
VBAでやると不要な大きさのバッファを確保してたりして無駄が多くなる
0816デフォルトの名無しさん
垢版 |
2018/11/01(木) 07:11:29.46ID:hEMz+97b
シートにボタン配置して押したら、オートシェイプの直線を引ける段階までって出来る?いわゆるショートカットキー的な感じの。
実際に直線を引いちゃうのは山ほどネットに転がってるけど、引くのは任意でやりたい。
0818デフォルトの名無しさん
垢版 |
2018/11/01(木) 18:36:00.35ID:Nl3jEz8g
Excelのセルに入ってるデータを使ってOutlookでメールをVBAで書きたいのですが
それぞれの行やある文字についてフォントや色などで装飾したいんです。
そんなことはできますか?
なんかできなそうなんですが。
でもこれをしないとものすごく不便なのです。
うまくいけば残業せずに遊びながら居残りしてお金だけはたくさんもらえるのですが・・・
0820デフォルトの名無しさん
垢版 |
2018/11/01(木) 19:09:06.19ID:Nl3jEz8g
>>816
サルでもできるよw
単にボタンにマクロの登録をすればいいだけ。
0822デフォルトの名無しさん
垢版 |
2018/11/01(木) 19:18:10.81ID:Nl3jEz8g
>>821
ボタンを挿入して右クリックしてマクロの登録を選び実行させたいプロシージャを選ぶだけ
0824デフォルトの名無しさん
垢版 |
2018/11/01(木) 19:24:41.75ID:9hAL4zo4
>>818
やったこと無いけどHTMLメールにして本文をHTMLにすれば良いんじゃない?
あとはテキストメール作成と同じじゃないの?
0826デフォルトの名無しさん
垢版 |
2018/11/01(木) 19:30:44.64ID:Nl3jEz8g
>>824
じゃ具体的なコードはどうなるの?

例えば、「こんにちは、うんちと申します。」の文で、うんちを太字で茶色にしたい場合。
0827デフォルトの名無しさん
垢版 |
2018/11/01(木) 19:33:37.59ID:Nl3jEz8g
>>825
こんにちは、<B><font color=brown>うんち</font></B>と申します。
0830デフォルトの名無しさん
垢版 |
2018/11/01(木) 23:45:47.15ID:BwvtJmQs
この板は日本語が読めない低学歴知恵遅れが多いのはあってる
えてして書いてある要件とまったく違うもんをあげてくるよくいる軽い池沼入ってるのと似てる
0832デフォルトの名無しさん
垢版 |
2018/11/02(金) 00:46:25.82ID:iMC20ra8
>>16
Excelのマクロの記録はVBAコードで表現できないものは原則できない
操作自体の記録再生ができるUWSCとかRPAといったツールを呼び出せばできる
0833デフォルトの名無しさん
垢版 |
2018/11/02(金) 06:47:30.99ID:Cpir13NG
Sendkeysで無理くりリボンメニューの直線を選択するコードを作ってショートカット割り当てる位しかないと思う
0834デフォルトの名無しさん
垢版 |
2018/11/02(金) 07:54:22.50ID:EKeu1zQN
>>828
あなたはサル以下ということだ。ウイッキー。
0835デフォルトの名無しさん
垢版 |
2018/11/02(金) 10:00:17.95ID:IpqW30ow
>>816

あれ? まだコードあがってないですね。
じゃぁExcel2010用ですが、サンプルを、、、
目的に合わせてShapeIDを変えてください。

Sub CreateShape()

 Dim ShpID As Long   ' ShapetypeID
 Dim iShpCnt As Long  ' Shape Count (追加待ち判定)
 Dim SHP As Variant  ' Loop用Shape

 ' Create Shape
 '--------------------------------
 ShpID = 409      'Freeformの場合
' ShpID = 1119     'Ovalの場合
' ShpID = 1042     'LineConnectorの場合
 iShpCnt = ActiveSheet.Shapes.Count
 Application.CommandBars.FindControl(ID:=ShpID).Execute
 Do
  DoEvents
 Loop While iShpCnt = ActiveSheet.Shapes.Count
End Sub

描かずに連続で押すと処理が入れ子になってしまうのが
難点ですが、、、
0838デフォルトの名無しさん
垢版 |
2018/11/02(金) 12:40:29.21ID:m6WMCehM
>>835
これで出来たんだね。
コード書ける環境じゃ無いから試せなかったけど、この方法かUIAutomation使うかどちらかかなあと思ってた。

CommandBarControl.ExecuteでもShapeの場合トグルっぱい動作だから思う状態になるか自信が無かった。
0839デフォルトの名無しさん
垢版 |
2018/11/02(金) 12:44:20.35ID:m6WMCehM
あれ、Do〜Loopの処理は気付かんかったなあ。
自分が作成してたら動かんかったと結論出してたかも。
0840デフォルトの名無しさん
垢版 |
2018/11/02(金) 12:50:59.79ID:IpqW30ow
>>839
StackOverFlowかどっかのサイトの受け売りなんですけどね。
どこからもらったのか忘れた、、、
0842デフォルトの名無しさん
垢版 |
2018/11/02(金) 17:17:11.16ID:ouVO3wBC
ちなみになんだけどDoLoopはなんの為にあるんですかね?
なくても同じ動きすんだけど。
0843デフォルトの名無しさん
垢版 |
2018/11/02(金) 17:57:06.50ID:oqBXcCoW
書き終わってShapeオブジェクトが作成されるまで、次の処理を待機

元々書いた後に何か処理をするプログラムの一部だったんだと思う
今回はCommandBarControlのコマンドが実行された時点で仕事は終わってるから要らないかと
0844デフォルトの名無しさん
垢版 |
2018/11/02(金) 18:54:32.40ID:m6WMCehM
>>843
ループ無くても動くんなら思った通りだった。
違いが有るとすれば自分はFindControlは使わず、コントロールの指定もIDじゃなくて名前使う所。

名前はFor Each使ってCommandBarを列挙して名前をDebug.Print、そのCommandBarに対してFor EachでCommandBarControlを列挙して名前をDebug.Printなどで調べる。
0845デフォルトの名無しさん
垢版 |
2018/11/02(金) 19:49:18.45ID:IpqW30ow
>>842
ん? Do - Loop 部分ないとちゃんと動かんよ?
VBEから実行してない?
ボタンに割り付けると、ボタン押した瞬間に十時カーソル消えるはず。
Excel2010より新しいVersionは動きが違うの?
0846デフォルトの名無しさん
垢版 |
2018/11/02(金) 20:57:01.00ID:/dr4nYVn
>>845
ボタン押したらクリックしたら線がかけるようになったよ。
2003でも動いたし、2007でも動いた。
0847デフォルトの名無しさん
垢版 |
2018/11/03(土) 00:21:42.99ID:N3tWJlln
Excel2010でも試したけど、ループのないプロシージャで描けたよ
勿論ボタンのクリックイベントから
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況