TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
日本語プログラミング言語Mind
Android Studio Part3
Ruby 初心者スレッド Part 63
+ JavaScript の質問用スレッド vol.123 +
プログラミング言語 Scala 11冊目
統計解析R たぶんpart3くらい
スレ立てるまでもない質問はここで 148匹目
proce55ing プログラミングアート全般
【R】configure大嫌い【RMS】

Excel VBA 質問スレ Part62


1 :2019/06/24 〜 最終レス :2019/08/29
!extend:checked:vvvvv:1000:512

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part61
http://mevius.2ch.sc/test/read.cgi/tech/1556203263/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured

2 :
保守

3 :
>>1
令和初乙

4 :
皆さん無知はいいんですよ
誰でも知らないこと、間違って理解してることはあるんだから

だけど知ったような口をきくから叩かれるのですよ
気をつけましょうね

5 :
令和初か

6 :
>>4
なんか辛い目にあったのか?

7 :
ムチでたたかれたいんじゃね

8 :
オートフィルターで抽出条件を変数にして繰り返し処理で1ずつ加算していくことは出来ませんか?
下記では出来ませんでした。

For i = 1 to 10
Range("A1").AutoFilter _
Field:=2, Criteria1:="i"
next

9 :
iの前後にある"は要らないのでは

10 :
何故ダブルクォーテーションで括ろうとしたのか全く意味不明。

11 :
なるほど!ありがとうございます。最初記録させてそれを元に1つずつやろうと思って、その名残で囲っていました。
助かります!

12 :
中二病みたいな感じにしたらこうかな?

┌→ FoR Z = 1 ─┐
│           └→ 10
│ RANgE("A1").AutoF F = 2, C = Z
│        │
└┐       │
  └ NExT   │
          ↓
          ×

13 :
面白さを解説してくれ

14 :
感じ取れよ・・・

15 :
そこはNExTじゃなくてNeXTにしないと

16 :
VBAができるようになると、xlsmのファイルの中には、普通のワークブック関数って使ったりしないんですか?

例えば、セルの値を別のセルに入れたりとか、if関数とか、簡単なものも
全部 VBAで書いたりするんですか??

それとも混在するんですかね??

17 :
>>16
マクロでないと出来ないことをするために使うのが普通

18 :
>>16
処理の内容によって関数の方が良い場合とVBAの方が良い場合がある。
だから内容次第。
混在もあり得る。

でもVBAメインで考えてる時は関数のことは忘れがちで全部VBAにしてしまうことも多い。
あと、自分が組む場合はそもそも関数じゃ無理な処理が多い。

19 :
変えられがちなセル関数をリセットするようなのとか

20 :
>>16
しない。
VBAが出来るようになると、発想自体が変わるから。
手で数字を入れて、計算式で答えを出す、みたいな使い方にならなくなる。

コマンドボタンを押すと、Webとかデータベースから自動で情報を探してきて、
シートに必要な答えだけを表示するとか、そんな使い方になる。

21 :
>>16
ワークシート関数の方が100倍早いからできないことだけVBAを使う

22 :
>>21
それは関数とかバージョンによると思うけど・・。
2013のVLOOKUPなら、VBA+SQLの方が何倍も速いし。

23 :
超初心者へのアドバイスなんだからザックリでいいんだよ

24 :
だな

>>16
ワークブック関数ていうものは使ったことないから分からないスマン

25 :
意味なくマクロ仕込んでるファイルは嫌われるので関数で済むものはなるべくそちらで

26 :
ワークシート関数でできることはワークシート関数で済ませて
データの差し替えとかそういうところだけVBAを使う

27 :
そうすると関数とVBAの2つを覚える必要があるからVBAで出来るならBBAでやるのが簡単

28 :
>>26
それってコンセンサスないと思えよ

29 :
コンセンサスは無いけど実務上>>26が一番安定するな

30 :
無駄にVBA使われてると「これ作った人承認欲求強いんかな」って思うわ
臨機応変に使い分けできる方がいい

31 :
基本ワークシート使って無理なものはVBAかな

そもそもワークシート使わないならVBAも使わないな

32 :
式が長くなったり作業列がいくつも必要になるような処理はVBAだわ
深いネストとか配列数式とか使うのもいいけど、ワークシート関数だけにこだわると、見通しや保守性が悪くなることもあるし

地味に厄介なのが条件付き書式
これも他人が作ったのを保守すると地獄を見ることになる

33 :
保守性で考えると名前の定義が割と曲者
大抵ぶっ壊れてる

34 :
>>33
範囲名のこと?

35 :
>>32
> 地味に厄介なのが条件付き書式
> これも他人が作ったのを保守すると地獄を見ることになる
頑張ってA1:A10に設定したのに次に見たらA1:A3,A4,A5:A7,A8:A9,A10に分割されてたり
マージしろとまでは言わないけど設定した奴を崩すなよ…

36 :
コピーペーストすると範囲がぶっ壊れるんだ

37 :
条件付き書式が壊れるのは仕様らしいぞ
よって改善される見込みも薄い

38 :
VBAで設定するの追加しとけばOK

39 :
関数と条件付き書式は被害者。
これ自体は何も悪くないのに、知らないうちに壊すアホのせいで、
糞みたいに思われてる。

40 :
それは仕組みが悪い
人のせいにしてはいかんずら

41 :
ちょっとニッチな質問失礼します。

バーコードによる品物管理のvbaの検討中です。

バーコードをスキャンした際に、数字に交じって、
グループセパレータ(GS) Asciiコード(0x1d)が出力されるタイプのバーコードを
スキャンした際、文字として存在しない、Ascii 0x1dが入力されたことを検知する術は
何かあるでしょうか。

スキャンしたデータは例えば、0000(0x1d)1234という形でスキャナから飛んできてるはずなのですが、
エクセル上の表記は、当然ながら00001234となってしまいます。

飛んでくる文字のasciiコードを逐一キャッチできれば、0x1dを検知できるかと思うのですが、
vbaでそんなこと可能でしょうか。

42 :
>>41
方法は読み取り機ごとに違う
機種によって可能だったり困難だった不可能だったりする
詳細はメーカーに問い合わせるしかない

43 :
>>41
どういう形でスキャン結果が来るのか知らんけど、文字列であれば
chr系の関数で一文字ごとに判定してみれば

44 :
>ちょっとニッチな質問失礼します。

ここの用途不明の質問に比べたら、
バーコードなんて超普通。

45 :
>>41
検知するだけだったら
0< InStr(s, ちゃー(&H1d))
ではダメなの?

46 :
Chr が投稿出来ないのか

47 :
バーコードリーダーを買い換える
二千円くらいであるでしょ

48 :
おれはUSB-COMでの読取りに挑戦してるけど
なかなかうまくいかないわ

49 :
スマホアプリ使ってるな
COGNEXのSCANNERってやつ

>>41
2つに分けたほうが良いと思う
・バーコードスキャン、文字をセルに入力
・入力したセルに対してvbaでfindか何かで検知。changeイベントになると思う

50 :
>>41
隣のセルで数値変換するか
そのセルの形式を数値にするではだめ?

51 :
>>49
> 2つに分けたほうが良いと思う
それなんの意味があるんだ?

52 :
>>30
拡張子が.xlsmだったからどんなコードが書かれてるのかと
エディタ開いて見てみたらModule1, Module2, Module3と並んでて
全部、なんもコード書かれてなく、各SheetやWorkbookにも全くコードが書かれてなかったわ

53 :
>>51
入力中の文字を触るのはIMEやらオートコンプリートやらと競合して、あまり良くない
セルの内容を確定させてから、改めて触ったほうが良い

54 :
ここ数週間、入門本とかサイトとか見ながら勉強して、
渾身のコードができたんだけど、誰か批評してくれるかい??


脱初級者になったか見て、アドバイス欲しいんだけど…

55 :
>>54
半年間そのコードを見ずに放置してから
もう一度そのコードを見てみて何やってるのか
サクッと分かれば脱初級者

56 :
>>54
暇だし上げれば見てやるぞ

57 :
>>55
なるほど。。。

>>56
ありがとうございます。
ちょっと長すぎて書き込みエラーになりました

分割して貼ります

58 :
お願いします・・・




Option Explicit

Sub 明細書作成()

Dim wsMeisai As Worksheet
Set wsMeisai = worksheets("明細書")

Dim wsData As Worksheet
Set wsData = worksheets("データ")

Dim wsSettei As Worksheet
Set wsSettei = worksheets("設定")



'明細書シートの表の基点
Dim meisaiKiten As Range
Set meisaiKiten = wsMeisai.Range("o8")

'データシートの票の基点
Dim dataKiten As Range
Set dataKiten = wsData.Range("A5")

'設定シートの組合員リストの基点
Dim listKiten As Range
Set listKiten = wsSettei.Range("A3")

59 :
'########### 転記 ###########

'明細シートの組合員を定義(オブジェクトじゃないので注意)
Dim kumiaiin As String
kumiaiin = wsMeisai.Cells(7, 3)


'------- 設定シートの組合員リストから検索して正式名を転記 ------

' 検索回数定義
Dim a As Long

For a = 0 To 14

If wsSettei.Cells(listKiten.Row + a, 1) = kumiaiin Then

'ヒットしたものを転記
meisaiKiten.Offset(-4, 0).Value = listKiten.Offset(0 + a, 1).Value & " 御中"

End If

Next a


'------- 請求月の転記 ------

meisaiKiten.Offset(-2, 5).Value = wsMeisai.Cells(15, 3)

60 :
'########### 昇順ソート ###########

'データシートの票をソート(アクティブにしないとエラー)
wsData.Activate
wsData.Range(dataKiten, Cells(dataKiten.CurrentRegion.Rows.Count + 1, 6)).Sort _
key1:=dataKiten, _
order1:=xlAscending
wsMeisai.Activate

61 :
'############ 検索 #############

'明細書の票をクリア
wsMeisai.Range(meisaiKiten, meisaiKiten.Offset(30, 5)).ClearContents

'明細書の票の行数定義
Dim meisaiRow As Long
meisaiRow = 0

'検索回数を定義
Dim i As Long

For i = 0 To dataKiten.CurrentRegion.Rows.Count - 2




'--------日付での検索--------

Dim firstDate As Date
Dim lastDate As Date

firstDate = wsMeisai.Cells(13, 3)
lastDate = wsMeisai.Cells(15, 3)

If wsData.Cells(dataKiten.Row + i, 1) >= firstDate And wsData.Cells(dataKiten.Row + i, 1) <= lastDate Then

62 :
'---------組合員名で検索---------

If wsData.Cells(dataKiten.Row + i, dataKiten.Column + 4) = kumiaiin Then

'ヒットしたものを転記
meisaiKiten.Offset(meisaiRow, 0).Value = Month(dataKiten.Offset(0 + i, 0).Value)
meisaiKiten.Offset(meisaiRow, 1).Value = Day(dataKiten.Offset(0 + i, 0).Value)
meisaiKiten.Offset(meisaiRow, 2).Value = dataKiten.Offset(0 + i, 1).Value
meisaiKiten.Offset(meisaiRow, 3).Value = dataKiten.Offset(0 + i, 2).Value
meisaiKiten.Offset(meisaiRow, 4).Value = dataKiten.Offset(0 + i, 3).Value
meisaiKiten.Offset(meisaiRow, 5).Value = dataKiten.Offset(0 + i, 5).Value

meisaiRow = meisaiRow + 1

End If

End If

Next i

End Sub

63 :
すみません。
ちょっと長いんですが、よろしくお願いします!

なんか2chに貼るとインデントが消えました...

64 :
>>53
セルに入れてわざわざイベントでやるというのが意味不明
VBAでやるなら普通に変数に入れればいいだけだろ

65 :
>>63
・無駄な改行が多すぎる
・この長さならfunction分けたほうが良いかも知れない。まぁvbaならどっちでもいいけどな
https://i.imgur.com/KicuV2d.png

>>64
それが出来ればそれでokだけど、
スキャンした文字列をvbaで受ける方法が良く分からない

66 :
>>63
一応だけど、コードはこのままだと動かないぞ
こういう感じで書くと見やすくなるってだけ

67 :
>>65
> スキャンした文字列をvbaで受ける方法が良く分からない
>>42

68 :
>>67
だろ、だからその方法は回答できない

69 :
>>65
ありがとうございます!
なんか見やすいです。

ちょっと自分のをいじくってみます!

70 :
>>68
回答もできないのに
> 入力中の文字を触るのはIMEやらオートコンプリートやらと競合して、あまり良くない
とか言ってたのかよw

71 :
組み込みのソート機能ってアクティブにしないとエラーになるのか…
知らんかった

72 :
>>66
だよな。
プロシージャ内で宣言したものを、
プロシージャ外で使う方法があるのかと思って、ビックリしたわ。

73 :
ということは、dimしてる行を全部外に出せば良いのですかね?

今いじくっているんですが、俺のレベルでいじくると、動かなくなりそうでコワイ...

74 :
>>70
そんなに面白いの?

>>73
まぁメインはできるだけシンプルにして、各ルーチンを外に出せば、
この先処理が増えてもメンテが楽って事
今から書き直すのは大変だからやらないほうが良い。そこに意味はあまり無い

75 :
>>73
いや、全部じゃなく、複数のプロシージャで使うものだけね。
あと、「脱初心者」ってことなら、1セルずつ処理するのではなく、
配列に入れてからの方がいい。
あとは、ループで探すんじゃなくて、
アドバンスドフィルタで一気に取り出して、後から書式を加工するとか。

76 :
↑理由を書いてなかった。
1セルずつだと、件数が多くなってきた時に遅いから。

77 :
>>74
> そんなに面白いの?
知ったかをバカにしてるだけ
あと今時グローバル変数を勧めるなよ…

78 :
>>74
わかりました。別のを作るときの課題にします!

>>75

1、あと、「脱初心者」ってことなら、1セルずつ処理するのではなく、
配列に入れてからの方がいい。

2、あとは、ループで探すんじゃなくて、
アドバンスドフィルタで一気に取り出して、後から書式を加工するとか。

この2点、今の俺には知識がなく、どんな処理になるのかイメージがわかないので、ちょっと勉強します!




お二方、アドバイスありがとうございました!
プログラミング、スゲーおもろいです。

79 :
これからプログラムを勉強する人への最大のアドバイスはVBAなんか辞めとけ

80 :
>>78
1は>>76にもあるが処理速度の問題

状況によってはとてつもなく遅くなる

81 :
>>65
一般的に多いキーボ−ドインターフェースの場合、スキャンしたものを取り込むのは難しいぞ。
多分、ここにいる人達じゃ無理だと思う。
キーボ−ドフックのコードが書けるかどうかだね。
シリアルの場合は簡単だけど。

セル内の文字列に1Dが含まれている可能性が高いからスキャンした文字を受ける必要は無いと思う。
それに面倒なキ−ボードフックのコードを書く前にセル内の文字列に含まれているかを確認する方が先だ。

82 :
キーボ−ド
キ−ボード

何故

83 :
キーボードフック知ってる俺すげー君登場ww

84 :
>>83
普通の知識だよ
グローバルフックって言う方が通りが良い気はするけど

85 :
キーボードI/Fと同じと見なせるって前提なの?

86 :
>>85
それが分かっていないから答えようがない

87 :
>>84
>>81によると
> 多分、ここにいる人達じゃ無理だと思う。
らしいよww
まさかと思うけど揶揄してることはわかってるよね?

88 :
>>87
どうでもいいかな
回答もできない無能に自覚してほしいだけで

89 :
キーボードをフックしていいのは昭和時代まで
Windowsではイベントハンドラを作るんだよ

90 :
>>58
このコードはシートに書いてるのかモジュールに書いてるのかどっち?

91 :
なぜ突然キーボードフックが出てくるんだ…
まさかバーコードスキャナーが出力ををVKほにゃららで送ってくるのか?
そんな変態デバイスあんの?

92 :
> 回答もできない無能に自覚してほしいだけで
昭和脳の渾身の回答w
・グローバル変数
・グローバルフック
マジで邪魔でしかないな

93 :
>>92
煽るならもうちょっと真面目にやってくれ、他人のレスの寄せ集めじゃないか
全然ダメージないぞ、画面の向こうの相手をR気でやれ

94 :
>マジで邪魔でしかないな

お前が言うな。
qzOxQgj0で検索したら、役に立つ情報1つも書いてないじゃないか。
そういうのを邪魔というんじゃないか?

95 :
スキャンした文字列をVBAで受けるのが分からないと書いてたから、それは難しいぞと返しただけなんだが。
難しいのさえ知らなかった人達が多いんだからな。
そりゃ、ここじゃ無理だろ。

だからまず問題のスキャナから入力されたセルの値に1Dが入ってるかをまず確認してほしいんだがね。

96 :
>>91
バーコードスキャナは全然違うものを送って来るよな。
キーボードの仕組みを知っている人は少ない。
VBA関係なく世間一般にプログラマーと呼ばれる人達においても。

メイクコード、ブレイクコードとかコマンドとかね。

97 :
>>93
> 全然ダメージないぞ、画面の向こうの相手をR気でやれ
自覚がないとか最悪だな
まあ自覚あったら回線切って二度と出てこれないわな

>>94
> qzOxQgj0で検索したら、役に立つ情報1つも書いてないじゃないか。
害悪な情報ドヤるよりマシだろw
まさかグローバル変数を勧めるのが役立つ情報とか言わないよな?

98 :
>>97
お前は自分が誰に向かって話してるのかも分からんのか?
滑稽だなあ。

99 :
キーボードフック知ってる俺すげー君乙w

100 :
>ID:/qzOxQgj0
なんでそんなに必死なの?


100〜のスレッドの続きを読む
Python の宿題ここで答えます Part 2
datファイルを共有するP2Pソフト o2on 17dat
プログラミングのお題スレ Part14
いもうとデスクトップを実際に作ってみないか?3
【初心者歓迎】最新COBOLについての質問スレ
Visual Studio Code / VSCode Part4
次世代言語15 Go Rust Bosque Kotlin TypeScript
【Delphi互換!?】FreePascal/Lazarus その2【GPL】
【SL4】Windows Phone 7 アプリ開発スレ Part4【XNA】
OpenGL/Vulkanスレ Part22
--------------------
石川かすみ・その4
【コロナ速報】東京都で新たに40人以上の感染者★13
第49回衆議院議員総選挙・議席予想情勢スレ その9【周南ニート出禁】
【疑問】柳田のグロ守備が金本や倉本のようにネタにされないのは何故なのか?
【納豆】大豆製品【豆乳】
あしたのために(その1)
ラブライブ!総合 1141stLIVE
【復活】StoneAge ストーンエイジ 第50記【日本】
【オモニ】前原誠司【献金】
野村不動産パートナーズ
【sage】tvk第2831開放区【マターリ】
【経済】賃金が上がらない国になった、日本を待ち受ける「修羅場」
【マタ〜リ】バイク屋さんの集い【日記】Part29
【Switch】ファイアーエムブレム風花雪月 Part434
☆ワークマン スレ★Part40
横浜カジノ誘致“ハマのドン”「命張ってでも反対」
懺悔スレ15
蕎麦打ち
メーザーハウス Part4
マインクラフトあるある
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼