20/08/12 23:38:22 neehvUDc0.net
>>848
こういうこと
あと、Dimの書き方もこうしないとだめ
Sub Macro1()
Dim tmpArr() As Variant, tmp As Variant
Dim rowIndex As Long, colIndex As Long
Dim arrIndex As Long ' 配列用のインデックス
tmpArr = Worksheets(1).Range("A3:C101").Value
arrIndex = 0
For rowIndex = 1 To UBound(tmpArr) - 2 Step 3 ' セルアドレスは3ずつ増やす
For colIndex = 1 To UBound(tmpArr, 2)
tmp = tmpArr(rowIndex, colIndex) & "結合データ"
tmpArr(arrIndex, colIndex) = tmp
Next
arrIndex = arrIndex + 1 ' 配列のインデックスは1ずつ増やす
Next
Worksheets(2).Range("A3:C35").Value = tmpArr
End Sub
856:デフォルトの名無しさん
20/08/13 00:14:44.45 6VU/YWxoa.net
>>850
その書き方だとRowが大きいやつ排除されずに新しいシートに貼り付けられません?
それともC35までで出力は終わりだからいいんですかね?
メンテナンスしづらいかと思います
857:デフォルトの名無しさん
20/08/13 00:25:56.44 87HjPNaJ0.net
>>851
そういう時はセル範囲を変数にして、どっちかのインデックスを3で割るか掛けるかすればいいんだよ
それならメンテは一箇所で済む
データの範囲をxlUpとかUsedRangeなどで調べたりテーブル化すれば全自動にもできる
858:デフォルトの名無しさん (ワッチョイ 4549-p5K4)
20/08/13 01:36:11 cxZ8EfEa0.net
>>850
ありがとうございます
最初インデックスが有効範囲にないとエラーがでたので「arrIndex = 0」を
「arrIndex = 1」に変えたらできました
配列なので0から始まるということなのかと思ったんですが、1にしても
大丈夫なんでしょうか?出力した結果はForのものと同じだったので
貼り付け後に1行ずれるということはなさそうなんですが…
しかし確かに速いですね、配列
データを5000行×3列にしてテストしたら
For 約2.7秒
配列 約0.03秒
といった感じでした
>>851,852
コピー元のセル範囲は変数にして見出し行引いてnで割ったりして貼り付け先の
範囲を出してます
今回は決まった数字の方がいいかなと思って99行を3行ごとで33行、みたいに
してみました
859:デフォルトの名無しさん (ワッチョイ ad7c-s47K)
20/08/13 01:59:57 KWfn8cHZ0.net
>>853
tmpArrにセル内容入れた時のインデックスを確認すればわかる
860:デフォルトの名無しさん
20/08/13 11:07:02.86 rrpNLQgi0.net
環境
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環境って現状こんなものなの?
861:デフォルトの名無しさん
20/08/13 11:30:36.17 cxZ8EfEa0.net
>>854
インデックスを確認したところ
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
というように変化していきましたので大丈夫そうです、ありがとうございました
862:デフォルトの名無しさん
20/08/13 11:34:45.35 25tyhxYJ0.net
コンパイルエラーじゃねーか、何を問題にしているのかわからん
863:デフォルトの名無しさん (ワッチョイ c22f-178q)
20/08/13 12:50:45 2SQEG+lQ0.net
試してないから知らんけど
64ビット長の文字列とかサポートされてないから当然だと思うけどな
つか今のEXCELついに64ビットが規定になったのか
864:デフォルトの名無しさん
20/08/13 13:00:55.28 KWfn8cHZ0.net
>>856
いや、なんでインデックス0だとエラーになるかって話・・・
865:デフォルトの名無しさん
20/08/13 14:08:49.69 cxZ8EfEa0.net
>>859
あ、そっちでしたか
エラーが出た状態のそれぞれのインデックスは
rowIndex 1
colIndex 1
arrIndex 0
でしたので、
tmpArr(arrIndex, colIndex) = tmp
のところが
tmpArr(0, 1) = tmp
になってエラー、ですかね?
866:デフォルトの名無しさん
20/08/13 14:16:56.76 KWfn8cHZ0.net
>>860
tmpArrにインデックス0は存在しないのに指定するからエラーが出ていて、セル範囲を代入した時は1から始まることを知らなくても変数の状態をチェックすればすぐわかることだが、もしかしてローカルウィンドウとかを知らないパターン
867:デフォルトの名無しさん
20/08/13 14:35:55.00 cxZ8EfEa0.net
>>861
あんまり使いこなせてはいないですがローカルウィンドウは表示させています
849さんが教えてくれたコードの中でarrIndexを「0」に指定しているのにはなにか
理由があるんじゃないかと思ったんですが、書き間違いとかでしょうか?
868:デフォルトの名無しさん
20/08/13 14:49:25.52 KWfn8cHZ0.net
>>862
意図は知らない
869:デフォルトの名無しさん (ワッチョイ e5da-p5K4)
20/08/13 18:33:06 25tyhxYJ0.net
>>862
そういうのスルーできないとこの先進まんよ
870:デフォルトの名無しさん (ワッチョイ 2e10-s47K)
20/08/14 07:43:46 whfJUs+50.net
VLOOKUPについての質問なんですが、
検索キー 検索範囲1 検索範囲2 産地
りんご りんご ぶどう 岡山産
みかん りんご 岡山産
いちご もも 岡山産
りんご ぶどう 山梨産
みかん なし 山梨産
いちご りんご 山梨産
りんごから別セルの検索範囲1を見た後に検索範囲2を見にいって産地の戻り値を得る関数を作りたいのですが、
検索キーのヒットで産地が重複した場合は表示を1度だけにして、期待する結果として「岡山県 山梨県」とだけ得られるような関数を作りたいです
VLOOKUPを&で繋げると「岡山県岡山県」と列の一番初めの戻り値しか得られません
VLOOKUP以外でもやり方があれば教えて頂ければ助かります
871:デフォルトの名無しさん (ワッチョイ 4290-p5K4)
20/08/14 11:35:06 DbBU1lOD0.net
>>865 マクロ作りました。
最大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
872:デフォルトの名無しさん (ワッチョイ 4290-p5K4)
20/08/14 11:35:39 DbBU1lOD0.net
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
873:デフォルトの名無しさん (ワッチョイ 4290-p5K4)
20/08/14 11:36:01 DbBU1lOD0.net
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
874:デフォルトの名無しさん
20/08/14 12:26:16.36 RMq/G2m80.net
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
875:865~867
20/08/14 12:40:48.74 DbBU1lOD0.net
>>869
おお!流石です。
876:デフォルトの名無しさん
20/08/16 00:23:38.07 oP+sOQXV0.net
>>865
構造体使えば簡単に作れそうだけどね。
877:デフォルトの名無しさん (ワッチョイ e5da-p5K4)
20/08/16 13:39:49 6OTbxtgn0.net
質問しないで自力でできるようになるのがまず先だろう
878:デフォルトの名無しさん (ワッチョイ 9f40-JHA7)
20/08/19 20:44:10 1ghAy1sC0.net
スレ全否定で草
879:デフォルトの名無しさん
20/08/20 01:09:34.68 Qa4rAQro0.net
シート1のプルダウンから選択した結果(テキスト)を
シート2の任意のセルに表示させるにはどうすればいいですか?
880:デフォルトの名無しさん
20/08/20 07:05:04.54 UH//ZFwI0.net
リンクするセルに指定しておけば
881:デフォルトの名無しさん
20/08/24 18:59:52.50 ga12x2Hwd.net
A列には数字を手入力
B列には●があったりなかったり
B列に●がある場合A列に数字を(例えば100)入力するとメッセージボックス?がでて
「●があるから入力しちゃ駄目よ!どうしても"100"を入力したいの!?」
「OK」「キャンセル」
みたいにしたいんですがどーすればいいですか?
882:デフォルトの名無しさん
20/08/24 19:07:40.74 k+YcXwpu0.net
Worksheet_Changeイベントを使えばいいです
883:デフォルトの名無しさん (ワッチョイ 1f7c-u2+K)
20/08/24 19:26:54 w4ZB1tmF0.net
>>876
データの入力規則のエラーメッセージ
884:デフォルトの名無しさん
20/08/24 20:16:24.02 pfMfCN200.net
1を入力した時点でメッセージボックスが出ると思うんだが10まではセーフで100だと確認のほうが良いのか
885:デフォルトの名無しさん
20/08/24 20:27:42.41 N/ceNi6Ud.net
>>876だけどいい忘れてました
0を入力した場合はメッセージ出さずにそのまま0と入力
0以上(例えば200)を入力した場合は「●なんだから入力すんなボケ!どうしても"200"って入力したいの?」
「OK」「キャンセル」
みたいなね
886:デフォルトの名無しさん
20/08/24 20:34:28.35 ZbbapVPTd.net
OK押したらそのまま200がセルに入力される
キャンセル押したら""ね
887:デフォルトの名無しさん
20/08/24 20:35:32.06 C0VIZWNb0.net
馬鹿は条件を後で付け加える
888:デフォルトの名無しさん
20/08/24 20:36:54.05 ZbbapVPTd.net
>>882
誹謗中傷?
889:デフォルトの名無しさん (ラクッペペ MM4f-NoNb)
20/08/24 20:42:38 hwq7Y5YHM.net
メッセージボックスはうっとおしいからセルの色を変えるぐらいのほうが喜ばれるよ
890:デフォルトの名無しさん
20/08/24 20:46:47.07 ZbbapVPTd.net
>>884
それでも入力する奴がいるんだもん
IF(B2:B10000=●,"入力すんな","")
これでも駄目
891:デフォルトの名無しさん
20/08/24 20:56:49.89 w4ZB1tmF0.net
数字以外を入力したら?
892:デフォルトの名無しさん
20/08/24 20:59:38.82 KH3D74B7d.net
>>886
数字以外入力しません
893:デフォルトの名無しさん
20/08/24 21:02:06.67 w4ZB1tmF0.net
自主的にしないのなら入力規則をユーザ設定にしてエラースタイルを注意でいいじゃんかと思うんだが
894:デフォルトの名無しさん
20/08/24 21:19:01.81 hykwk2E+d.net
>>888
そうか
やってみようかな
ちなみにVBAだとどう書くの?
895:デフォルトの名無しさん
20/08/24 21:58:37.53 w4ZB1tmF0.net
●があるあったらダイアログ表示するだけ
896:デフォルトの名無しさん
20/08/24 21:58:57.09 w4ZB1tmF0.net
●があったら
897:デフォルトの名無しさん
20/08/24 22:34:30.60 6Nxhc9klM.net
個性的な物を作りたいのなら図形を使えば色も形も自由自在に作れる
898:デフォルトの名無しさん
20/08/25 07:27:56.68 Dix5Myuw0.net
Win10で、VBAを作っています。
テキストファイルをLine関数で1行ずつ読み込み
読んだ行にてInStr関数で円マーク(\)を検索
しています。
InStr(1, 検索対象, "\")
と書いています。
しかし\が無い行で「ある」と判定されているようです。
\にはエスケープ文字が必要だからではないかと思いますが
どう書いたら良いかわからず途方に暮れています。
どなたかご教示ください。
(文字コードで指定すれば良いようですが
他の担当者が理解できない可能性もあるので
別の方法も把握したく存じます)
899:デフォルトの名無しさん (ワッチョイ ff02-YpYZ)
20/08/25 09:38:34 UEyqjSRY0.net
無いのにあると判定される行の文字列を教えて下さい
900:デフォルトの名無しさん
20/08/25 09:40:05.96 j61R6fge0.net
instr特に問題なさそうですが。
ウォッチ式の想定外時検索対象文字列は晒せないのですか?
instr使わずに1文字ずつ取るとか?
901:デフォルトの名無しさん
20/08/25 10:33:08.00 JyPo3Qi40.net
>>893
されてるようですじゃなくてちゃんと確認して
902:デフォルトの名無しさん
20/08/25 10:41:04.86 8u+D4XfyM.net
>>894
海砂利水魚の水行末\n
903:デフォルトの名無しさん
20/08/25 11:01:09.56 UEyqjSRY0.net
>>897
次の人どうぞ
904:デフォルトの名無しさん
20/08/25 11:14:02.60 HdlOc3e6M.net
>>894
[壁]_・)_シン・シンギュラリティ¥n
905:デフォルトの名無しさん
20/08/25 12:47:56.13 LoAGT2GVM.net
>>894
会社の住所です
一文字目が全角郵便マーク
2文字目が全角スペース
三文字目から半角数字で郵便番号です。
\と半角ハイフンの間を取り出す処理を
書いたところ
郵便番号最初の3桁、
ハイフンの手前まで
が取り出されますので
全角スペースが\マークとして
扱われてると思ってます
906:デフォルトの名無しさん
20/08/25 12:58:49.60 KRGfI1UYM.net
>>894
「\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
\と半角ハイフンの間を取り出す処理
を全角スペースが\マークとして扱われてると思ってます
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-」
907:デフォルトの名無しさん
20/08/25 13:03:59.81 at7FUvm30.net
>>900
そもそもVBAにエスケープ文字とかないから
お前のコードがバグってるか、テキストがちゃんと読めてないかどっちかだろ
とりあえずコードと読み込んだデータ晒せ
908:デフォルトの名無しさん
20/08/25 13:39:05.50 UEyqjSRY0.net
>>900
その説明だとコード晒してもらわないとわからん
住所そのまま晒してって言ってるんじゃなくて
別の文字に置き換えていいから同じフォーマットで
処理前後でどうなってほしい所がどうなってしまうのか書いてもらわないとわからない
909:デフォルトの名無しさん
20/08/25 13:53:58.00 JyPo3Qi40.net
>>901
なんで想像するだけで実際の中身を確認ようとしないの
910:デフォルトの名無しさん
20/08/25 13:54:35.07 JyPo3Qi40.net
>>904は>>900
911:デフォルトの名無しさん (JP 0Hc3-n+O8)
20/08/25 14:14:41 NinLgEivH.net
プログラムってのはなあ、思った通りには動かないもんなんだよ
いつでも書いた通りに動くだけ
912:デフォルトの名無しさん
20/08/25 14:23:43.06 QWQtRQIZ0.net
タブとか改行(CR+LF)とかバイナリデータが混ざっているとか機種依存文字とか
文字コードの違いとか色々あるからな
913:デフォルトの名無しさん
20/08/25 14:28:30.69 at7FUvm30.net
まあ一番怪しいのは、文字コード関係でテキストがちゃんと読めてない
ちゃんと読みこんだデータのバイナリ確認してみろ
914:デフォルトの名無しさん
20/08/25 14:43:48.86 JyPo3Qi40.net
line inputはSJISで読み込む
バイナリ確認しなくても元ファイルがSJISであればそれでいい
915:デフォルトの名無しさん
20/08/25 15:50:41.61 LoAGT2GVM.net
すみません892です
デバッガで見たら
全部の行で1を返してました
つまり全行、先頭は\マークみたいです
1文字目は無視するようにしたら
意図通りの動きになりました
916:デフォルトの名無しさん
20/08/25 16:00:19.40 UEyqjSRY0.net
>>910
それ完全にその場しのぎでしかないから
他の担当者が後々困る絶対
917:デフォルトの名無しさん (ワッチョイ 1f7c-u2+K)
20/08/25 16:23:37 JyPo3Qi40.net
先頭が\かどうかすらも確認しないのか…
918:デフォルトの名無しさん (オッペケ Sr73-rg60)
20/08/25 17:36:53 Lm28KJF/r.net
VBAからPowerShellで外部コマンドを実行して出力内容を加工したいのですが、うまくいきません
現在は、Execの引数に下記のように書いてます
powershell -Command "& Invoke-Expression 'コマンドのパス\コマンド.exe' -option1 -option2 "foo bar" >>'一時ファイル.txt'"
どうしたらよいでしょうか
919:デフォルトの名無しさん
20/08/25 18:00:08.63 YUvg5uyAa.net
>>910
1件目でも入っているのかな?
920:デフォルトの名無しさん
20/08/25 18:12:08.06 mPnhNdWta.net
テキスト全行読み込みしてsplitしてる説
んで\rでsplitして\nが先頭に来てるんじゃね
921:デフォルトの名無しさん
20/08/25 20:46:10.83 +ct4ya2Y0.net
>>913
Exec("powershell -Command Invoke-Expression 'コマンドのパス\コマンド.exe' -option1 -option2 'foo bar' >> '一時ファイル.txt'")
922:デフォルトの名無しさん
20/08/25 20:53:13.85 4vNIHvGrM.net
shell でいいのにわざわざ外部オブジェクト使う人っているよね
923:デフォルトの名無しさん
20/08/25 21:28:28.78 n9RIifSya.net
>>915
改行コードは別に文字列としての\が入ってる訳じゃないだろ
924:デフォルトの名無しさん (オッペケ Sr73-rg60)
20/08/25 22:12:02 Lm28KJF/r.net
>>916
ありがとうございます
もう一点よろしいでしょうか
標準出力にUnicodeで吐き出すコンソールアプリの出力を、Wscript.Shell.ExecのStdOutを使用して読み込みたいのですが、文字化けします
個人情報を扱うのでできれば一時ファイルを作らずに作業したいのですが、Unicodeの標準出力を直接読み込む方法は無いでしょうか
925:デフォルトの名無しさん
20/08/25 22:59:12.42 8Q4E/UJjM.net
>>900
>>904なるほど特殊文字が16進数表記で¥マークってことか>>910
〒 〒 \03012 郵便マーク
926:デフォルトの名無しさん (ワッチョイ 118e-WkEz)
20/08/26 01:37:45 zCSTsYdn0.net
>>919
スレチだろ、厚かましい
927:デフォルトの名無しさん
20/08/26 02:00:19.04 BpaQECb00.net
>>919
オプションなどで、文字コードを指定できないの?
928:デフォルトの名無しさん
20/08/26 02:56:47.46 oEB3gdtA0.net
これから新規に作る形式の文字コードは、UTF-8とGB18030の二択じゃないでしょうかね。
929:デフォルトの名無しさん
20/08/26 11:13:08.29 DBm/bRJ+r.net
>>922
調べたところわかりませんでした
Unicodeの文字が欠落するのでSJISに変換して流すのも避けたいです
一晩考えてPowerShell側でBase64エンコードしてからVBA側でデコードしてみようと考え直しました
失礼しました
930:デフォルトの名無しさん
20/08/26 11:25:02.41 DBm/bRJ+r.net
ちなみに、Wscript.Shell.Execに渡せるコマンドラインって255文字までのような制限があるのでしょうか
コンソール側で動いたコマンドラインがExecからだと動かなかったりするので
931:デフォルトの名無しさん (ワッチョイ 61da-1etN)
20/08/26 19:01:16 vVfdbk8D0.net
>>925
状況がわからないので超エスパー回答すると、
32bitじゃないと動かないものを64bitで実行しようとしている。
932:デフォルトの名無しさん
20/08/26 19:03:04.71 vVfdbk8D0.net
powershellか。
ごめん、関係ないわ。
933:デフォルトの名無しさん
20/08/26 19:09:15.11 DBm/bRJ+r.net
>>927
ありがとうございます。
PowerShell上で動作を確認したワンライナースクリプトをExecで実行したら動かなかったもので、特に根拠があって疑ってる訳じゃないです。
こちらはPS1ファイルを用意して実行することにしました。
934:デフォルトの名無しさん
20/08/26 19:15:01.39 DBm/bRJ+r.net
ところで、ADODB.Streamに書き込んだテキストをCSVとしてパースしてRecordSetに読み込む方法をどなたかご存知ないでしょうか
一時ファイルを保存すればいいのですがオンメモリでやれたらそちらの方がありがたいです
同じADODBクラスなので方法がありそうだなと思い調べてみたのですが…
935:デフォルトの名無しさん
20/08/26 20:35:45.89 zCSTsYdn0.net
>>929
厚かましいスレチはいい加減にしろ
936:デフォルトの名無しさん
20/08/26 20:40:23.56 SKzt3LIS0.net
ノイズが発生してるけど無視していいよ
知ってて答えたい人が答えると思うし
937:デフォルトの名無しさん
20/08/26 22:47:53.03 vVfdbk8D0.net
>>929
ちょっと意味が分からない。
そこまで知っていて出来ないというのは、どこで躓いているのか。
938:デフォルトの名無しさん
20/08/26 22:50:24.69 Xm7NIhRp0.net
できないわけじゃない
1文字づつ解析とか馬鹿らしくてやってられないから一発でできる方法を聞いておる
939:デフォルトの名無しさん
20/08/26 22:52:29.85 FaIObZsK0.net
一年他部署に応援行ってて戻ってきたが
その間に転属されてた人に
これがあれば一覧のデータを一気に出力できるからマクロの使い方だけは覚えてね
マクロとかわかる?とにかく使い方おぼえて
と言われた
俺が応援行く前に作って課に展開したマクロやんけ…
940:デフォルトの名無しさん
20/08/27 10:45:53.98 M3gK7ks0M.net
strconvで文字列"試験"をUnicodeに変換すると、変な文字に変換されるんだけど解決策ありますか?
StrConv(StrConv("試験",vbUnicode),vbFromUnicode)
の結果が、"試験"であってほしいんだけど、別のよくわからない文字に変換される
941:デフォルトの名無しさん
20/08/27 10:56:45.12 EdbkG5X3r.net
>>932
情報小出しですみません。
UTF8で標準出力に個人情報含むCSVを吐き出すコンソールアプリがありまして、それを一時ファイルを使用せずにVBAに読み込むのが目的です。
Wscript.Exec.StdOutを使用したところUTF8が文字化けしてしまい、PowerShell上でByte配列化→Base64エンコードして吐き出すことで、VBAでCSVのStringを得るところまではできました。
942:デフォルトの名無しさん
20/08/27 10:58:22.12 W5jLLhyA0.net
>>935
shiftjisで表示してんじゃないの
943:デフォルトの名無しさん
20/08/27 11:04:53.94 EdbkG5X3r.net
VBAでBase64デコードしたByte配列をADODB.Streamにバイナリ書き込み・UTF8読み込みすることでString変数に収めるところまでは行けました。
ここから、ADODB.Connectionを使用してADODB.Streamの内容をCSVとしてパースしたいのですが、ネットで見られるサンプルコードはファイルを読み込むものばかりです。
試しにADODB.Connection.Open ADODB.Streamとしてみましたが、うまく行きません。
現在ADODBのリファレンスに目を通していて、関係の有りそうなプロパティを見て回っているのですが、方法をご存知の方いらっしゃればご教示いただけるとありがたいです。
944:デフォルトの名無しさん (ワッチョイ ae02-1etN)
20/08/27 11:29:45 h0aAGvNz0.net
>>935
試験のバイナリと
よくわからない文字のバイナリ比較してみたら
945:デフォルトの名無しさん
20/08/27 11:35:18.54 UMnMnU6h0.net
WSH は、CP932 だけじゃないの?
もうWSHは、Microsoft もサポートしていないのでは?
WSH, VBScript のスレのスレ主、ピッコロ大魔王に聞けば?
漏れは、Ruby スクリプトをダブルクリックで起動したい場合に、WSHを使っているけど、
その際、Ruby側で、CP932・UTF-8 を変換している。
または、NKF というモジュールもある
946:デフォルトの名無しさん
20/08/27 11:58:06.46 tH7sxKPhM.net
>>935
そりゃそうだろ…
Unicode文字列をShift-JISだと思ってUnicodeに変換して、それを更にUnicodeだと思ってShift-JISに変換して何をしたいんだ?
やりたいのは
StrConv(StrConv("試験", vbFromUnicode), vbUnicode)
かな?
947:デフォルトの名無しさん (ベーイモ MM16-4W6K)
20/08/27 12:21:37 M3gK7ks0M.net
AddDllDirectory関数の引数にパスを渡したい
この関数の引数はUnicode文字列をである必要があるから、StrConvでUnicode変換してから渡す
変換がうまく行く文字だけのパスなら、AddDllDirectory関数は成功するが、変換がうまくいかない文字が含まれるパスだと失敗する
948:デフォルトの名無しさん (ワッチョイ 0d7c-JMbW)
20/08/27 12:24:57 W5jLLhyA0.net
>>942
vbUnicodeのstrconvだけじゃいかんの
949:デフォルトの名無しさん (ベーイモ MM16-4W6K)
20/08/27 12:31:49 M3gK7ks0M.net
>>943
それが失敗するから、vbFromUnicodeでもう戻したら案の定変になってた
950:デフォルトの名無しさん
20/08/27 12:49:42.68 h0aAGvNz0.net
変換がうまくいく文字列
変換がうまくいかない文字列
それぞれ教えてよ
似たような流れ多い?
951:デフォルトの名無しさん
20/08/27 13:18:08.14 XBcyB/ra0.net
なぜうまくいかないというコードを出さないのか
とりあえずEXCEL関係ないしVBA何でもスレ行けや
952:デフォルトの名無しさん
20/08/27 13:21:23.95 M3gK7ks0M.net
・成功
日本、解析、実
あ~む、ア~ミ、濁音、半濁音
・失敗
試験、行、め~ん、ム~ン、ゃゅょ、ャュョ
953:デフォルトの名無しさん
20/08/27 13:28:24.20 W5jLLhyA0.net
strconvが失敗するって時点で、何かの勘違いがあるとしか思えない
954:デフォルトの名無しさん
20/08/27 14:18:18.49 h0aAGvNz0.net
あぁ空目してた>>941でいいやん
引数が間違ってる
てか試そうよ
955:デフォルトの名無しさん
20/08/27 17:02:04.95 DiWyHVVAM.net
AddDllDirectory(StrConv(パス,vbUnicode))ってコールしたときに
パスに特定文字が含まれると失敗、含まれないと成功
文字の例は>>947のとおり
明らかにStrConvの文字コード変換がおかしいと思うんだけど
ちなみに第2引数をvbFromUnicodeにすると、どんな文字列でもAddDllDirectoryは失敗する
StrConvを噛ませずに、パスを渡した場合も必ず失敗する
956:ななし
20/08/27 18:30:06.72 XBcyB/ra0.net
AddDllDirectoryの引数をポインタでとって文字列のポインタ渡せば動く気がする
957:デフォルトの名無しさん
20/08/27 19:32:16.28 nk+dwtaU0.net
>>936
やっぱわからん。
「UTF8で標準出力に個人情報含むCSV」って、既にその時点でCSVなんじゃないの?
CSVなのにカンマ区切りじゃなくてCSVとして扱えないとか?(何じゃそりゃ)
UTF8が問題ならschema.ini作って回避できない?
schema.ini使う時点で一時ファイルだわって言われたらそれまでだけど。
958:デフォルトの名無しさん
20/08/27 21:54:27.65 M2V0MDYQM.net
>>950
とりあえずAddDllDirectoryのDeclare定義と呼び出してる部分のコード晒してよ
Unicode文字列の渡し方って1つじゃないから定義がわからないとなんとも言えん
959:デフォルトの名無しさん
20/08/28 03:17:22.48 0Wmy1rK2r.net
>>952
CSVファイルではなく、CSVの文字列になります
これをファイルに保存することなくパースしたかったのですが、方法が見つかりませんでした。
セル内カンマやセル内改行も含むCSVでしたので、自分でパースするのもちょっと大変でした。
MITライセンスのコードを見つけたのでそれを組み込んで処理しようと思います。
ありがとうございました。
960:デフォルトの名無しさん
20/08/28 09:32:14.87 WbcjPKym0.net
>>950
明らかにおかしいのはStrConv以外だから
元々使い方間違ってただけで変換に問題はない
最少構成でやってみたらわかるはず
961:デフォルトの名無しさん
20/08/28 10:58:16.31 CzRmvnjE0.net
Ruby なら標準で、CSV モジュールが付いている。
他にも、JSON, YAML などもパースできる
プログラミングするなら、ちゃんとしたプログラミング言語を使わないと、ダメ!
汎用的な機能を、自作して使うと、バグってばかりで仕事にならない
962:デフォルトの名無しさん (ワッチョイ 822f-25h5)
20/08/28 12:55:46 dgSTJFNK0.net
そもそもここ最強のcsvパーサEXCELのVBAすれなんだが
963:デフォルトの名無しさん
20/08/28 13:14:57.90 RBhGMmXKM.net
確かにExcelは世界一利用者の多いCSVパーサかも
964:デフォルトの名無しさん (ワッチョイ 6e63-VQ5f)
20/08/28 23:36:31 KRJ+x4lY0.net
エクセル2010を使ってます。
ファイル名の先頭に前月の年と月を付けたいと思い
下のような式を書きました。
本日動かすと「202007」と付きます。
しかし先頭の20を削除し2007としたいです。
式をどのようになおしたら良いか自力ではわかりません。
お恥ずかしいですがご教示いただきたく。
newfilename = Format(Year(DateSerial(Year(Date), Month(Date) - 1, Day(Date))), "00") _
& Format(Month(DateSerial(Year(Date), Month(Date) - 1, Day(Date))), "00") _
& currentfilename
965:デフォルトの名無しさん (ワッチョイ 0d7c-JMbW)
20/08/28 23:42:18 6tfEVBvr0.net
>>959
ヘルプでformatの書式見た?
966:デフォルトの名無しさん (ワッチョイ 06c9-1etN)
20/08/28 23:47:50 X3zZxqmk0.net
newfilename = Format(DateSerial(Year(Now), Month(Now) - 1, 1), "yymm")
967:デフォルトの名無しさん (ワッチョイ 52ee-yRqa)
20/08/29 00:17:46 58gyTBSb0.net
来年でIEなくなるんか?
IE制御で作ったVBAファイルはどうなってしまうん
URLリンク(news.livedoor.com)
968:デフォルトの名無しさん (ワッチョイ 6e63-VQ5f)
20/08/29 00:20:59 M2c3GV/+0.net
>>960
ヘルプといいますが色々なサイトを見ましたが私の頭では理解できず・・
やむを得ずお伺いしました
>>961
この式で出来ました!本当にありがとうございます!
969:デフォルトの名無しさん (ラクッペペ MM66-i8JQ)
20/08/29 00:54:05 OUCG9mQHM.net
00014500-1
のような、数字以外が入ってる文字列から
前ゼロを取りたいです。
どうすれば良いでしょうか
ゼロは先頭以外にもあるので
replaceで削除するのは無理です。
970:デフォルトの名無しさん
20/08/29 01:26:16.94 uG4P+RAn0.net
>>964
自分の意思で呼吸を30分止めてご覧
それができなければVBAを使う資格なし
971:デフォルトの名無しさん
20/08/29 01:42:59.60 haGEh7ED0.net
>>964
020-040 は 20-40 にすればいいの?
972:デフォルトの名無しさん
20/08/29 04:49:38.60 OUCG9mQHM.net
>>966
はぃ、それで良いです
言葉足らずですみません
973:デフォルトの名無しさん
20/08/29 05:11:12.22 nRBZReLEM.net
>>967
Sub Macro1()
Dim s1 As String
Dim s2 As String
Dim s3 As String
Dim c As String
Dim i As Integer
s1 = "001100-004400-007700" '入力
s2 = ""
s3 = ""
For i = 1 To Len(s1)
c = Mid(s1, i, 1)
If "0" <= c And c <= "9" Then
s2 = s2 & c
Else
If s2 <> "" Then
s3 = s3 & s2 * 1 & c
s2 = ""
Else
s3 = s3 & c
End If
End If
Next
If s2 <> "" Then
s3 = s3 & s2 * 1
End If
Debug.Print s3 '出力
End Sub
974:デフォルトの名無しさん (ワッチョイ 45da-1etN)
20/08/29 05:37:03 IjPanbf80.net
入力データにピリオドが入ることはないのか?
975:デフォルトの名無しさん (ワッチョイ 45da-1etN)
20/08/29 05:42:52 IjPanbf80.net
あ、平気か
976:デフォルトの名無しさん
20/08/29 06:40:50.33 VAMGDei30.net
そんな難しいことしなくてもこれでよくないか
Sub test()
Dim testStr As String
Dim rtnStr As String
Dim cnvNm As Long
testStr = "000070-00100-01230"
For i = 1 To Len(testStr) + 1
s = Mid(testStr, i, 1)
'数値か判定
If (IsNumeric(s)) Then
strNum = strNum + s
Else
'数値に変換
cnvNm = Val(strNum)
rtnStr = rtnStr + Trim(str(cnvNm)) + s
strNum = ""
End If
Next
End Sub
977:デフォルトの名無しさん
20/08/29 06:44:47.53 VAMGDei30.net
区切り文字が-だけならsplitして終わる気もするけど
何が入ってるかわからんなら1文字ずつみるしかないのかな
978:デフォルトの名無しさん
20/08/29 07:17:10.36 OUCG9mQHM.net
区切りはハイフンだけです
すみません
分けて各々数字扱いすれば良かったですね
書いてみます
979:デフォルトの名無しさん (ワッチョイ 6101-u5JS)
20/08/29 08:56:00 VAMGDei30.net
デリミタが"-"だけならもっと簡単になるね
Sub test2()
Dim strArray() As String
Dim rtnStr As String
testStr = "000070-00100-01230"
strArray = Split(testStr, "-", , vbTextCompare)
For i = 0 To UBound(strArray)
rtnStr = rtnStr + Trim(str(Val(strArray(i))))
If(i <> UBound(strArray)) Then rtnStr = rtnStr + "-"
Next
End Sub
文字列で連結して返す必要なければsplitして数値変換でおわり
980:デフォルトの名無しさん
20/08/29 09:09:11.49 dZuEnb/K0.net
しかし今の子はこの程度も分からないほど論理的思考がないのか、
それともこのスレの住民を試そうとしているのか
981:デフォルトの名無しさん
20/08/29 09:45:04.26 SoqUgBeq0.net
使う関数提示するくらいで解決できなきゃ放置でいいんじゃね?
982:デフォルトの名無しさん
20/08/29 10:00:53.07 pUlaC/XX0.net
For r = 1 To 12000
処理
PDF出力
という処理をしているのですが、これだとPDFが12000ファイルになって、全て出力した後で結合するのですが
これを12000枚程度をPDF1ファイルで出力する方法をおしえてください
983:デフォルトの名無しさん
20/08/29 10:07:03.64 m9X9gCs/M.net
Sub test2()
Dim strArray() As String
Dim testStr As String
Dim rtnStr As String
testStr = "000070-00100-01230"
strArray = Split(testStr, "-")
For i = 0 To UBound(strArray)
strArray(i) = strArray(i) * 1
Next
rtnStr = Join(strArray, "-")
Debug.Print rtnStr
End Sub
984:デフォルトの名無しさん
20/08/29 10:19:55.18 wR6MYEok0.net
>>977
元データが何なのか知らんけど、
シート上のデータなら、12000ページを1シートにまとめてから出力。
985:デフォルトの名無しさん
20/08/29 10:47:19.93 dZuEnb/K0.net
12000ページのPDF・・・
ほんとに聞きたい事なの?これ
986:デフォルトの名無しさん
20/08/29 10:47:46.31 lHm5nrxO0.net
>>974
Split使うならJoinも使おうよ…
Sub test2()
Dim strArray() As String
Dim rtnStr As String
testStr = "000070-00100-01230"
strArray = Split(testStr, "-", , vbTextCompare)
For i = 0 To UBound(strArray)
strArray(i) = Cstr(Val(strArray(i)))
Next
rtnStr = Join(strArray, "-")
End Sub
987:980
20/08/29 10:48:58.87 lHm5nrxO0.net
ってすでに書かれてたわ… Orz
988:デフォルトの名無しさん (ブーイモ MM4d-xiBb)
20/08/29 10:55:28 jdj2nRjtM.net
>>980
何かの文書ならともかく、ExcelのPDF化で1万ページは非現実的だよね
自分の会社で使うだけならDB化するのが普通だし
役所に提出する測定資料とかかな?
989:デフォルトの名無しさん
20/08/29 11:18:02.61 ebvcDddx0.net
ある言語だと
"00-001-02"split("-")map(asNumber)join("-")println
990:デフォルトの名無しさん
20/08/29 11:19:35.12 0Ji7S1+0a.net
>>977
for
処理
Next
にしてるってこと?
ならPDFをNextの後に書けば良いんだけど
991:976 (ワッチョイ 45cc-pyQU)
20/08/29 13:57:00 pUlaC/XX0.net
>>979
1シートにはまとめられません。
>>980
日々の取引をデータベースに入力していて、そのデータベースから出力されたデータを取引伝票としてPDF化したいのですが
データベースソフトに取引伝票の書式が設定されていないので、エクセルで作ろうと思います。
1ページごと出力してフリーソフトで結合すると、12時間くらいかかっていたので、エクセルのPDF結合だとAcrobatPro
が必要になるそうなので、この方法もできません。
>>985
シート上に帳票を作り、その帳票をページごとに書き換えています。試していませんが、1シートだと行数が足りないです。
それと、ページごとに罫線とかの書式を作るのはつらいです。
992:デフォルトの名無しさん
20/08/29 14:17:55.39 dZuEnb/K0.net
>>986
12時間かけて作った12000ページのPDFは実用に耐えてるの?
それ、手段の一つが目的になっちゃってない?
993:デフォルトの名無しさん
20/08/29 14:32:50.04 D+h94FkM0.net
>>986
よくわからないけど、何とかデータをエクセルの表にして、ワードの差し込み印刷でやる、とかはどう?
994:デフォルトの名無しさん
20/08/29 14:38:51.56 fy0wFynXa.net
PDF1ファイルにする理由はあるの?
120ファイルぐらいに分けるでしょ普通
995:デフォルトの名無しさん
20/08/29 14:42:09.88 1Tm3n33G0.net
伝票とかだと保存義務とかあったりして、出力しておいておかないとダメな時もある
1シートで収まらないならある程度で分割してやるしかないし
罫線とか決まったフォーマットならコピーするだけ
が、EXCELでやるのが間違ってるな
ちゃんとした帳票ツール買って対応する言語使えよ
996:デフォルトの名無しさん (ワッチョイ 4d63-gth/)
20/08/29 16:14:59 EjHgD7140.net
PDF化って言われても実コマンド書かなきゃアドバイスのしようもないわな
997:デフォルトの名無しさん
20/08/29 19:10:04.48 91aO+zvA0.net
シートにまとめられない理由は?
まとめないとして、12000シート作れるスペックはあるのか?
998:デフォルトの名無しさん (ワッチョイ 06c9-1etN)
20/08/29 22:40:12 LkUYL8wZ0.net
>>962
これ、マジで困るわ・・・
999:デフォルトの名無しさん (ワッチョイ 6e63-mUq2)
20/08/29 23:53:21 wkbqrDC+0.net
サポート終了なんだからいつまでもIE使ってんじゃねえよ
1000:デフォルトの名無しさん (テテンテンテン MM66-nUCc)
20/08/30 00:09:48 HNjVBgM5M.net
>>986
Accessでやって下さい
1001:デフォルトの名無しさん
20/08/30 07:04:48.97 ZpZWI99c0.net
IE制御で作る
てどういう意味です?
1002:デフォルトの名無しさん
20/08/30 08:58:33.06 IZ41nY3ca.net
テキストファイルを読み込もうとしているのですが、ファイルがないとエラーが出ます。なにが原因でしょうか?
Sub func()
Dim folderPath As String: folderPath = "G:\Test"
Dim textLine, fileName As String
Dim fileToOpen As Integer
Dim i As Integer
fileName = folderPath & "01.txt"
fileToOpen = FreeFile()
Open fileName For Input As fileToOpen
i = 1
While Not EOF(fileToOpen)
Line Input #fileToOpen, textLine
Cells(i, "A").Value = textLine
i = i + 1
Wend
End Sub
1003:デフォルトの名無しさん
20/08/30 09:03:16.96 YG+IT5u+0.net
Open "C:\Sample\Data.txt" For Input As #1
Line Input #1, buf
Close #1
1004:デフォルトの名無しさん
20/08/30 09:03:41.78 yRrMkFD60.net
フォルダーパスの最後に/足してみては?
1005:デフォルトの名無しさん
20/08/30 09:05:06.49 YG+IT5u+0.net
フォルダとファイルの間に/がないとか
1006:デフォルトの名無しさん (アウアウエー Sa0a-ifKp)
20/08/30 09:13:38 IZ41nY3ca.net
フォルダパスに"\"が入っていませんでした。
ありがとうございます!
1007:1001
Over 1000 Thread .net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 65日 7時間 12分 10秒
1008:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています