X



Excel VBA 質問スレ Part66
■ このスレッドは過去ログ倉庫に格納されています
0322デフォルトの名無しさん
垢版 |
2020/05/28(木) 17:23:33.07ID:vsv+AImU
測定系の部署だから
エクセル関数でもリスト作ったりとかそういうのは使わないんだよぁ
計算系はすんげぇ使う
0323デフォルトの名無しさん
垢版 |
2020/05/28(木) 17:32:02.90ID:NxeE/SGI
100万行以上ある表で特定の範囲に太字があるセルがある場合にTrueを返却したいのですが、
セルをループする以外で判定する方法はないでしょうか。
ループだと遅いので他の方法を探しています。
0325デフォルトの名無しさん
垢版 |
2020/05/28(木) 17:53:26.74ID:6oAsq0wQ
>>323
俺も色やフォントでデータを判定する方式はExcelには向いてないから今すぐやめるべきだと思う
とりあえず、名前を付けて保存、範囲指定で太字を解除してもう一度別名保存、ファイルサイズの比較
0326デフォルトの名無しさん
垢版 |
2020/05/28(木) 18:24:58.06ID:NxeE/SGI
>>324-325
私もすごくそう思います。ほんとアホな現場です。
vbaや関数で高速判定する術は無いということになりますかね…
0327デフォルトの名無しさん
垢版 |
2020/05/28(木) 18:33:29.93ID:1No7OPPN
例えば、セルB1にして =GET.CELL(20,A1)*1 を LeftIsBold とでも名前定義
太字を確認したい列の右隣に、=LeftIsBold と入力して、それを合計する

遅いか速いかは知らないけど、Excel4.0マクロだから、ユーザー定義関数関数使うよりは早いと思う
あと、文字単位の太字には未対応
太字で判定する設計が良くないのは同意
0328デフォルトの名無しさん
垢版 |
2020/05/28(木) 18:44:24.85ID:nu6DWAbq
ユーザーフォームを印刷したいんだけどA4横印刷で一枚に収まるように倍率変更って出来ない?
ちょろっと調べると印刷設定に依存するとか書いてある。
吐き出し用のシートやらコード書くの面倒だし、フォームだけが印刷出来ればいいんだが本当に無理?
0331デフォルトの名無しさん
垢版 |
2020/05/28(木) 20:56:43.74ID:0S10FlCu
>>330
100万行のワークシートをXMLにするとデータ量が10陪ぐらいになることもあるから、たぶんワークシートをVBAで直接調べた方が早い
0335デフォルトの名無しさん
垢版 |
2020/05/28(木) 22:48:39.38ID:0S10FlCu
>>323
100万セルのBoldプロパティを調べるコードを作って実験してみたけど数秒で終わったぞ
範囲が限られてるなら一瞬で終わるんじゃない?
これより早くする方法はないと思うぞ
0336323
垢版 |
2020/05/28(木) 23:44:38.45ID:AwZmzoZa
みなさんいろいろありがとうございます。
結局ループですることになりそうです
>>335さんのコードと同じような気がしますが、その数秒〜十数秒が短縮できないかなと思ってました。
ありがとうございました。
0338デフォルトの名無しさん
垢版 |
2020/05/29(金) 06:08:45.93ID:OHJZg62K
業務上100万件のデータ処理が必要なら専用のソフトを独自に作るべきだろう
初心者にVBAでやらせる上司が無能としか言いようがない
今までその業務手作業でやってたんだとしたらそのままのやり方続けていればいいんじゃね
0340310
垢版 |
2020/05/29(金) 10:32:29.11ID:I8K8veff
>>318

ありがとうございます。エラーを回避できました
0341デフォルトの名無しさん
垢版 |
2020/05/29(金) 12:52:21.52ID:UXGV4L+b
物凄いコードを3つ
前スレで教えてくれたあの人たちが
今でもここを見てくれてますように
0343デフォルトの名無しさん
垢版 |
2020/05/29(金) 13:16:11.31ID:I8K8veff
指定したフォルダ内の"B"で始まるxlsファイルの"表紙"シートの各箇所を
このブックの"comp"シートA〜C列の2行目以降に書き出していくコードを教えてください

Dim path As String ,buf As String, i As Long
Dim mysheet As Worksheet, srcbook As Workbook, srcsheet As Worksheet

With Application.FileDialog(msoFileDialogFolderPicker)'フォルダを選択する
If .Show = 0 Then
MsgBox "キャンセルされました。"
Exit Sub
End If
path = .SelectedItems(1)
End With

Set mysheet = ThisWorkbook.Worksheets("comp")
buf = Dir(path & "B*.xls")

Do While buf <> ""
i = i + 1

Set srcbook = Workbook.Open(path + buf)
Set srcsheet = srcbook.Worksheets("表紙")
mysheet.Cells(i, 1).Value = srcsheet.Cells(3, 13)
mysheet.Cells(i, 2).Value = srcsheet.Cells(5, 2)
mysheet.Cells(i, 3).Value = srcsheet.Cells(7, 2)
srcbook.Close False
buf = Dir()
Loop
を試したのですが、だめでした
0345デフォルトの名無しさん
垢版 |
2020/05/29(金) 13:38:45.34ID:x/xJoOz3
buf = Dir(path & "B*.xls")
の後ろに、
Debug.print buf
Debug.print path & "B○○.xls"   <--実際のファイル名を入れる
で、何か気づくと思うよ
0347デフォルトの名無しさん
垢版 |
2020/05/29(金) 15:00:54.79ID:xfksWnzq
Dir君はいい加減デバッグ機能覚えようぜ
ローカルウインドウ見ながらステップイン連打しよう
0348343
垢版 |
2020/05/29(金) 16:23:07.80ID:I8K8veff
>>344,345,346,347

できました!ありがとうございます。

path & "B*.xls"
↓↓↓↓↓↓
path & "\B*.xls"

Workbook.Open(path + buf)
↓↓↓↓↓↓
Workbooks.Open(path &"\"& buf)

だったみたいです
0349デフォルトの名無しさん
垢版 |
2020/05/29(金) 18:24:55.94ID:ofRjPTJp
教えてください

クリップボードにあるキャプチャを全て貼り付けるマクロできますか。

ちなみに、win+Vで、過去のキャプチャ履歴が出てきます
0350デフォルトの名無しさん
垢版 |
2020/05/29(金) 18:44:55.24ID:FhfEW/N2
過去の履歴はクリップボードにはもうありません
0351デフォルトの名無しさん
垢版 |
2020/05/29(金) 19:17:03.09ID:/mLagXjz
馬鹿の特徴

教えて、助けて系で始まる書き込みをする
0354デフォルトの名無しさん
垢版 |
2020/05/29(金) 20:22:58.37ID:rds5fVij
馬鹿は、Win10全てが同じだと思っている
0355デフォルトの名無しさん
垢版 |
2020/05/29(金) 21:14:41.12ID:Z5PYtswD
なるほどね
APIが公開されているからそれを使えばいいと思うよ
0356デフォルトの名無しさん
垢版 |
2020/05/29(金) 21:47:35.41ID:be+QuDfe
Debug.Printの代わりにMsgbox
     ↓
うっかりループで使う
     ↓
必死に×とかEsc連打
0357デフォルトの名無しさん
垢版 |
2020/05/30(土) 00:10:31.73ID:r1iWOzqa
VBAで親クラスのインスタンスを子クラスに渡して子クラスから親クラスのメソッドにアクセスする方法ってあります?
0358デフォルトの名無しさん
垢版 |
2020/05/30(土) 05:29:34.61ID:n48qxrxQ
母のパンティを娘に渡して
娘から母のセックスにチェンジする方法はあるよ
0360デフォルトの名無しさん
垢版 |
2020/05/30(土) 10:18:37.36ID:Lg+IyK0J
仕様書みたいの書かないとダメだな
数年前に自分で作ったの手直ししなきゃなんだけど
結構でかいんでコード理解して全体像を把握するのが大変だわ
仕様書とかそういうのってたぶん書き方があるんだろうね
その辺勉強しなきゃダメだね
0362デフォルトの名無しさん
垢版 |
2020/05/30(土) 10:47:20.95ID:gDHPXROS
@画面をプリントスクリーン
Aエクセルなりを開いてペースト
B戻る


ABがいちいち面倒くさいので、理想的にはプリントスクリーンすれば勝手にそれがペーストされていけば良いのですが。できないかな。
0363デフォルトの名無しさん
垢版 |
2020/05/30(土) 11:13:20.00ID:gDHPXROS
続き
あるいはwin+Vで貯まってるキャプチャを自動的にダウンロード出来れば、と思いました
0365デフォルトの名無しさん
垢版 |
2020/05/30(土) 11:40:59.92ID:Lg+IyK0J
氏名住所をユーザーフォームで連続入力してリストに登録するじゃん
んで、フォーム上の印刷ボタンを押すと、ワークシート上に用意されてるテンプレ書類に
氏名住所が必要な箇所に順次記入されて印刷される

ていうよくありがちなプログラムあるでしょ

このテンプレ書類に数式を使って氏名住所を別のセルにも転記するようにしておく
例えば、VBAでA1に氏名が記入されるとすると
B1に =A1 って書いておけばB1にも氏名が記入されて印刷される

これも当たり前なんだけど
このB1に入る数式にユーザー定義関数使うと、うまく動かないのな
Application.Calculate とかもうまくいかなかったわ
うまくいかないってのは計算してくれないってことだけど
0367デフォルトの名無しさん
垢版 |
2020/05/30(土) 13:37:34.40ID:VTd6O4v1
同じなんだけどVBAで膨大な演算処理をコード組んでプロシージャ合わせて作っても
おっさんから
「ああ、マクロの記録して作ったやつね」
て言われると少しイラつく
記録じゃつくれねーほど汎用性高くしてんだろうがボケが
0372デフォルトの名無しさん
垢版 |
2020/05/30(土) 15:27:58.73ID:4gyXKXc6
マクロの記録しかできない人、Win32APIを使いこなす人、どっちも「VBAができる人」と言われてしまう
0375デフォルトの名無しさん
垢版 |
2020/05/30(土) 16:36:13.67ID:PhwvBcVJ
>>365
Application.Calculate じゃなくて、Application.Volatileだぞ
ワークシートの数式の方に、 &REPT("",NOW()) とかでもいいはず
0377デフォルトの名無しさん
垢版 |
2020/05/30(土) 17:00:12.37ID:EKBxQQvi
14列目から全てセルの巾15ピクセルで固定されてます。指定したピクセル数に伸ばしたり縮めたりしたいんですがどうしたらいいですか?

privata Function AAA(objTarSht,intPicel)

clmTar=14
do until objTarSht.Cells(1,clmTar)=空

ここ

clmTar=clmTar + 1

loop
0378デフォルトの名無しさん
垢版 |
2020/05/30(土) 17:25:53.46ID:4gyXKXc6
>>377
Private Function AAA(objTarSht, intPixel)
  clmTar = 14
  Do Until objTarSht.Cells(1, clmTar) = ""
    Columns(clmTar).ColumnWidth = intPixel * 0.118
    clmTar = clmTar + 1
  Loop
0379デフォルトの名無しさん
垢版 |
2020/05/30(土) 17:36:07.32ID:x6N4SK2n
セルのHJ1に式で「=TEXT(EDATE(DE2,(DAY(DE2)>20)+(DT2<>"")),"yyyy""_""m")」をいれて、
最下行までオートフィルをして、HJ列をコピペで値だけにしていますが
vbaのforで作ってみたいので、この部分をVBAにした場合のコードを教えてください

「=TEXT(EDATE(DE2,(DAY(DE2)>20)+(DT2<>"")),"yyyy""_""m")」
0381デフォルトの名無しさん
垢版 |
2020/05/30(土) 18:14:09.22ID:HFWpOc40
>>359
馬鹿は書かなければいいのに
0382379
垢版 |
2020/05/30(土) 18:40:42.91ID:x6N4SK2n
=TEXT(
EDATE(DE2,
(DAY(DE2)>20)+(DT2<>""))
,"yyyy""_""m")
の並び順で

For cnt = 2 To i

Range("HJ1") =

Format( _'「=TEXT(」にあたる部分

**********'「EDATE(DE2,」EDATEにあたる部分

'「(DAY(DE2)>20)+(DT2<>""))」にあたる部分
DateSerial(Range("DE" & cnt) > 20 + (Range("DT" & cnt) <> "") 

,"yyyy""_""m" '「,"yyyy""_""m")」にあたる部分

Next cnt
0384デフォルトの名無しさん
垢版 |
2020/05/30(土) 19:06:40.97ID:RuztwjMU
>>383
ユーザーフォームのボタンにあてがうと
有り難みが薄れるらしく
最近作るのを断ってるわ
0386デフォルトの名無しさん
垢版 |
2020/05/30(土) 20:13:00.67ID:v+h7hopE
>>367
マクロ記録でできるレベルじゃないから苛ついてんの?できるんなら言われても仕方ないだろ
ソフト屋じゃなけりゃ再利用とか考えるわけないし
0388デフォルトの名無しさん
垢版 |
2020/05/30(土) 21:05:02.60ID:n48qxrxQ
>>372
逆に「VBAができるわたし」は
ExcelやWordの複雑な機能のことに異常に詳しいと思われてて
難解な作業を仕事で依頼される。
それをVBAで解決できるかできないかにかかわらず。
0390デフォルトの名無しさん
垢版 |
2020/05/30(土) 21:10:58.46ID:n48qxrxQ
>>364
これはなにで動いているのですか?
0392デフォルトの名無しさん
垢版 |
2020/05/30(土) 21:45:04.41ID:/9v+/+fv
>>382

式が何をしようとしているのか不明。
・何でHJ1(1行目)で2行目の値を評価しているの?
・20日以降は次月として捉えているように見えるけどDT列には何が入るの?
 空じゃなければ更に月を進める?

Forの使い方という点にコメント
これだけじゃ cnt がどこまで回ればよいかわからんよね。たとえば、
 i = 30
For cnt 2 To i
とするか、
For cnt 2 To 30
とかすれば、Loopはする。

でも書き込むセルが Range("HJ1") に固定されてるから、これじゃ同じセルに
30回、延々と上書きするだけになる。

書き込み先を動的に変える場合は、範囲Objectは Range("番地")じゃなくて、
Cells(行番号、列番号)を使うといい。この中でcntを使えば。

EDATE関数にあたるVBA関数はDateAdd
TEXT関数はFormatでOK。
0393デフォルトの名無しさん
垢版 |
2020/05/30(土) 21:53:02.87ID:IeNY1P6O
>ExcelやWordの複雑な機能のことに異常に詳しいと思われてて

ありがちな誤解だよな。
プログラムがわかるから細かい機能を知らなくてもどうにか出来るわけで、
0398デフォルトの名無しさん
垢版 |
2020/05/31(日) 01:47:47.46ID:6kaO8G32
初歩的ですみませんが、sub ()の()の中に文字列が入ることありますか?
買った教本の例題にこの中に文字列が書かれてるのが一つだけあるんですが、おそらくそのせいでマクロが動きません
0399デフォルトの名無しさん
垢版 |
2020/05/31(日) 02:38:20.45ID:2V+gQfrN
>>398
理解できない奴には無理
0400デフォルトの名無しさん
垢版 |
2020/05/31(日) 02:39:52.93ID:86R8wtw/
>>391
なんでわたしだけ仕事が増えるんだ
この馬鹿モンが!
0401デフォルトの名無しさん
垢版 |
2020/05/31(日) 02:41:39.96ID:86R8wtw/
しかも周りに座ってるような同僚は
わたしより仕事スピードが1/2〜1/10の人たちばかりなのに。
0406デフォルトの名無しさん
垢版 |
2020/05/31(日) 02:56:41.46ID:2V+gQfrN
>>403
この段階でわからないこと自体無理なんだよ
仕組みを理解しなければ無理
公式だけ暗記して終わりの馬鹿には無理なんだよ
0409蟻人間 ◆T6xkBnTXz7B0
垢版 |
2020/05/31(日) 04:00:28.58ID:KExNe49d
エクセルにはリファレンスマニュアルが付属していて、追加でインストールするとF1ヘルプで言語仕様まで見られる。
マニュアルがパソコンに入ってなかったら、管理者からエクセルのシーディーを借りてね。
0412デフォルトの名無しさん
垢版 |
2020/05/31(日) 08:57:53.05ID:C8J9R7KI
Sub Test0001()
 Dim i As Integer
 
 For i = 1 To 2
  Dim ary()
  
  MsgBox "ここにブレークポイント設定"
  
  ary = Sheet1.Range(Cells(1, i), Cells(5, i))
 Next i
End Sub


A列とB列にあるいずれも5行目までの値を配列に取得するだけのプログラム
For中の一回転目はA列、2回転目はB列

こうやってForの中でaryを宣言し直せば、aryは初期化されると思い込んでたんだけどダメなのな
2回目にMsgBoxで止まったときにaryみるとA列のデータがaryに残ってしまってる
これってメモリ上に残ってて同じ所を参照し直すからなのかな
Eraseすれば消えるからいいんだけど、気づくのに時間かかったわ
こんな初歩的なこと分かってないでよく今まで組んできたもんだ
0415デフォルトの名無しさん
垢版 |
2020/05/31(日) 10:44:01.62ID:GCI/GpSg
>>412
そういう動作を知るためのテストなんじゃね
残っていても上書きされるんだから問題ないし
0418デフォルトの名無しさん
垢版 |
2020/05/31(日) 12:34:25.47ID:GcFwCYXw
>>412
VBAのDimは書いた場所に関係なく、コード開始時に1回だけ実行される仕様
モジュールの最後に書いても結果は変わらない
Sub Test()
  Dim a()
  For i = 0 To 9
    Dim b()
  Next
  Dim c()
End Sub
0419デフォルトの名無しさん
垢版 |
2020/05/31(日) 12:42:20.77ID:C8J9R7KI
>>413
あーなるほど
そこを考えるんですか、勉強になりましたわ
ただ、改めて疑問に思ったのは、同じブロックスコープ内で再度宣言してもエラーでないのはどういうことなんだろーとか
Forの中での宣言だと繰り返しといっても宣言部分は無視されるってことかな
ま、同じ事しないようにちゃんとおぼえておこ・・・

>>415
このプログラムだとそうなんだけど
ary = Sheet1.Range(Cells(1, i), Cells(5, i))
この部分が、ある条件を満たした場合のみ代入するっていうコードだとします
んで、条件満たさなかった場合には代入されないため、A列のデータがaryに残っちゃっておかしな事になっちゃってたわけですよ
自分で実際に組んでるコードはも少し複雑なものなので
■ このスレッドは過去ログ倉庫に格納されています

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