Excel VBA 質問スレ Part77 at TECH
[2ch|▼Menu]
[前50を表示]
700:デフォルトの名無しさん
22/09/20 00:31:18.18 Rlnm1h+Y0.net
それあぼーんな人だから触らないほうがいいよ

701:デフォルトの名無しさん
22/09/20 07:23:58.96 Qfc1UF5x0.net
>>697
黙れハゲ童貞

702:デフォルトの名無しさん
22/09/20 08:18:55.69 TKjURbNB0.net
なんだかんだで、納品物はエクセルで!とか言ってるからいつまでもVBAやめられなくて辛い

703:デフォルトの名無しさん
22/09/20 12:12:55.21 ZsS5zbqxM.net
>>702
Excelやめてなんのソフトを代替にしたいの?

704:デフォルトの名無しさん
22/09/20 14:20:11.48 E6px8L9o0.net
Excelを使わない事務仕事なんか無いだろうね

705:デフォルトの名無しさん
22/09/20 14:37:00.62 a8qXzxjlM.net
うちの会社は弥生会計をずっと使ってるぞ

706:デフォルトの名無しさん
22/09/20 17:24:35.64 Qfc1UF5x0.net
>>704
うちの会社の経理は紙の帳面だぞ
古代エジプト時代と変わらん

707:デフォルトの名無しさん (スップ Sd3f-w3i5)
[ここ壊れてます] .net
>>706
パピルスと現代の紙とは異なる
髪はその頃と一緒だが

708:デフォルトの名無しさん
22/09/20 19:11:26.07 bPcXAKoD0.net
>>702
そんなに辛いなら転職したらいいんじゃね

709:デフォルトの名無しさん
22/09/20 20:36:15.87 E6px8L9o0.net
>>706
The 昭和

710:デフォルトの名無しさん
22/09/20 20:42:24.19 z6cIhAGk0.net
昭和の頃はすでにMZ-80とか有ったからね。

711:デフォルトの名無しさん
22/09/20 21:20:11.78 9PvWzZvw0.net
>>695
ありがとうございました。
それで徐々にコードを消していったら判明しました。
助かりました。

712:デフォルトの名無しさん
22/09/20 21:52:40.24 9PvWzZvw0.net
ユーザー定義型を配列に入れて使っているのですが、nameでソートしたり、
idでソートしたり、ageでソートしたり、その都度いろいろなプロパティでソートをしたいのです。
いままでは一旦二次元配列に入れてソートしていましたが、二次元配列のkeyposにあたるような
key elementsみたいに引数で渡す事はできないのでしょうか?
Sub Sort(ByRef User as Usertype,ByRef Property asここがわかりません)
なんというかworksheetオブジェクトとrangeオブジェクトみたいな関係みたいな
最悪プロパティ毎に違う名前のソート関数にすれば一応好きなプロパティの値でソートして返せるのですが
こんな感じで

713:デフォルトの名無しさん
22/09/21 15:26:19.55 IxQ+qaQI0.net
まずユーザー定義型をクラスにして、その後は IComparer インターフェイスでよしなに
Sorting of objects by their properties in VBA
URLリンク(scripts4all.eu)
個人的にはここまでやるならVBA以外を検討するけどね

714:デフォルトの名無しさん (ワッチョイ f749-GjCD)
[ここ壊れてます] .net
別の方法としてADODBでメモリ上にテーブルを持つのもある
テーブルにぶち込んでしまえば、ソート、フィルター、その際の項目指定とかどうにでもなる
その分のメモリは必要だし、テーブルに対する出し入れの処理はあるので
配列の大きさやソートの頻度で使うかどうか考える

715:712 (ワッチョイ bf66-W3aP)
[ここ壊れてます] .net
>>713
そちらを見に行ってEnumの便利さに気付きました。
二次元配列のfor for ネストでやってるような処理、列が増えるほどだんだん
わからなくなりますが、enum使えば二次元配列の利便性も残しつつ
ユーザー定義型みたいに使えますね。
二次元配列の悪い所はだんだん自分が何を指定してるのかわからなくなるところだったので、
Enumと相性抜群ですね。

せっかく教えてもらった高度な手法は今回は見送りさせて頂いて、簡単なEnum&二次元配列でやってみようと思います。
感謝です。

716:デフォルトの名無しさん
22/09/21 20:40:31.74 NsHiQ7yd0.net
元データがどこにあって、それをソートしてどうしたいのかわからんが
普通に考えればエクセルシートに展開すれば良いんじゃないかと思うんだが

717:デフォルトの名無しさん (ワッチョイ b7da-E+l9)
[ここ壊れてます] .net
たぶんEXCELのソート機能を使わず自分でソートしたいんじゃね

718:デフォルトの名無しさん (アウアウウー Sa5b-8eP5)
[ここ壊れてます] .net
なぜ競プロではVBAの出番が無いのか

719:デフォルトの名無しさん
22/09/22 11:36:03.90 V4zanZlpM.net
遅いとか記述が冗長とかサーバーサイドで動かせないとかテクニカルな問題はいくらでもあるけど、
最大の理由は競プロやるような人はVBAなんか使いたがらないから

720:デフォルトの名無しさん
22/09/22 18:38:55.33 +Wi4osLB0.net
>>718
年末のAdvent of CodeはVBAだかExcelだけかでやってる人たまにいる

721:デフォルトの名無しさん (ワッチョイ 97da-rZTD)
[ここ壊れてます] .net
>>666
いいえて妙、ワロタw

722:デフォルトの名無しさん
22/09/23 19:12:26.46 27USMHor0.net
外注ってやっぱ高い?

723:デフォルトの名無しさん
22/09/24 01:17:31.15 mU6CwKwa0.net
素人にやらせると、見かけは安上がりだけど結果的に高く付くことが多い

724:デフォルトの名無しさん
22/09/24 03:39:42.11 sis0YFKKa.net
何人で何ヵ月かかるかで金額が変わる

725:デフォルトの名無しさん
22/09/24 04:49:54.00 rKbJBgHg0.net
じゃあここのスレの方ならプロだから安心して頼むそうかな??
金額以外は

726:デフォルトの名無しさん
22/09/24 05:51:09.21 Bbc/0kyt0.net
RubyはそれだけではDBとなるものを持ってないからEXCELやACCESSのVBAとは比較できない。
もっとも、同様にDBを持たない言語と比較するなら
セーフティーでガベージコレクションの概念がなくスピードの速いRust辺りと比べるとゴミ同然

727:デフォルトの名無しさん (ワッチョイ c23d-dJZP)
[ここ壊れてます] .net
エクスプローラーでフォルダーのプロパティを開いて
カスタマイズタブのところに「フォルダーの種類」が全般とかビデオとかになってるけど。
これをVBA/VBSで変更できる?
フォルダーのtypeを見ても全部「ファイル フォルダー」になる。

728:デフォルトの名無しさん
22/09/24 09:33:48.67 DeEi7HC40.net
>>727
レジストリ操作でやりたいことができたわ。

729:デフォルトの名無しさん
22/09/24 14:15:19.28 qbD2jrks0.net
お、おう、よかったな

730:デフォルトの名無しさん
22/09/25 05:30:19.65 /q7OsFL50.net
一般ユーザがある列のセルを編集できないようにしたい。
でも、VBAの実行や、セル関数の結果は反映させたい。
URLリンク(support.microsoft.com)
↑セルのロック
という機能で試してみたがVBAマクロでの変更は許されなくてちょっと困っています。
セルに対してマウスイベントを発生させない。みたいなことを考えて、調べているが。
皆さんも悩まれる案件かと思います。もっと良い方法ないでしょうか?

731:デフォルトの名無しさん
22/09/25 06:18:07.93 jaItMug30.net
VBAん中でロック解除して
処理終了間際にロックし直しってんじゃだめなの?

732:デフォルトの名無しさん
22/09/25 07:44:30.90 dPa0+M2C0.net
SheetSelectionイベントとIntersect使うだけでは

733:デフォルトの名無しさん
22/09/25 09:13:59.54 nIE2ah490.net
お願いします。
検索をシートからではなくブックからをデフォルトにしたいです。
下記のサイトのコードを使い検索は出来るのですが、
結果表示ではなく( '<全てのシートの検索が終わったら、結果を表示します。> )、
検索値まで移動するにはどのようにコードを書けばいいか、ご教授願います。。
URLリンク(www.moug.net)

734:デフォルトの名無しさん
22/09/25 10:44:33.52 mk9vdghN0.net
>>730
worksheet_boforedoubleclick みたいなイベントプロシージャでできる

735:デフォルトの名無しさん
22/09/25 10:58:13.51 /q7OsFL50.net
ありがとうございました。
>>731の方法で簡単にできました。
VBA実行時に保護を解除して、終了時に再度保護をかけることで、
すんなりといけました。

736:デフォルトの名無しさん
22/09/28 13:31:05.50 /kKDTdjO0.net
A1:10もしくはA100に入力された値を配列に格納しています。
動的配列です。
Select Case 文字列A
case A1:A100のどれかに一致するなら
case B1:B100のどれかに一致するなら
みたいな書き方って出来ないのでしょうか?

737:デフォルトの名無しさん
22/09/28 13:35:10.17 Rj0JQSes0.net
ifで条件書けよ

738:デフォルトの名無しさん
22/09/28 15:15:27.03 n6LgYqsE0.net
>>736
恐らく出来ない。
ただ、Select Case の後の文字列の部分をTrueとして、
A10:A100の中に該当文字列が有った場合、
Trueを返す関数を作成して、Case文の後ろに記載して
その条件に当たったかを判別して、Case文の下に
その条件下での処理を記載することは可能。
Caseにある条件のA10:A100にとある文字列が
有った場合とB10:B100にとある文字列が
有った場合と下に続く処理が同じなら、
先程言った関数の引数に対象範囲と検索対象文字列を
持たせておけばCase文を使う必要すら無い。
戻り値がTrueかFalseかをIf文で判断すれば良い。
その辺は実際の状況に合わせて上手く作ってくれ。

739:デフォルトの名無しさん
22/09/28 16:15:51.79 vR69ytL90.net
select caseにtrue??
知らなかったわ何それ??

740:デフォルトの名無しさん
22/09/28 18:26:27.19 Pxqx/4k10.net
Do
With
End With
Loop
よりも
With
Do
Loop
End With
の方が計算が早い(PCにとっては楽)と考えてよいでしょうか

741:デフォルトの名無しさん
22/09/28 19:01:46.26 8l5UWazH0.net
>>736
こんな感じ?
URLリンク(i.imgur.com)

742:デフォルトの名無しさん
22/09/28 19:28:29.47 Aad51sjLa.net
>>736
Private Function F(R As RangeRange, S As String) As Boolean
Dim C As Range
For Each C In R
If C.Value = S Then
F = True
Exit Function
End If
Next
F = False
End Function
...
Select Case True
Case F(Range("A1:100"), 文字列A)
...
Case F(Range("B1:100"), 文字列A)
...
Case ...
End Select

743:デフォルトの名無しさん
22/09/28 19:32:38.30 Aad51sjLa.net
>>740
たいていのプログラムだと有意な差はでないから気にせずに作りやすい方で作れ
有意な差がでそうならまず測定

744:デフォルトの名無しさん
22/09/28 19:38:38.93 n6LgYqsE0.net
>>740
これも恐らくの話で申し訳ないけど、
元々Withで設定されているインスタンスが既に生成されているものであれば、その格納アドレス先を読むだけなので
Withがループの外にあっても中にあっても処理コストは変わらないと思う。
変わったとしても繰り返し実行での誤差と見分けが付かない程度と思われる。
逆にインスタンスが生成されておらず、With New 〜 のようにWithでインスタンスを生成する場合は
ヒープエリアのメモリにそのインスタンスを展開するため、Withがループの外に有った方が処理コストは低くて済む。

・・・はず。

745:デフォルトの名無しさん
22/09/28 19:40:24.19 2tCqxjcra.net
とりっきー

746:デフォルトの名無しさん
22/09/28 19:51:29.67 30UfjVhGd.net
>>739
ケツの穴をガバガバにして全通しするいやらしい関数だよ
Select Case True
Case オナラ
よし通れ
Case うんこ
よし通れ
End Select

747:デフォルトの名無しさん
22/09/28 21:06:15.14 Apn5XmOg0.net
>>742
結局If文でラップしてるだけじゃん

748:デフォルトの名無しさん
22/09/28 21:06:47.83 vR69ytL90.net
>>746
汚ねえな。。
こっちは夕食のカレー食ってんだぞ。。

749:デフォルトの名無しさん
22/09/28 21:20:17.00 0sCmeNkX0.net
>>747
If 文でラップとか意味わからんこと言われてもw

750:デフォルトの名無しさん
22/09/29 00:27:52.00 tkXe+LzA0.net
ヘイヘイヘイ~!
もしも~オブジェクト変数でぇ~宣言したぁ~値がぁ🎵
ラップ調

751:デフォルトの名無しさん
22/09/29 01:53:20.13 I3DbECBa0.net
ラップのセンスはいまいちだね

752:736
22/09/30 17:41:05.63 8DTKPQSA0.net
>>738-742
ありがとうございました。
変数Strの中の値が配列Listのどれかと一致するかということだったので、そのCountIFがまさにその通りでした。
それようの関数書いてSelect case True使わせていただきます。

753:デフォルトの名無しさん
22/09/30 21:34:23.42 RGIc4eHD0.net
>>752
Select Case True の話持ち出しといてなんだけど
最初のCase の条件に引っ掛かってその下の処理を実行した後でも
次のCaseの条件に引っかかったらその下の処理も実行するからそれだけは気をつけてね

754:デフォルトの名無しさん (スッップ Sd32-r4yT)
[ここ壊れてます] .net
>>753
そんなことないのでは?と思って試したけどやっぱりそんなことなかったんだが
普通はcaseの条件の中に入ったら次のステップはEnd Selectにいかないか?
Dim ncount As Long
ncount = 0
Select Case True
Case 0 = 0
ncount = ncount + 1
Case 1 = 1
ncount = ncount + 1
Case 2 = 2
ncount = ncount + 1
End Select
Debug.Print ncount
これは1になるんだが

755:デフォルトの名無しさん (ワッチョイ 927c-cqZP)
[ここ壊れてます] .net
>>754
多分breakいれなきゃいけないCとかと勘違いしてるんだと思う

756:デフォルトの名無しさん
22/09/30 22:50:53.72 oHn8O8ll0.net
Select みたいな文で複数の選択肢が条件満たした場合に複数の選択肢を実行する言語って PowerShell ぐらいしか知らんけど他にもあるんだろうか?

757:デフォルトの名無しさん
22/09/30 23:04:52.77 FO5tGPcx0.net
>>756
cとかそうだったはずだし、たぶん複数実行するほうが多数派なんじゃね
c#も、文法上は複数実行することになってるけど、break書いて抜けないと怒られるという
よくわからんことになってるし

758:デフォルトの名無しさん
22/09/30 23:17:37.16 2no5G0l30.net
CもそうだしJavaもそうだしPythonもそうだしJavaScriptもそう

759:デフォルトの名無しさん
22/09/30 23:34:30.49 oHn8O8ll0.net
>>757-758
C/C++ はそもそも複数選択肢が条件満たすことはないよ(たいていの処理系でコンパイルエラーになる)
fall through と勘違いしてるでしょ

760:デフォルトの名無しさん
22/09/30 23:56:30.92 2no5G0l30.net
>>759
ああそうだ。勘違いです
申し訳ない

761:デフォルトの名無しさん
22/10/01 00:36:40.48 fyOJn4KOa.net
>>754
これってコンパイル時に畳み込みで定数化されて同一のラベルが複数あってエラーになるとかしないのか

762:デフォルトの名無しさん
22/10/01 01:42:48.83 a0drtoBbd.net
>>761
馬鹿にはそう思えるのだろ

763:デフォルトの名無しさん
22/10/01 01:48:20.03 AX86MJ2c0.net
>>759
ああ、まさにfall throughだった
つかそうなると、fall throughじゃなくて
複数一致したら複数ブロック実行するような言語って知らないな
PowerShellってそうなのか?

764:デフォルトの名無しさん
22/10/01 01:53:07.95 AX86MJ2c0.net
>>761
VBAのCaseは定数以外にいろいろ書けるから

765:デフォルトの名無しさん
22/10/01 04:50:29.38 igg+s+OR0.net
>>763
複数一致
同じ条件を複数回追加すれば、それらすべてがトリガーされます。
URLリンク(learn.microsoft.com)

766:デフォルトの名無しさん
22/10/01 07:29:29.38 66c8QTBM0.net
みんないろんな言語やってるのね

767:デフォルトの名無しさん
22/10/01 07:40:45.91 BiebxrBw0.net
他言語やってる人が暇潰しに見に来る場所って印象があるよね
質問も簡単だし答えるほうに余裕があるので他スレと比べると寛容というかギスギスしてない

768:デフォルトの名無しさん
22/10/01 13:08:15.88 sQwPc1U3d.net
Excelでデータベースを作り、各レコード?事に
〜月〜日 〜
〜月〜日 〜
みたいなログを表示したいのですがどの様にすればできるのか教えていただけませんか?

769:デフォルトの名無しさん
22/10/01 13:10:34.86 PSWCeSJW0.net
キーボードで打ち込め

770:デフォルトの名無しさん
22/10/01 13:17:44.94 GEkLNCKa0.net
>>768
入門書買って自分で勉強したらどうかな
あ、EXCELが入っているPCを持ってないと無理かも

771:デフォルトの名無しさん
22/10/01 13:31:32.89 sQwPc1U3d.net
テキストボックスにセルの値を参照するとか、繰り返しの処理とかlookup関数とかindexとmatch関数はわかります
あとはこのリストが欲しいです

772:デフォルトの名無しさん
22/10/01 13:34:23.97 mp76wcbAa.net
MSのサイトを見ればいいだけじゃね?

773:デフォルトの名無しさん
22/10/01 14:11:06.32 m6/aGG23M.net
>>771
漠然としすぎていて適切に回答できない
書式設定のこと?ファイル出力?
どこにそれを表示したいの?

774:デフォルトの名無しさん
22/10/01 14:50:47.98 ozHkf13K0.net
もう自分で勉強してくれって。

775:デフォルトの名無しさん
22/10/01 15:38:51.00 66c8QTBM0.net
>>768
そもそもそのログの日付とやらはどこから持ってくるつもりなのか

776:デフォルトの名無しさん
22/10/01 15:39:00.83 05rfSfda0.net
>>773
すみません
VBAのユーザーフォームで検索用のテキストボックスを作り、
検索結果に該当したレコード(行)を選択(抽出)?して
それをテキストボックス2やリストボックスに表示したいです
〜番(ID)
名前
テキストボックス(リストボックス)
〜月〜日 何をした
みたいな表示画面が作りたいです

777:デフォルトの名無しさん
22/10/01 15:40:48.76 05rfSfda0.net
>>775
〜番号 名前 〜 〜 〜
の様な感じで列に追加していくやり方で作ろうかなと考えています

778:デフォルトの名無しさん
22/10/01 16:48:39.94 vnBH5ihbM.net
>>776
まずワークシート上でlookup,index,matchで検索、表示できるものを作る。
それからフォームのテキストボックスに入れた値をワークシートの検索用のセルに書き込み、結果をフォーム上のテキストボックス、リストボックスに書き込むVBAを作る。

779:デフォルトの名無しさん
22/10/01 16:50:40.38 05rfSfda0.net
>>778
ありがとうございます
まずはそこからですよね

780:デフォルトの名無しさん
22/10/01 16:52:55.19 GEkLNCKa0.net
どこでつまずいているかを書かないで答えだけほしいとか言われてもね

781:デフォルトの名無しさん
22/10/01 16:55:41.93 HuJ3UkiEd.net
>>768
こんなんVBAでもなんでもなくシステムを作りたいっていってるようなもんでしょ
金払って作ってもらえよ

782:デフォルトの名無しさん
22/10/01 17:09:04.65 AX86MJ2c0.net
>>768
なぜそれをエクセルでやりたいと思ったのか
今のレベルだと一から勉強レベルだと思えるが
c#かせめてVB.Net覚えたほうがいいんじゃない

783:デフォルトの名無しさん
22/10/01 18:15:10.78 BiebxrBw0.net
セルの内容(日付のところは文字列型(頭にアポストロフィ)で入れてる)
ID 名前 日付 イベント
1 名前1 2012年3月14日 Aをした
2 名前2 2012年3月15日 Bをした
3 名前3 2012年3月16日 Cをした
4 名前4 2012年3月17日 Dをした
5 名前5 2012年3月18日 Eをした
6 名前6 2012年3月19日 Fをした
※Sheet1のマクロ
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With UserForm1
y = ActiveCell.Row
.TextBox1 = Cells(y, 1)
.TextBox2 = Cells(y, 2)
.TextBox3 = Cells(y, 3) + vbNewLine + Cells(y, 4)
End With
End Sub
フォーム(UserForm1)を作って下記コントロールを配置
TextBox,TextBox1,TextBox2,TextBox3(Multiline=true),CommandButton1
UserForm1のマクロ
Private Sub CommandButton1_Click()
Sheets(1).Range("A1").AutoFilter 2, "*" & UserForm1.TextBox.Text & "*"
End Sub
ファイル開くイベントとかボタン作って下記マクロでフォームを表示
UserForm1.Show vbModeless
聞いた限りではこんなのしか思い浮かばない

784:デフォルトの名無しさん
22/10/01 18:31:08.84 oCrNNmAI0.net
VBAのPicture.Insertでリンク貼付けさせないようにクリップボード利用でPasteで貼り付けてみたら画像が異常に重くなりすぎて使い物にならない…。
おとなしくShapes.addPicture使うしかない?

785:デフォルトの名無しさん
22/10/01 18:49:59.64 PeKIyBQF0.net
>>768
Listobject作ってListrowsを都度登録する仕組みを作って目的のListrows()を呼び出すユーザーフォームを作ればいいんじゃないっすかね。

786:デフォルトの名無しさん
22/10/01 18:55:31.78 HuJ3UkiEd.net
まず質問者は何ができて何ができないのか気になるが何もできないんだろうなと推測してる
なのでここで丸投げしてバカなお人よしに作ってもらおうとしてるんだろ

787:デフォルトの名無しさん
22/10/01 23:20:55.43 BiebxrBw0.net
猪木が死んだ、時代が流れていく
思えばPCとの付き合いももう40年か
戦時中はと口癖のように言っていたジジイ共も消えてアマチュア無線なみにニッチな趣味だったPCが主流になるとは不思議なものだ

788:デフォルトの名無しさん
22/10/02 07:27:45.20 ySn/5a2I0.net
>>784
もとの画像が大きいんじゃね、表示用の画像を別途つくってから貼り付けてみ

789:デフォルトの名無しさん
22/10/02 13:27:44.47 TlawqFoR0.net
>>783
わざわざありがとうございます
助かりました

790:デフォルトの名無しさん
22/10/02 15:47:28.98 DdgukWIZ0.net
>>787
おいおいいつだよって思ったら昨日かよ
>>786
それでいいと思うんだよな
それが社会の基本だし、暇な元事務のNEETはそれで快楽を得つつ勉強になり、
転職への自信になるだろう

791:デフォルトの名無しさん
22/10/02 20:54:31.26 TlawqFoR0.net
VBAは作業を登録して自動化するくらいで覚えておいた方がいいですよね

792:デフォルトの名無しさん
22/10/03 06:16:19.93 S2WAje4f0.net
>>788
800kの画像でやってみたけど15Mぐらいまで巨大化してしまう
やはりAddPictureで代用してみる

793:デフォルトの名無しさん
22/10/03 07:27:24.16 4wRZXMmm0.net
VBEに書いたコードの整列っていうかコードを整えるっていうか自動インデントっていうかそんなショートカットキーがあったと思うけどなんだっけ?

794:デフォルトの名無しさん (ワッチョイ 53ce-OAEy)
[ここ壊れてます] .net
タブ

795:デフォルトの名無しさん
22/10/03 20:58:11.99 FDmFS1zQ0.net
>>791
変な枷付けること考えんと
好きに作っていいんやで

796:デフォルトの名無しさん
22/10/04 15:00:55.06 pLalriKq0.net
イベントで質問
余所で作ったエクセルにVBAで改造加えてるんだけど
1マス入力だけするSheetにActiveXのコマンドボタン付けたら
Worksheet_SelectionChange
が発生しなくなった
コマンドボタン押したイベントは拾ってるので
EnableEventsがFalseってわけじゃない(イミディエイトで確認済み)
デザインモードを解除してもWorksheet_SelectionChangeイベントが起きないので
しょうが無いからまた一から作り直したんだが
この現象って頻発するもの?
ググってもOfficeの修復かEnableEventsしか解決策が出てこない

797:デフォルトの名無しさん
22/10/04 15:54:59.32 TDYI1fTGd.net
>>792
Sub Macro1()
ActiveSheet.Pictures.Insert "C:\Work\Sample1.jpg"
End Sub

これで400KBのpngで試してみたけど
なぜかxlsmファイルのサイズは15KB
何か別の要因とか

798:デフォルトの名無しさん
22/10/04 19:28:07.31 uOFwOuxi0.net
>>796
そりゃエクセルを改造したら駄目だろ

799:デフォルトの名無しさん
22/10/04 19:47:41.77 o+JurUyd0.net
>>792
オプションの詳細設定-イメージのサイズと画質 ってどうなってる?

800:デフォルトの名無しさん
22/10/04 21:08:36.46 vyetwO+c0.net
Dim ar(2) As Variant
ar(0) = 1
ar(1) = 2
ar(2) = Split("1,2,3,4,5", ",")
Dim i
For i = 0 To UBound(ar(2))
ar(2)(i) = CLng(ar(2)(i))
Next i
splitで作ったジャグ配列の中身をlong型に変換したいです。
variant変数に一度入ったらもう無理ですか?
一応他の変数に入れる事で型変換には成功するのですが。
余計な変数を二つも用意してstringで作成されたのを一時的なvariant型ノーマル配列に
おさめてmそのあとで本当に使いたい配列のジャグ配列に入れていくというのが
どうも汚い感じで腑におちません。
アドバイスもらえると助かります。

801:デフォルトの名無しさん
22/10/04 22:26:54.77 cce3s7590.net
>>800
出来ません
諦めてください

802:800
22/10/04 22:43:48.69 vyetwO+c0.net
>>801
ありがとうございます。
ジャグ配列はRedim出来ないのがデメリットですね。
動的な配列の中にジャグ配列なのですが、なんとか先に不確定な親配列の中にある
不確定な数のジャグ配列を一時的なLong型配列に作って
そこからさらにsplitなしでなんとか作ろうとあれこれしてたら
よっぽど>>800の方法の方が処理がわかりやすくなってしまい徒労に終わりました。
諦めます。踏ん切りつきました。

803:デフォルトの名無しさん
22/10/04 23:35:06.72 o+JurUyd0.net
>splitで作ったジャグ配列
>動的な配列の中にジャグ配列
ジャグ配列って用語の使い方が微妙に間違ってる気がするが...
そもそも文字列を分割して配列作ってるんだから文字列の配列になるのが当然で
Variant上等でやるなら、それを使う側がVariantで受ければいいだけでは?
まあ俺ならどうしても文字列をSplitしてLongにしたいなら
Longの配列返すSplitのラップ関数作るけど

804:デフォルトの名無しさん
22/10/05 04:48:52.00 b9GTOuH90.net
sqliteで作ったジャグ配列。

805:デフォルトの名無しさん
22/10/05 07:10:06.74 8YZU4Hq7a.net
>>797
それでいくとうまくいくんだけどね、
通常のPictures.Insertだとリンク貼付けなのよ。他人に送付したら見れない。
だから一旦クリップボード経由でPaste使ってやってるんだがそれだと容量がヤバくなる。

806:デフォルトの名無しさん
22/10/05 08:07:32.65 hw4y4dFR0.net
そもそも何でもかんでも配列で処理しようとするのがちょっとねぇ。
例えば列に当たる要素毎に違う型を使いたいなら
ちょっと仕組みは大きくなるけどADODBのRecordsetを使うことや
1行の列データ単位の値を格納するクラスを作ってそれを行単位としてディクショナリやコレクションに追加して行くことも検討することを視野に入れると
結局後で読みやすく汎用性の高いロジックが組めたりする。
処理速度優先なら配列一択だからそのときのシュチュエーションに合わせて使い分けだね。

807:デフォルトの名無しさん
22/10/05 08:19:21.40 SsR8S72r0.net
構造体ではできんの?
ジャグ使う機会無いからなんとも言えんが

808:デフォルトの名無しさん
22/10/05 10:50:57.71 HrKgxVhUd.net
すぐDBとか持ち出す奴いるけどコスト考えたらそう簡単にDBなんか使わんと思うけどね
普通に配列処理用の関数のみのモジュールでコード管理すればいいだけと思うわ

809:デフォルトの名無しさん
22/10/05 13:20:52.03 7KiNZ4t1d.net
>>808
何のコスト?

810:デフォルトの名無しさん
22/10/05 14:41:00.50 bxBPBLxH0.net
やっぱ好きなように作るのが1番ね

811:デフォルトの名無しさん
22/10/05 15:47:13.70 DsSYxIFi0.net
ワークシートがDBみたいなもんだしね

812:デフォルトの名無しさん
22/10/05 15:53:15.41 tZ9pwx2fM.net
学習コスト

813:デフォルトの名無しさん
22/10/05 21:19:11.66 /BrWnOTx0.net
コストコ

814:デフォルトの名無しさん
22/10/05 23:35:05.88 bxBPBLxH0.net
コスパ良い

815:デフォルトの名無しさん
22/10/06 16:49:22.22 wENRazb+d.net
例えば、誕生石を取得するGetBirthStone関数を作ろうとすれば引数は「日付 as Variant」と「月 as Integer(Long)」のどちらがいいでしょうか?

816:デフォルトの名無しさん
22/10/06 16:54:16.04 lmEPcDvIM.net
Dateではあかんのか?

817:デフォルトの名無しさん
22/10/06 16:55:37.45 1FPDwTBGM.net
そんなもんVLOOKUPで誕生石シートを検索すれば十分
VBAを正しく使うコツはVBAを可能な限り書かないことだよ

818:デフォルトの名無しさん
22/10/06 17:19:15.50 wENRazb+d.net
>>816
Date型でも大丈夫ですか?
一応、最初の部分はこう書いてみました
If Not IsDate(日付) then
GetBirthStone = CVErr(xlErrValue)
Exit Function

819:デフォルトの名無しさん
22/10/06 17:48:34.71 KR9VbeXw0.net
>>817
いや、むしろVBAだけの方がメンテしやすい
データとロジックは分ける方がいい

820:デフォルトの名無しさん
22/10/06 19:10:02.45 YSVEcn1gd.net
>>815
元のデータが何によるかで違うけど「月 as Integer(Long)」でいいのではと思う
仮に元のデータが日付でもGetBirthStone(Month(日付))で済む
月を渡すようなケースがありえないなら日付を渡して関数内でMonthを使うでもいい

821:デフォルトの名無しさん (ワッチョイ 435f-pIDl)
[ここ壊れてます] .net
月だけでいい
特定の日付に依らずある月の誕生石を知りたい場合に
意味のないDate値用意しなきゃいけなくなるから可読性が落ちる

>>817
誕生石みたいに改訂されたことがニュースになるくらい固定されてる内容ならコードにベタ打ちでいいと思う
祝日みたいに毎年変動するものとか、組合せの数が多すぎる要素ならシート管理の方が扱いやすいと思うけど

822:デフォルトの名無しさん (ワッチョイ d3da-pIDl)
[ここ壊れてます] .net
>>815
その程度のこと自分で決められんようでは時間かかってしょうがないだろ

823:デフォルトの名無しさん (ワッチョイ 6f8c-SQdC)
[ここ壊れてます] .net
>>815
Function getBirthStone(日付 As Date)
Application.Volatile True
getBirthStone = WorksheetFunction.Choose(Month(日付), "ガーネット", "アメシスト", "アクアマリン", "ダイヤモンド", "エメラルド", "ムーンストーン、真珠", "ルビー", "ペリドット", "サファイア", "オパール、トルマリン", "トパーズ", "トルコ石、タンザナイト")
End Function

こんなかんじ?

824:デフォルトの名無しさん
22/10/06 22:32:10.00 wENRazb+d.net
>>823
ありがとうございます。

825:デフォルトの名無しさん
22/10/06 22:47:25.99 HCQdlFdq0.net
>>823
わざわざワークシート関数を呼ばなくてもVBAにもChoose関数あるよ
URLリンク(learn.microsoft.com)

826:デフォルトの名無しさん
22/10/06 23:06:53.10 gOgPUvPm0.net
ほんとだw てへ

827:800
22/10/09 17:09:18.30 Kilq6kjS0.net
>>803
ラップ関数作る解決方法最高です。
頭固かったです。
他にも導入できそうなところが見つかり助かりました。
感謝です。

828:デフォルトの名無しさん
22/10/10 21:48:05.32 P58+Ol8v0.net
>誕生石みたいに改訂されたことがニュースになるくらい固定されてる内容ならコードにベタ打ちでいいと思う
>>823を見ての通りこの手は表記ゆれが問題になる事が多いから
可能な限り外部データにした方がいい

829:デフォルトの名無しさん
22/10/11 13:53:54.44 uAPvvwer0.net
インプットボックスで入力される値が数字かどうか判断するコードってどう書けばいい?

830:デフォルトの名無しさん
22/10/11 14:15:03.61 fEDU7G4fd.net
・符号(+-)を許すか
・ドット(小数点)を許すか
・カンマ(桁区切り)
を踏まえて文字の妥当性チェックすればいいんじゃないの

831:デフォルトの名無しさん
22/10/11 14:17:40.55 fEDU7G4fd.net
あと自分はWorksheetFunction使うの好きじゃないけど
WorksheetFunction.IsNumber
でもいいかもね

832:デフォルトの名無しさん
22/10/11 14:26:37.29 H84z/pNR0.net
全角は?漢数字は?ローマ数字は?欧米式の桁区切りは?
入力検査は考え始めるとキリがない分野の一つだぜ

833:デフォルトの名無しさん
22/10/11 15:13:10.17 DoWcBI1l0.net
>>829
IsNumericじゃダメなの?

834:デフォルトの名無しさん
22/10/11 17:02:04.45 uAPvvwer0.net
>>833
さんきゅーそれだ
てかVariant型が数値かどうか調べられるんだな~
書き方解ったらvartypeとかtypenameでも行けそうな気がする
ちょい試してみよ

835:デフォルトの名無しさん
22/10/11 18:13:13.59 DoWcBI1l0.net
>>834
語弊があるといけないから言っておくと、
IsNumericはあくまで数値として扱える値(数値に変換出来る値)かどうかを判定するよ。
だからString型でも”123”みたいのはTrueを返すからそこは注意してね。

836:デフォルトの名無しさん
22/10/11 20:16:52.08 hb9m45MO0.net
考慮点はまだあるぞ
IsNumericって
"\3"とか"3e3"とか"&habc"とかもTrueだぜ

837:デフォルトの名無しさん
22/10/12 08:33:18.55 FAaW2+wFd.net
じゃ足し算する関数を別に作ってノーエラーで戻ってきたら数値
Sub Main()
 '全角数字も数字と見なす
 If Suujikana(StrConv(InputBox("入力せぇ"), vbNarrow)) Then
  MsgBox "数字だよ"
 Else
  MsgBox "数字じゃないよ"
 End If
End Sub

Function Suujikana(moji As Long) As Boolean
 On Error GoTo er
 moji = moji + moji
 Suujikana = True
 Exit Function
er:
 Suujikana = False
End Function

838:デフォルトの名無しさん
22/10/12 08:35:48.26 FAaW2+wFd.net
あ、これじゃだめかえらーでるあ

839:デフォルトの名無しさん
22/10/12 08:38:00.09 FAaW2+wFd.net
このやろ、variantにしたら+で文字列つくりやがって
こんのやろぉ

840:デフォルトの名無しさん
22/10/12 08:39:59.19 FAaW2+wFd.net
これでいい?らめ?
Sub Main()
 '全角数字も数字と見なす
 If Suujikana(StrConv(InputBox("入力せぇ"), vbNarrow)) Then
  MsgBox "数字だよ"
 Else
  MsgBox "数字じゃないよ"
 End If
End Sub

Function Suujikana(moji As Variant) As Boolean
 On Error GoTo er
 moji = moji * moji
 Suujikana = True
 Exit Function
er:
 Suujikana = False
End Function

841:デフォルトの名無しさん
22/10/12 09:33:08.65 JFXNmWRt0.net
>>836
まぁその辺は数値として受け取れるとも言えるからね。
その辺除外したいなら最初に“¥”や“e”や“&h”が含まれていたら数値ではないって分岐入れとけばいいだけじゃないの?

842:デフォルトの名無しさん
22/10/12 09:45:17.75 05zETGAlM.net
>>840
自分も同じこと考えたけど型の制約が緩いと面倒くさそうなので思考を放棄した、よく頑張ったな

843:デフォルトの名無しさん
22/10/12 10:05:45.44 05zETGAlM.net
そういえば昔型はあるのとないのではどっちが良いのかって記事を見たことあるな
結局型がないと論理エラーが出ないように型をちゃんと理解する必要があるって書いてた

844:デフォルトの名無しさん
22/10/12 10:15:23.77 FnwlmZOz0.net
kgとkmは単純に足し算しても意味ないからな

845:デフォルトの名無しさん
22/10/13 04:03:11.23 j3UF+2500.net
別にVBA使わなくてもワークシート関数でできるじゃんって意見どう思う?

846:デフォルトの名無しさん
22/10/13 04:08:37.62 QthptHxba.net
やりたいようにやれ

847:デフォルトの名無しさん
22/10/13 05:43:31.20 l6HSpiwg0.net
>>845
内容によるけどまあワークシート関数でできるならその方がいいだろうな

848:デフォルトの名無しさん
22/10/13 06:51:28.60 R3JkkIAh0.net
A1に入力されているものが消えたらB1以降の入力セルデータが右から左に自動で繰り上がってくるようにしたいのですがこれで大丈夫ですか?
これをA20くらいまで適用したいんですけど教えて貰えませんか...?
Private Sub Worksheet_Change(ByVal
Target As Range)
If Target.Address = Range("A1").Address
And IsEmpty(Target) Then
Application.EnableEvents = False
lastrow = Cells (Rows.Count,
"A").End(xIUp).Row
Range("B1:F1"&lastrow).Copy
Range("A1").PasteSpecial xIPasteValues
Range ("A"&lastrow).ClearContents
Application.EnableEvents = True
End If
End Sub

849:デフォルトの名無しさん
22/10/13 11:53:03.67 Ue05WQwm0.net
キーボード操作でマクロ作って呼べばいいんじゃね

850:デフォルトの名無しさん
22/10/13 13:03:11.83 8suwpN2kr.net
"B1:F"&lastrow
下から4行目は何の処理かな
g列以降にデータがないなら、a列削除でもいけそう

851:デフォルトの名無しさん
22/10/13 13:57:54.49 UFLyO0SD0.net
xIUp >> xlUp >> xlLeft
xIPaste >> xlPaste
excel だから xl だよ
本から手入力したのかな

852:デフォルトの名無しさん
22/10/13 15:04:44.40 xeSsgHCJ0.net
文字列にしてTrimして
右から一文字づつAscでコード調べて数字判別してる

853:デフォルトの名無しさん
22/10/15 01:10:39.87 zmWNo0nm0.net
そういや何気にVBAの中でCallByName使うとJavaScript 使えるらしいね。
使ったことないけど。

854:デフォルトの名無しさん
22/10/15 01:25:23.69 eU4yePu40.net
>>853
どういうこと? どうやるの?

855:デフォルトの名無しさん
22/10/15 07:21:27.16 tw/asOzR0.net
>>853
文字列で言語書いて実行するのってどうも好きじゃないな
そもそも有効な場面ってあるんだろうか
URLリンク(bougyuusonnin.seesaa.net)
>>854
調べなよ・・・

856:デフォルトの名無しさん
22/10/15 09:05:24.46 zmWNo0nm0.net
>>855
さあ?
メソッドチェーンが使えるくらい?
まぁ無理して使うもんでもないような。
現にJavascript知っててもVBAに混ぜて
使うような状況なんてなったことないし、
大体記述がめんどいし。

857:デフォルトの名無しさん
22/10/15 09:07:30.39 tw/asOzR0.net
>>856
ありがとう
やっぱりほとんど無いよね。

858:デフォルトの名無しさん
22/10/16 03:31:09.39 IoSf1xr/0.net
メリットはネイティブの手段でJSONがパースできるようになる事なんだけどVBAで必要になることはほとんどないか
ちなみに似たような方法でHtmlFileからIEのjavascriptを呼ぶ方法もある

859:デフォルトの名無しさん
22/10/16 05:54:19.77 zEVEZIxw0.net
ネイティブ?

860:デフォルトの名無しさん
22/10/16 06:00:43.85 q8mBJvHk0.net
予め言語側で用意されてるってことじゃない

861:デフォルトの名無しさん
22/10/16 06:58:42.73 4eBUdjNxM.net
正規表現をRegExpオブジェクトで利用することはネイティブですか?

862:デフォルトの名無しさん
22/10/16 08:27:49.05 6FfxZTeW0.net
正規表現をRegExpオブジェクトで利用したらハゲますよ

863:デフォルトの名無しさん
22/10/16 23:46:46.75 n3hO69PQ0.net
性器のことしか考えてないから禿げるんじゃね

864:デフォルトの名無しさん
22/10/17 02:28:59.55 Foj5GBltM.net
正規表現はexcelapiを使うのが楽

865:デフォルトの名無しさん
22/10/17 17:47:22.14 LwSzkOCXr.net
すみません、質問させてください
range内の空白セルを除いた部分を一気に配列に入れる方法ってありますか?
例えばA1、B2、A3、B3に1が入っていて、Range(Cells(1,1) ,Cells(2,2))を選んでいる状態で配列ArrにArr(1,1)=1、Arr(1,2)=1のみを入れる。ということです
「Range(Cells(1,1) ,Cells(2,2))を選んでいる状態」というのはFunctionで関数を作ったときにこの範囲を選んでいるという意味です
CurrentRegionを使ってもA2、B2の空白まで配列に入ってきてしまって困ってます

866:デフォルトの名無しさん
22/10/17 17:53:55.90 c98RAUt6M.net
selectionでforeach回せばできる気がするけどな

867:デフォルトの名無しさん
22/10/17 18:05:29.40 PbBQX3S8M.net
一気にやるなら判定文をスピルで一気に適用するか

868:デフォルトの名無しさん
22/10/17 18:22:32.67 KXCnFpZrr.net
すみません、先程の質問の意図はvba 100本ノックの以下の問題を解いていましたURLリンク(excel-ubara.com)
最初に範囲内を配列にすべて入れてdictionaryで出す方法を考えたんですけど、範囲のところがA1:C5とかならいいのですが、A:Cだと、すべての行まで配列に入ってしまって、それの行すべて処理するようになってしまったので、数字が範囲内の最終行までを配列に入れることができれば処理速度も変わるので、そういう方法があればという質問でした


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

322日前に更新/265 KB
担当:undef