Excel VBA 質問スレ Part62

■ このスレッドは過去ログ倉庫に格納されています
1
垢版 |
2019/06/24(月) 00:21:37.48
!extend:checked:vvvvv:1000:512

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

※前スレ
Excel VBA 質問スレ Part61
http://mevius.5ch.net/test/read.cgi/tech/1556203263/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/06/24(月) 09:54:51.06ID:pOxYP/iS0
保守
2019/06/24(月) 10:30:40.50ID:/dcVGEspM
>>1
令和初乙
2019/06/24(月) 13:02:31.59ID:H9TPhtT7a
皆さん無知はいいんですよ
誰でも知らないこと、間違って理解してることはあるんだから

だけど知ったような口をきくから叩かれるのですよ
気をつけましょうね
5デフォルトの名無しさん
垢版 |
2019/06/24(月) 15:03:11.87
令和初か
2019/06/24(月) 20:50:58.37ID:zxVE+D4VM
>>4
なんか辛い目にあったのか?
2019/06/25(火) 20:13:59.77ID:YzkEODl+a
ムチでたたかれたいんじゃね
2019/06/26(水) 18:24:48.22ID:0wa1QMM+d
オートフィルターで抽出条件を変数にして繰り返し処理で1ずつ加算していくことは出来ませんか?
下記では出来ませんでした。

For i = 1 to 10
Range("A1").AutoFilter _
Field:=2, Criteria1:="i"
next
2019/06/26(水) 18:55:16.75ID:WMWleXLcr
iの前後にある"は要らないのでは
2019/06/26(水) 21:19:57.14ID:G0xbFDCN0
何故ダブルクォーテーションで括ろうとしたのか全く意味不明。
2019/06/26(水) 21:32:13.70ID:0wa1QMM+d
なるほど!ありがとうございます。最初記録させてそれを元に1つずつやろうと思って、その名残で囲っていました。
助かります!
2019/06/26(水) 23:33:00.96ID:HbMJ8lDB0
中二病みたいな感じにしたらこうかな?

┌→ FoR Z = 1 ─┐
│           └→ 10
│ RANgE("A1").AutoF F = 2, C = Z
│        │
└┐       │
  └ NExT   │
          ↓
          ×
2019/06/27(木) 01:44:52.76ID:wmQpTLu90
面白さを解説してくれ
2019/06/27(木) 04:56:56.51ID:LPdAyFsH0
感じ取れよ・・・
2019/06/27(木) 05:07:29.23ID:qGKhWTNI0
そこはNExTじゃなくてNeXTにしないと
16デフォルトの名無しさん (ワッチョイ d602-/vdH)
垢版 |
2019/06/27(木) 19:55:21.93ID:M8DBqUMl0
VBAができるようになると、xlsmのファイルの中には、普通のワークブック関数って使ったりしないんですか?

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

それとも混在するんですかね??
2019/06/27(木) 20:02:20.18ID:rZhnxql+0
>>16
マクロでないと出来ないことをするために使うのが普通
2019/06/27(木) 20:02:49.59ID:JZwmukYw0
>>16
処理の内容によって関数の方が良い場合とVBAの方が良い場合がある。
だから内容次第。
混在もあり得る。

でもVBAメインで考えてる時は関数のことは忘れがちで全部VBAにしてしまうことも多い。
あと、自分が組む場合はそもそも関数じゃ無理な処理が多い。
2019/06/27(木) 21:14:07.66ID:8D+6ahzu0
変えられがちなセル関数をリセットするようなのとか
2019/06/27(木) 23:03:15.57ID:It0Wr+rk0
>>16
しない。
VBAが出来るようになると、発想自体が変わるから。
手で数字を入れて、計算式で答えを出す、みたいな使い方にならなくなる。

コマンドボタンを押すと、Webとかデータベースから自動で情報を探してきて、
シートに必要な答えだけを表示するとか、そんな使い方になる。
21デフォルトの名無しさん (ワッチョイ 3e8c-zD22)
垢版 |
2019/06/27(木) 23:08:08.30ID:T3xK78tz0
>>16
ワークシート関数の方が100倍早いからできないことだけVBAを使う
2019/06/27(木) 23:50:13.90ID:It0Wr+rk0
>>21
それは関数とかバージョンによると思うけど・・。
2013のVLOOKUPなら、VBA+SQLの方が何倍も速いし。
23デフォルトの名無しさん (ワッチョイ 3e8c-zD22)
垢版 |
2019/06/27(木) 23:52:45.12ID:T3xK78tz0
超初心者へのアドバイスなんだからザックリでいいんだよ
2019/06/28(金) 00:44:00.93ID:PbHMOvL40
だな

>>16
ワークブック関数ていうものは使ったことないから分からないスマン
2019/06/28(金) 00:52:55.40ID:4xkaC8y70
意味なくマクロ仕込んでるファイルは嫌われるので関数で済むものはなるべくそちらで
2019/06/28(金) 09:16:53.79ID:caJaiAqwM
ワークシート関数でできることはワークシート関数で済ませて
データの差し替えとかそういうところだけVBAを使う
27デフォルトの名無しさん (スプッッ Sdea-mW/F)
垢版 |
2019/06/28(金) 09:29:37.11ID:jtjZs4Dcd
そうすると関数とVBAの2つを覚える必要があるからVBAで出来るならBBAでやるのが簡単
2019/06/28(金) 09:35:04.68ID:IiKC1YBqM
>>26
それってコンセンサスないと思えよ
2019/06/28(金) 09:37:37.70ID:8sFMCkEs0
コンセンサスは無いけど実務上>>26が一番安定するな
2019/06/28(金) 10:08:23.19ID:Ge4DIzuq0
無駄にVBA使われてると「これ作った人承認欲求強いんかな」って思うわ
臨機応変に使い分けできる方がいい
2019/06/28(金) 12:12:11.20ID:8ZSyBqDMa
基本ワークシート使って無理なものはVBAかな

そもそもワークシート使わないならVBAも使わないな
2019/06/28(金) 13:05:33.48ID:Ug9PnKsO0
式が長くなったり作業列がいくつも必要になるような処理はVBAだわ
深いネストとか配列数式とか使うのもいいけど、ワークシート関数だけにこだわると、見通しや保守性が悪くなることもあるし

地味に厄介なのが条件付き書式
これも他人が作ったのを保守すると地獄を見ることになる
2019/06/28(金) 13:39:24.53ID:lRyPlVqwM
保守性で考えると名前の定義が割と曲者
大抵ぶっ壊れてる
2019/06/28(金) 17:29:45.12ID:IiKC1YBqM
>>33
範囲名のこと?
2019/06/28(金) 19:13:18.48ID:7K6czL1cM
>>32
> 地味に厄介なのが条件付き書式
> これも他人が作ったのを保守すると地獄を見ることになる
頑張ってA1:A10に設定したのに次に見たらA1:A3,A4,A5:A7,A8:A9,A10に分割されてたり
マージしろとまでは言わないけど設定した奴を崩すなよ…
2019/06/28(金) 19:24:19.77ID:8sFMCkEs0
コピーペーストすると範囲がぶっ壊れるんだ
2019/06/28(金) 19:30:02.78ID:iRyUn2/nM
条件付き書式が壊れるのは仕様らしいぞ
よって改善される見込みも薄い
2019/06/28(金) 20:30:33.91ID:E4Gg/kBRd
VBAで設定するの追加しとけばOK
2019/06/28(金) 22:15:25.94ID:x+6aVDsg0
関数と条件付き書式は被害者。
これ自体は何も悪くないのに、知らないうちに壊すアホのせいで、
糞みたいに思われてる。
2019/06/28(金) 22:55:25.47ID:3rVPyv1n0
それは仕組みが悪い
人のせいにしてはいかんずら
2019/06/29(土) 00:26:23.28ID:n02ql8lh0
ちょっとニッチな質問失礼します。

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

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

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

飛んでくる文字のasciiコードを逐一キャッチできれば、0x1dを検知できるかと思うのですが、
vbaでそんなこと可能でしょうか。
2019/06/29(土) 00:30:19.89ID:+e4iLYRh0
>>41
方法は読み取り機ごとに違う
機種によって可能だったり困難だった不可能だったりする
詳細はメーカーに問い合わせるしかない
2019/06/29(土) 00:48:05.66ID:N8jtlPKB0
>>41
どういう形でスキャン結果が来るのか知らんけど、文字列であれば
chr系の関数で一文字ごとに判定してみれば
2019/06/29(土) 01:05:03.58ID:ZIaZJNy10
>ちょっとニッチな質問失礼します。

ここの用途不明の質問に比べたら、
バーコードなんて超普通。
2019/06/29(土) 06:38:14.13ID:e27Fxp8l0
>>41
検知するだけだったら
0< InStr(s, ちゃー(&H1d))
ではダメなの?
2019/06/29(土) 06:44:07.39ID:e27Fxp8l0
Chr が投稿出来ないのか
2019/06/29(土) 07:42:08.89ID:63PqHEX+0
バーコードリーダーを買い換える
二千円くらいであるでしょ
2019/06/29(土) 08:02:50.58ID:pdRWGZY40
おれはUSB-COMでの読取りに挑戦してるけど
なかなかうまくいかないわ
2019/06/29(土) 08:41:34.78ID:ar/F9wgf0
スマホアプリ使ってるな
COGNEXのSCANNERってやつ

>>41
2つに分けたほうが良いと思う
・バーコードスキャン、文字をセルに入力
・入力したセルに対してvbaでfindか何かで検知。changeイベントになると思う
2019/06/29(土) 09:25:17.71ID:xZ6rSaRmM
>>41
隣のセルで数値変換するか
そのセルの形式を数値にするではだめ?
2019/06/29(土) 12:25:05.67ID:/qzOxQgj0
>>49
> 2つに分けたほうが良いと思う
それなんの意味があるんだ?
2019/06/29(土) 12:33:19.42ID:18j8PEbp0
>>30
拡張子が.xlsmだったからどんなコードが書かれてるのかと
エディタ開いて見てみたらModule1, Module2, Module3と並んでて
全部、なんもコード書かれてなく、各SheetやWorkbookにも全くコードが書かれてなかったわ
2019/06/29(土) 12:40:20.18ID:ar/F9wgf0
>>51
入力中の文字を触るのはIMEやらオートコンプリートやらと競合して、あまり良くない
セルの内容を確定させてから、改めて触ったほうが良い
54デフォルトの名無しさん (ワッチョイ 15b3-H8Xf)
垢版 |
2019/06/29(土) 13:46:07.80ID:5z81DYWR0
ここ数週間、入門本とかサイトとか見ながら勉強して、
渾身のコードができたんだけど、誰か批評してくれるかい??


脱初級者になったか見て、アドバイス欲しいんだけど…
2019/06/29(土) 14:03:17.76ID:18j8PEbp0
>>54
半年間そのコードを見ずに放置してから
もう一度そのコードを見てみて何やってるのか
サクッと分かれば脱初級者
2019/06/29(土) 14:03:52.75ID:ar/F9wgf0
>>54
暇だし上げれば見てやるぞ
57デフォルトの名無しさん (ワッチョイ 15b3-H8Xf)
垢版 |
2019/06/29(土) 14:11:28.01ID:5z81DYWR0
>>55
なるほど。。。

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

分割して貼ります
58デフォルトの名無しさん (ワッチョイ 15b3-9NVx)
垢版 |
2019/06/29(土) 14:12:40.80ID:5z81DYWR0
お願いします・・・




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デフォルトの名無しさん (ワッチョイ 15b3-9NVx)
垢版 |
2019/06/29(土) 14:13:34.08ID:5z81DYWR0
'########### 転記 ###########

'明細シートの組合員を定義(オブジェクトじゃないので注意)
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デフォルトの名無しさん (ワッチョイ 15b3-9NVx)
垢版 |
2019/06/29(土) 14:14:27.70ID:5z81DYWR0
'########### 昇順ソート ###########

'データシートの票をソート(アクティブにしないとエラー)
wsData.Activate
wsData.Range(dataKiten, Cells(dataKiten.CurrentRegion.Rows.Count + 1, 6)).Sort _
key1:=dataKiten, _
order1:=xlAscending
wsMeisai.Activate
61デフォルトの名無しさん (ワッチョイ 15b3-9NVx)
垢版 |
2019/06/29(土) 14:15:48.93ID:5z81DYWR0
'############ 検索 #############

'明細書の票をクリア
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デフォルトの名無しさん (ワッチョイ 15b3-9NVx)
垢版 |
2019/06/29(土) 14:16:14.86ID:5z81DYWR0
'---------組合員名で検索---------

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デフォルトの名無しさん (ワッチョイ 15b3-H8Xf)
垢版 |
2019/06/29(土) 14:18:49.64ID:5z81DYWR0
すみません。
ちょっと長いんですが、よろしくお願いします!

なんか2chに貼るとインデントが消えました...
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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