X



Excel VBA 質問スレ Part67

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん (ワッチョイ 33da-3+hg)
垢版 |
2020/06/26(金) 02:01:29.56ID:uDfmpksE0
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付ける

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

※前スレ
Excel VBA 質問スレ Part66
https://mevius.5ch.net/test/read.cgi/tech/1589085825/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
0851デフォルトの名無しさん (ワッチョイ 45ce-p0wA)
垢版 |
2020/08/13(木) 00:25:56.44ID:87HjPNaJ0
>>850
そういう時はセル範囲を変数にして、どっちかのインデックスを3で割るか掛けるかすればいいんだよ
それならメンテは一箇所で済む
データの範囲をxlUpとかUsedRangeなどで調べたりテーブル化すれば全自動にもできる
0852デフォルトの名無しさん (ワッチョイ 4549-p5K4)
垢版 |
2020/08/13(木) 01:36:11.66ID:cxZ8EfEa0
>>849
ありがとうございます
最初インデックスが有効範囲にないとエラーがでたので「arrIndex = 0」を
「arrIndex = 1」に変えたらできました
配列なので0から始まるということなのかと思ったんですが、1にしても
大丈夫なんでしょうか?出力した結果はForのものと同じだったので
貼り付け後に1行ずれるということはなさそうなんですが…

しかし確かに速いですね、配列
データを5000行×3列にしてテストしたら
For 約2.7秒
配列 約0.03秒
といった感じでした

>>850,851
コピー元のセル範囲は変数にして見出し行引いてnで割ったりして貼り付け先の
範囲を出してます
今回は決まった数字の方がいいかなと思って99行を3行ごとで33行、みたいに
してみました
0854デフォルトの名無しさん (ワッチョイ 451c-p0wA)
垢版 |
2020/08/13(木) 11:07:02.86ID:rrpNLQgi0
環境
windows 10 64bit
office 365 64bit
string型変数strにスペースを埋める単純なコードです。

Sub test()
Dim num_i As Integer
Dim num_l As Long
Dim num_ll As LongPtr
Dim str As String

Debug.Print "integer"; Len(num_i); TypeName(num_i)
Debug.Print "long"; Len(num_l); TypeName(num_l)
Debug.Print "longptr"; Len(num_ll); TypeName(num_ll)

num_i = 16: num_l = 16: num_ll = 16

str = Space(num_i): Debug.Print ">>"; str; "<<"
str = Space(num_l): Debug.Print ">>"; str; "<<"

''動かない
'str = Space(num_ll): Debug.Print ">>"; str; "<<"
''動く
str = Space(CLng(num_ll)): Debug.Print ">>"; str; "<<"
End Sub

このように64bitに対応していない組み込み関数って結構あるんのだろうか・・・
いつからか忘れたけど、 64bit推奨しているなら、これぐらい対応しろよ、毎糞がぁぁあ
excelの64bit環境って現状こんなものなの?
0855デフォルトの名無しさん (ワッチョイ 4549-p5K4)
垢版 |
2020/08/13(木) 11:30:36.17ID:cxZ8EfEa0
>>853
インデックスを確認したところ
rowIndex 1→1→1→4→4→4→7→7→7
colIndex 1→2→3→1→2→3→1→2→3
arrIndex 1→1→1→2→2→2→3→3→3
というように変化していきましたので大丈夫そうです、ありがとうございました
0859デフォルトの名無しさん (ワッチョイ 4549-p5K4)
垢版 |
2020/08/13(木) 14:08:49.69ID:cxZ8EfEa0
>>858
あ、そっちでしたか
エラーが出た状態のそれぞれのインデックスは
rowIndex 1
colIndex 1
arrIndex 0
でしたので、
tmpArr(arrIndex, colIndex) = tmp
のところが
tmpArr(0, 1) = tmp
になってエラー、ですかね?
0860デフォルトの名無しさん (ワッチョイ ad7c-s47K)
垢版 |
2020/08/13(木) 14:16:56.76ID:KWfn8cHZ0
>>859
tmpArrにインデックス0は存在しないのに指定するからエラーが出ていて、セル範囲を代入した時は1から始まることを知らなくても変数の状態をチェックすればすぐわかることだが、もしかしてローカルウィンドウとかを知らないパターン
0861デフォルトの名無しさん (ワッチョイ 4549-p5K4)
垢版 |
2020/08/13(木) 14:35:55.00ID:cxZ8EfEa0
>>860
あんまり使いこなせてはいないですがローカルウィンドウは表示させています
849さんが教えてくれたコードの中でarrIndexを「0」に指定しているのにはなにか
理由があるんじゃないかと思ったんですが、書き間違いとかでしょうか?
0864デフォルトの名無しさん (ワッチョイ 2e10-s47K)
垢版 |
2020/08/14(金) 07:43:46.87ID:whfJUs+50
VLOOKUPについての質問なんですが、

検索キー 検索範囲1 検索範囲2    産地
りんご    りんご     ぶどう      岡山産
        みかん    りんご      岡山産
        いちご     もも       岡山産
        りんご     ぶどう      山梨産
        みかん     なし       山梨産
        いちご     りんご      山梨産


りんごから別セルの検索範囲1を見た後に検索範囲2を見にいって産地の戻り値を得る関数を作りたいのですが、
検索キーのヒットで産地が重複した場合は表示を1度だけにして、期待する結果として「岡山県 山梨県」とだけ得られるような関数を作りたいです
VLOOKUPを&で繋げると「岡山県岡山県」と列の一番初めの戻り値しか得られません
VLOOKUP以外でもやり方があれば教えて頂ければ助かります
0865デフォルトの名無しさん (ワッチョイ 4290-p5K4)
垢版 |
2020/08/14(金) 11:35:06.45ID:DbBU1lOD0
>>864 マクロ作りました。
最大100件までヒット可能です。
長くなって申し訳ありません。
ご参考までに。(1/3)

Option Explicit
'/// 変数定義
Public j As Long 'ヒット件数
Public strArray(99) As String 'ヒットした産地の配列

Sub Main()

Call 初期化
Call 検索処理("B", 2)
Call 検索処理("C", 1)
Call メッセージ

End Sub
0866デフォルトの名無しさん (ワッチョイ 4290-p5K4)
垢版 |
2020/08/14(金) 11:35:39.43ID:DbBU1lOD0
Sub 初期化() '///グローバル変数の初期化  (2/3)
'/// 変数定義

Dim i As Long 'カウンタ
j = 0
For i = 0 To 99
strArray(i) = ""
Next i
End Sub

Sub 検索処理(pCol As String, pMovNum As Long)
'/// 変数定義
Dim i As Long 'カウンタ
Dim lngMaxRow As Long '処理数
Dim strKey As String '検索値
Dim strSanchi As String 'ワーク変数

'/// キー
strKey = ActiveSheet.Range("A2").Value
'/// 処理数
lngMaxRow = ActiveSheet.Range("B1000").End(xlUp).Row
'/// ループ
For i = 2 To lngMaxRow
If strKey = ActiveSheet.Range(pCol & i).Value Then
strSanchi = ActiveSheet.Range(pCol & i).Offset(0, pMovNum).Value
If 重複チェック(strSanchi, strArray()) = False Then
strArray(j) = strSanchi
j = j + 1
End If
End If
Next i
End Sub
0867デフォルトの名無しさん (ワッチョイ 4290-p5K4)
垢版 |
2020/08/14(金) 11:36:01.63ID:DbBU1lOD0
Function 重複チェック(pSanchi As String, pArray() As String) As Boolean(3/3)
'/// 変数定義
Dim i As Long 'カウンタ

'/// ループ
For i = 0 To 99
If pSanchi = pArray(i) Then
重複チェック = True
Exit Function
End If
Next i
重複チェック = False
End Function

Sub メッセージ()
'/// 変数定義
Dim i As Long 'カウンタ
Dim strAnswer As String 'ワーク変数

strAnswer = strArray(0)
'/// メッセージ出力
For i = 1 To j
If strArray(i) <> "" Then
strAnswer = strAnswer & "," & strArray(i)
End If
Next i
'/// 1件でもあれば表示
If j > 0 Then
MsgBox (strAnswer)
End If
End Sub
0868デフォルトの名無しさん (ワッチョイ ad7c-s47K)
垢版 |
2020/08/14(金) 12:26:16.36ID:RMq/G2m80
Dim obj As Object
Dim rng As Range

Set obj = CreateObject("Scripting.Dictionary")
For Each rng In Range(検索範囲)
 If rng.Value = Range("a2").Value Then
  With Cells(rng.Row, "d")
   If obj.exists(.Value) = False Then obj.Add .Value, 0
  End With
 End If
Next
Range("e1").Resize(obj.Count).Value = WorksheetFunction.Transpose(obj.keys)
Set obj = Nothing
0875デフォルトの名無しさん (スプッッ Sd1f-POXI)
垢版 |
2020/08/24(月) 18:59:52.50ID:ga12x2Hwd
A列には数字を手入力
B列には●があったりなかったり

B列に●がある場合A列に数字を(例えば100)入力するとメッセージボックス?がでて
「●があるから入力しちゃ駄目よ!どうしても"100"を入力したいの!?」
「OK」「キャンセル」
みたいにしたいんですがどーすればいいですか?
0879デフォルトの名無しさん (スップ Sd1f-5gYb)
垢版 |
2020/08/24(月) 20:27:42.41ID:N/ceNi6Ud
>>875だけどいい忘れてました
0を入力した場合はメッセージ出さずにそのまま0と入力
0以上(例えば200)を入力した場合は「●なんだから入力すんなボケ!どうしても"200"って入力したいの?」
「OK」「キャンセル」
みたいなね
0881デフォルトの名無しさん (ワッチョイ 9f8e-NwtD)
垢版 |
2020/08/24(月) 20:35:32.06ID:C0VIZWNb0
馬鹿は条件を後で付け加える
0883デフォルトの名無しさん (ラクッペペ MM4f-NoNb)
垢版 |
2020/08/24(月) 20:42:38.20ID:hwq7Y5YHM
メッセージボックスはうっとおしいからセルの色を変えるぐらいのほうが喜ばれるよ
0891デフォルトの名無しさん (ドコグロ MM7f-a78p)
垢版 |
2020/08/24(月) 22:34:30.60ID:6Nxhc9klM
個性的な物を作りたいのなら図形を使えば色も形も自由自在に作れる
0892デフォルトの名無しさん (ワッチョイ ff63-3Lde)
垢版 |
2020/08/25(火) 07:27:56.68ID:Dix5Myuw0
Win10で、VBAを作っています。
テキストファイルをLine関数で1行ずつ読み込み
読んだ行にてInStr関数で円マーク(\)を検索
しています。
InStr(1, 検索対象, "\")
と書いています。
しかし\が無い行で「ある」と判定されているようです。
\にはエスケープ文字が必要だからではないかと思いますが
どう書いたら良いかわからず途方に暮れています。
どなたかご教示ください。
(文字コードで指定すれば良いようですが
他の担当者が理解できない可能性もあるので
別の方法も把握したく存じます)
0899デフォルトの名無しさん (ラクッペペ MM4f-pqEW)
垢版 |
2020/08/25(火) 12:47:56.13ID:LoAGT2GVM
>>893
会社の住所です
一文字目が全角郵便マーク
2文字目が全角スペース
三文字目から半角数字で郵便番号です。
\と半角ハイフンの間を取り出す処理を
書いたところ
郵便番号最初の3桁、
ハイフンの手前まで
が取り出されますので
全角スペースが\マークとして
扱われてると思ってます
0900デフォルトの名無しさん (テテンテンテン MM4f-Is5t)
垢版 |
2020/08/25(火) 12:58:49.60ID:KRGfI1UYM
>>893
「\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
\と半角ハイフンの間を取り出す処理
を全角スペースが\マークとして扱われてると思ってます
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-」
0902デフォルトの名無しさん (ワッチョイ ff02-YpYZ)
垢版 |
2020/08/25(火) 13:39:05.50ID:UEyqjSRY0
>>899
その説明だとコード晒してもらわないとわからん
住所そのまま晒してって言ってるんじゃなくて
別の文字に置き換えていいから同じフォーマットで
処理前後でどうなってほしい所がどうなってしまうのか書いてもらわないとわからない
0909デフォルトの名無しさん (ラクッペペ MM4f-pqEW)
垢版 |
2020/08/25(火) 15:50:41.61ID:LoAGT2GVM
すみません892です
デバッガで見たら
全部の行で1を返してました
つまり全行、先頭は\マークみたいです
1文字目は無視するようにしたら
意図通りの動きになりました
0912デフォルトの名無しさん (オッペケ Sr73-rg60)
垢版 |
2020/08/25(火) 17:36:53.32ID:Lm28KJF/r
VBAからPowerShellで外部コマンドを実行して出力内容を加工したいのですが、うまくいきません
現在は、Execの引数に下記のように書いてます
powershell -Command "& Invoke-Expression 'コマンドのパス\コマンド.exe' -option1 -option2 "foo bar" >>'一時ファイル.txt'"

どうしたらよいでしょうか
0916デフォルトの名無しさん (ラクッペペ MM4f-NoNb)
垢版 |
2020/08/25(火) 20:53:13.85ID:4vNIHvGrM
shell でいいのにわざわざ外部オブジェクト使う人っているよね
0917デフォルトの名無しさん (アウアウウー Sa63-/2iM)
垢版 |
2020/08/25(火) 21:28:28.78ID:n9RIifSya
>>914
改行コードは別に文字列としての\が入ってる訳じゃないだろ
0918デフォルトの名無しさん (オッペケ Sr73-rg60)
垢版 |
2020/08/25(火) 22:12:02.97ID:Lm28KJF/r
>>915
ありがとうございます
もう一点よろしいでしょうか
標準出力にUnicodeで吐き出すコンソールアプリの出力を、Wscript.Shell.ExecのStdOutを使用して読み込みたいのですが、文字化けします
個人情報を扱うのでできれば一時ファイルを作らずに作業したいのですが、Unicodeの標準出力を直接読み込む方法は無いでしょうか
0920デフォルトの名無しさん (ワッチョイ 118e-WkEz)
垢版 |
2020/08/26(水) 01:37:45.74ID:zCSTsYdn0
>>918
スレチだろ、厚かましい
0922デフォルトの名無しさん (ワッチョイ 7901-yRqa)
垢版 |
2020/08/26(水) 02:56:47.46ID:oEB3gdtA0
これから新規に作る形式の文字コードは、UTF-8とGB18030の二択じゃないでしょうかね。
0923デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/26(水) 11:13:08.29ID:DBm/bRJ+r
>>921
調べたところわかりませんでした
Unicodeの文字が欠落するのでSJISに変換して流すのも避けたいです
一晩考えてPowerShell側でBase64エンコードしてからVBA側でデコードしてみようと考え直しました
失礼しました
0924デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/26(水) 11:25:02.41ID:DBm/bRJ+r
ちなみに、Wscript.Shell.Execに渡せるコマンドラインって255文字までのような制限があるのでしょうか
コンソール側で動いたコマンドラインがExecからだと動かなかったりするので
0927デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/26(水) 19:09:15.11ID:DBm/bRJ+r
>>926
ありがとうございます。
PowerShell上で動作を確認したワンライナースクリプトをExecで実行したら動かなかったもので、特に根拠があって疑ってる訳じゃないです。
こちらはPS1ファイルを用意して実行することにしました。
0928デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/26(水) 19:15:01.39ID:DBm/bRJ+r
ところで、ADODB.Streamに書き込んだテキストをCSVとしてパースしてRecordSetに読み込む方法をどなたかご存知ないでしょうか
一時ファイルを保存すればいいのですがオンメモリでやれたらそちらの方がありがたいです
同じADODBクラスなので方法がありそうだなと思い調べてみたのですが…
0929デフォルトの名無しさん (ワッチョイ 118e-WkEz)
垢版 |
2020/08/26(水) 20:35:45.89ID:zCSTsYdn0
>>928
厚かましいスレチはいい加減にしろ
0933デフォルトの名無しさん (ワッチョイ 02b5-lmXr)
垢版 |
2020/08/26(水) 22:52:29.85ID:FaIObZsK0
一年他部署に応援行ってて戻ってきたが
その間に転属されてた人に

これがあれば一覧のデータを一気に出力できるからマクロの使い方だけは覚えてね
マクロとかわかる?とにかく使い方おぼえて
と言われた
俺が応援行く前に作って課に展開したマクロやんけ…
0934デフォルトの名無しさん (ベーイモ MM16-4W6K)
垢版 |
2020/08/27(木) 10:45:53.98ID:M3gK7ks0M
strconvで文字列"試験"をUnicodeに変換すると、変な文字に変換されるんだけど解決策ありますか?

StrConv(StrConv("試験",vbUnicode),vbFromUnicode)
の結果が、"試験"であってほしいんだけど、別のよくわからない文字に変換される
0935デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/27(木) 10:56:45.12ID:EdbkG5X3r
>>931
情報小出しですみません。

UTF8で標準出力に個人情報含むCSVを吐き出すコンソールアプリがありまして、それを一時ファイルを使用せずにVBAに読み込むのが目的です。

Wscript.Exec.StdOutを使用したところUTF8が文字化けしてしまい、PowerShell上でByte配列化→Base64エンコードして吐き出すことで、VBAでCSVのStringを得るところまではできました。
0937デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/27(木) 11:04:53.94ID:EdbkG5X3r
VBAでBase64デコードしたByte配列をADODB.Streamにバイナリ書き込み・UTF8読み込みすることでString変数に収めるところまでは行けました。
ここから、ADODB.Connectionを使用してADODB.Streamの内容をCSVとしてパースしたいのですが、ネットで見られるサンプルコードはファイルを読み込むものばかりです。
試しにADODB.Connection.Open ADODB.Streamとしてみましたが、うまく行きません。
現在ADODBのリファレンスに目を通していて、関係の有りそうなプロパティを見て回っているのですが、方法をご存知の方いらっしゃればご教示いただけるとありがたいです。
0939デフォルトの名無しさん (ワッチョイ 452c-VQ5f)
垢版 |
2020/08/27(木) 11:35:18.54ID:UMnMnU6h0
WSH は、CP932 だけじゃないの?
もうWSHは、Microsoft もサポートしていないのでは?

WSH, VBScript のスレのスレ主、ピッコロ大魔王に聞けば?

漏れは、Ruby スクリプトをダブルクリックで起動したい場合に、WSHを使っているけど、
その際、Ruby側で、CP932・UTF-8 を変換している。
または、NKF というモジュールもある
0940デフォルトの名無しさん (ドコグロ MM22-YRmH)
垢版 |
2020/08/27(木) 11:58:06.46ID:tH7sxKPhM
>>934
そりゃそうだろ…
Unicode文字列をShift-JISだと思ってUnicodeに変換して、それを更にUnicodeだと思ってShift-JISに変換して何をしたいんだ?
やりたいのは
StrConv(StrConv("試験", vbFromUnicode), vbUnicode)
かな?
0941デフォルトの名無しさん (ベーイモ MM16-4W6K)
垢版 |
2020/08/27(木) 12:21:37.52ID:M3gK7ks0M
AddDllDirectory関数の引数にパスを渡したい
この関数の引数はUnicode文字列をである必要があるから、StrConvでUnicode変換してから渡す
変換がうまく行く文字だけのパスなら、AddDllDirectory関数は成功するが、変換がうまくいかない文字が含まれるパスだと失敗する
0949デフォルトの名無しさん (ベーイモ MM16-4W6K)
垢版 |
2020/08/27(木) 17:02:04.95ID:DiWyHVVAM
AddDllDirectory(StrConv(パス,vbUnicode))ってコールしたときに
パスに特定文字が含まれると失敗、含まれないと成功

文字の例は>>946のとおり
明らかにStrConvの文字コード変換がおかしいと思うんだけど

ちなみに第2引数をvbFromUnicodeにすると、どんな文字列でもAddDllDirectoryは失敗する
StrConvを噛ませずに、パスを渡した場合も必ず失敗する
0951デフォルトの名無しさん (ワッチョイ 61da-1etN)
垢版 |
2020/08/27(木) 19:32:16.28ID:nk+dwtaU0
>>935
やっぱわからん。
「UTF8で標準出力に個人情報含むCSV」って、既にその時点でCSVなんじゃないの?
CSVなのにカンマ区切りじゃなくてCSVとして扱えないとか?(何じゃそりゃ)
UTF8が問題ならschema.ini作って回避できない?
schema.ini使う時点で一時ファイルだわって言われたらそれまでだけど。
レス数が950を超えています。1000を超えると書き込みができなくなります。

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