!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付ける
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part66
http://2chb.net/r/tech/1589085825/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured VBAでgrep検索を使いたいんだが教えてくれ。
https://website-note.net/vba/excel-grep-macro/
上のサイトのコードをコピペして動くまではいいんだけど、もう一つ条件を加えて
'キーワードを含むセルの情報をアウトプット時にキーワードの右のセルをアウトプットさせるようにしたい。
そこでOptionButtonを2つ作ってOpB1がtrueのときに普通に動いて、falseのときに
キーワードの右をアウトプットさせるコードを書いたんだがうまくいかない。
ifもselectcaseも試したんだけどだれか教えてくれ、VBA初心者で頭かかえてる。
つくったもの↓
'キーワードを含むセルの内容
If OptionButton1.value =then
省略 .Cells(lcnt, 7).Value = rFoundCell.Value
else
省略 .Cells(lcnt, 7).Value = rFoundCell.offset(0,1).Value ・OpB1って何ですか?丁寧に書いて
・せめてoutputCellInfoのソースは全部書いて
・=thenがガチなのかタイポなのか分からんから直打ちじゃなくてコピペして
日本語訳:
上のサイトのコードだと
キーワードを含むセルの値が、G列に出力されます。
これを以下のように変更したいです
キーワードを含むセルを検索したあと、このセルの値だけでなく、このセルのすぐ右側のセルの値をH列に出力したいです。
できたら、オプションボタンを新設して、右側セルの値を出力するかしないかを選択できるようにしたいです
面倒だから後はお前らにまかせた
>>4すみません、コードはります
Private Sub outputCellInfo(ByVal sTmpPath As String, ByVal sFilePath As String, ByVal sTmpSheetName As String, _
ByVal rFoundCell As Range)
Dim OptionButton1 As Boolean
If OptionButton1 = True Then
With ThisWorkbook.Sheets(STR_GREP_SHEET_NAME)
.Cells(lcnt, 2).Value = lcnt - 7
.Cells(lcnt, 3).Value = sFilePath
.Cells(lcnt, 4).Value = sTmpPath
.Cells(lcnt, 5).Value = sTmpSheetName
.Cells(lcnt, 6).Value = convertRange(rFoundCell.Column) & rFoundCell.Row
.Cells(lcnt, 7).Value = rFoundCell.Value
End With
lcnt = lcnt + 1
Else:
With ThisWorkbook.Sheets(STR_GREP_SHEET_NAME)
.Cells(lcnt, 2).Value = lcnt - 7
.Cells(lcnt, 3).Value = sFilePath
.Cells(lcnt, 4).Value = sTmpPath
.Cells(lcnt, 5).Value = sTmpSheetName
.Cells(lcnt, 6).Value = convertRange(rFoundCell.Column) & rFoundCell.Row
.Cells(lcnt, 7).Value = rFoundCell.Offset(0, 1).Value
End With
lcnt = lcnt + 1
End If
End Sub 張り付けたオプションボタンと定義したのは別物じゃね
つか、そもそもそのサイトのコードって正確に動く?
キーワードを含むセルを網羅しないんだけど
nothingになるRangeを比較対象に置いてるあたりがあれだ
Elseの:はミスです…
オプションボタンの定義…ググりなおします
>>9そうです、全文では無いんですよね…全文検索くんもDLして
編集しようとしましたが今の私では無理でした。 >>6
ぱっと見で分かるのは、OptionButton1が再定義されてて目的の値を参照してない事
Dim OptionButton1 を消して、>>3で自分で書いたようにOptionButton1.valueを評価してみて
あと、オブジェクト名にButtonって入ってるからコントロールだと思うけど、
もしコマンドボタンならこの用途でValueプロパティは使えないから、チェックボックスにしよう
解説サイトのソースも修正
grepExcelSheetメソッド
Loop While rTmpFoundCell <> rFoundFirstCell
↓
Loop While rTmpFoundCell.Address <> rFoundFirstCell.Address
openExcelFilesメソッド
sTmpPath = Dir(sFilePath & "*.xls")
↓
sTmpPath = Dir(sFilePath & "*.xls?")
それに伴って Do While sTmpPath <> "" 内の文を
If Not sTmpPath Like "*." & ThisWorkbook.Name Then 〜 End If
で括る
細かいこと言うと、Blean型を判定するときにリテラルと比較(= True や = False)はカッコ悪いから止めた方がいい
解説サイトではやってるけどね >>3です
無理やりですが自己解決しました
標準モジュール2にアウトプットのコードをさわったものをコピペして
コマンドボタンクリックしたときの動作をIfでCallするようにしたら出来ました
でもやっぱりこのコード重いですね。どうにか軽くする方法無いものですかね。 >>11修正ありがとうございます、提案されたやり方も試してみます! 配列にすれば
あとやってるかとは思うけど自動計算と画面更新オフ
すみません、配列にするとはどういうことをすることですか?
Cells(1, 1).Value = "あ"
Cells(1, 2).Value = "い"
Cells(1, 3).Value = "う"
↓ ↓ ↓
Range("A1:C1").Value = Array("あ", "い", "う")
1個ずつじゃなくて、一気に放り込めってことでしょう。>>15 他人にコード書かせて動かしたら遅いと文句言うのって人としてどうなの?
今日は、タイマー作ってます。
IeTimerに
Private Sub IeTimer1_Timer()
Me.Label1 = Now
Me.IeTimer1.Interval = 1000 - (Timer Mod 1000)
End Sub
とかいて見たのですが、何か一秒の長さが変に感じます。
気のせいなんでしょうか?。
Excel 97
OS;Windows 98
機種;NEC VersaPro NX VP13C
今日は、タイマー作ってます。
MsgBox 36000*24
はエラーにならないが
MsgBox 24*3600
は実行時エラーオーバーフローしました。
となります。
どうしてなんでしょうか?。
VBAで宣言せずに数式を書くと、式の中で最初に出てきた数字によって型が勝手に決められる仕様
小数点があったら、小数点以下が0でもDouble型
32767以下の整数はInteger型
32768以上の整数はLong型
になる
だから「24*3600」という式を書くと、最初に出てくる数字は24だからInteger型とみなされて、24*3600はInteger型の制限範囲を超えてるからエラーになる
変数を使わずに数値の型を指定したい時は型文字を使うか実数型にしてしまう
この場合は
24& * 3600 (Double型)
24.0 * 3600 (Double型)
24# * 3600 (Long型)
と書けばエラーにならない
ちなみにVBA(Excel)のバージョンは関係ない
最新でも仕様は変わってないから同じ所でエラーになる
プロジェクトウィンドウが何かの表紙に名前順にソートされてしまったんですが、標準モジュール、クラスモジュール等の階層表示ってどうやって戻すのでしょうか
フォルダーの切り替え(黄色いフォルダの絵のアイコン) をクリック
>>30
結構、常識だよ。
こういうエラーの時に真っ先に考える。
覚えておくと良い。
詳しく覚えなくても、勝手に型判定のせいかなと考えるだけで全然違う。 Do While 俺
俺 = 1
If 俺 > 1 Then
Exit Do
End If
Loop
MsgBox "happy"
>>35
式の中で最初に出てきた数字によって型が勝手に決められる → 嘘
32767以下の整数はInteger型 → 嘘
24& * 3600 (Double型) → 嘘
24# * 3600 (Long型) → 嘘
これで適当以外の何なんだよ Timerに1000を掛けて見ても何か変だと思ったら
想定より早くIeTimerが実行される時があるみたいだ。
マシンの性能が良すぎるんですかね。
取り敢えず+200にして解決としときます。
MsgBoxの方は型とか考えたくないので
兎に角勉強になりました。 ありがとうございました。
>>24
MsgBox 24 * 3600
MsgBox 24 * 36000
1行目はオーバーフローがでる
2行目はエラーが出ないで普通に計算されます 特定のフォルダ内のファイルのファイル名を変えて、ついでにプロパティのコメントにも文字を入力したいです
for each f in fol.files
f.name=ファイル名
f.comment=コメント
next
みたいな感じでやりたいんですが、f.commentではだめなようです
どう書けばいいか教えてください
Integer型 * Integer型 の計算結果が 32767を超えるとオーバーフローエラーがでる
Integer型 * Long型 の計算結果が 32767を超えてもエラーにならない
ってことじゃね
win10でRS-232C使うとかなりの確率で
Set MSComm1 = New MSComm
のところでエラーになります
どうにかなりませんか
>>48
EasyComm ってのに変えたほうがいいかも >>46
あとファイルの種類によってはコメントが無いのもある >>48
Win32API直叩きしたら?
自分で全部管理できるし、枯れた技術で安定してる excel標準でmscommの開発用のライセンス無いよね?
B1の値に応じて、C1からC100の値が変動します
A1からA100までの文字列をB1に順番に入れていって、1回ごとにC1からC100を別シートのD列に上から順にコピーしていきたいです
A1からA100とC1からC100は、必ずしも100まで値が埋まっているわけではなく、途中までしか埋まっていないこともあります
別シートにコピーするときに、C列の空白分はコピーしないでD列に空白行を作らないようにしたいです
Array = Range(A1:A100)で配列になるらしいんですが、Forでループさせるときに1個ずつB1に入れていくところでつまずいてます
ここからどうやってA1からA100までを順番に取り出していけばいいのでしょうか?
それと、C列をコピーするときに空白のところまでで選択を止めて必要分だけコピーするにはどうすればいいですか?
二次元配列を一つずつ取り出すときはArray(上からの番号,1)
空白行までのコピーは
with worksheets(1)
.Range(.Cells(1,3) ,.Cells(1,3).End(xldown)).copy
end with
どういう配列が作られたのかがそもそもわかんないって話でしょ?
デバッグの仕方覚えて、Arrayに何が入るかを確認できるようになったほうがいいわ
どういう配列が入ってるのかも確認できずに中身取り出すとかそもそも間違ってる
一行ずつ実行しながらローカルウィンドウで確認すれば
例えばこんな感じで配列が作られるのが確認できる
>>57
ありがとうございます
縦一行でも二次元配列というのになるんですね
基本的なことが分かっておらず、すみません
>>58
こんなのがあったとは・・・
活用させてもらいます、ありがとうございました 仮想COM使ってるバーコードリーダーからEasycomm使ってデータ読み取ろうとしたけどわからんかった
その辺の知識身につけたいんだけどとっかかりが分からない
知識ある人がうらやましい
>>60
セルに入力するだけなら
USB接続のバーコードリーダーでピッピするだけ
いったい何のデータ? >>61
いわゆるキーボードモード(USB HID)になってるようなバーコードリーダーならそうなんだけどね
今使ってるのは仮想COM(USB COM)の設定になってて、HIDに切り替えようとするとPC再起動
しないといけなかったり、何かと面倒なんだわ
COMモードじゃないとシステムに入力出来なかったりするものもあるしね
勝手にやっちゃうと職場の他の人に迷惑かけるし
そこでなんとかCOMモードのままでHID的にエクセルに出力できないかなって。
NW7のバーコード読取り結果を出力させたいってだけなんだけど、うまくいかなかった 基幹システムとExcelが分離してるなら
キーボードを別のキーボードにするだけの事だから
数千円でUSBバーコードリーダー買ってきてぶっ刺した方が早そう
おっしゃる通りなんだけど
そこに立ちはだかる「セキュリティ?」の壁なんだわ
特にハードは目に見える分、よく分かってないお偉いさんでも口挟んでくる
おれ超末端だからハード新規導入は無理だ
ソフトは誤魔化せるんでこっちから攻めたかった
>>64
上司に黙ってソフト変更とかするほうがセキュリティー的にNGだろ 業務時間も資産も使うんだし相談なり申請なりはしとけよ
うまくいかないって具体的なエラーや表示もないし
どこまでできて何ができないか書いてないよね
セキュリティー的にはな、
でもうちのは「セキュリティ?」だから
>>69
一応何らかのデータは取得できてて、不正確な数字やらスペースやらは羅列される
まぁそもそも仕組み分からず動かしてる段階で自分としては納得出来てないんで
その辺を学習できるとっかかりが見つかればと思って書いてみただけ
心当たりなければいいよ
いそぐものでもないし課題の1つとして気長に取り組んでみるわ 関係ないけどcomってコミュニケーションのCOMでいいんだっけ?
昔 .com をカンパニーだと思ってたワシ
>>70
通信パラメタ(とくにbps)は合わせたのか?
とりあえずシリアル通信についてちゃんと勉強してからやれ >>72
さんきゅ
目通してみる
>>73
パラメータはバーコードリーダのマニュアルに載ってたんでそれ使った
最後に試したのが1年ぐらい前なんで
そのうちまたやってみるわ
ほんとはバーコードリーダを家に持ち帰れればいろいろ実験できるんだけどなぁ
職場のPCだと手荒な実験できないんで捗らない >>74
同じ品番のバーコードリーダーを買いましょうw なんでわざわざコンプライアンスを破ろうとするのかわからん
>>70
昔、そういうハードのサポートしてた。
POS関連でバーコ―ドリーダー、レシートプリンタ、何とかディスプレイ(金額表示)、キャッシュドロワーとか。
シリアルならフロー制御がどうなってるかとか含めて、ちゃんと設定しないとダメだぞ。 ユーザーフォームに元に戻すボタンを作ろうと
奮闘中
・ブックやシート、列行の削除や挿入などはやらない
・セル内の数値同士の計算などをやらせる
基本的に無理だから*2のに対しては/2のボタン
とか逆を割り当てていこうかと思ったら四捨五入で座礁しますた
記録して元に復元させるってやり方かぁ
ムズそうすぎてちょっとあきらめてる
使用者には間違えるなと言うしかないか…
>>78
間違えるないうようなユーザーフォームな時点でな
ロジカルなシンキングな出来てないな >>79
ユーザーフォームのボタンの配置とか割り当てとかタブ分けとか悪戦苦闘してる
そこらへんのセンスがないんだよぁ >>80
作業を分けてフローチャートを紙に書いてみた方が良いよ
頭の中の整理できるから 一応タブ分けしてみた
一番左はデータを指定したシートに全部読み込む
次のタブで選択セル±の反転をさせる
最初はabsで絶対値にすればいいかと思ったけどマイナス値が必要な数値があったため*-1で
その次のタブで四捨五入
選択セルを0.00まで四捨五入するボタンと
0.0まで四捨五入するボタン
最後のタブで選択セル-A列にある数値の
引き算をさせるボタン
なんか工程毎にタブ分けしてみたけど
慣れないとみんな使いにくそう
なかなかなぁ
>>82
作業工程ごとに選択肢が複数あって
それぞれに元に戻すボタンをつけるの?
囲碁や将棋ソフトじゃないんだからさ
しかも完成しても使いにくいとか
考えたくないくらいめんどくせー、わし降りた。 >>83
そうなんよ、±反転はまぁいいとして
四捨五入と最後のまとめ計算がなぁ…と 操作する前に、シートをコピーして非表示にしとけば
戻すボタンでコピーしておいたシートに差し替えて戻すw
>>84
タブじゃなくてWordの葉書作成ウィザードみたいにしたらどうかな
アプリのインストールみたいに
順番に選択肢や入力欄があって
下にボタンで進んで行くイメージ[<<戻る][次へ>>][完了] >>84
根本的な考え方が違う。
フォームの内容を全部ユーザー定義かクラスに持たせて、そこ経由で動作させるようにする。
何かの動作はユーザー定義を元に動作させ、ユーザー定義をフォームに読み込むようにすれば簡単だ。 普段からそういうの慣れてる人ならできるだろうが初心者に言っても無理だろ
>>87
ありがとう、かなり見やすくかるかも
そのやり方でも作ってみるよ
>>88
ごめん、全く理解できん素人なので
教えてとは言えないからもう少しだけわかりやすく言ってもらえると
でも導入は厳しそうかなぁ 配列の勉強中です
1行目にタイトルが入っていて、2行目以降に値が入っているシートで、C列に"年"、D列に"月"、E列に"日"が入っています。
そこで、同じ行のA列にC〜Eの値を結合して「年/月/日」の表示にしたいのですが、配列を使うにはどう書けばいいでしょうか?
Sub Test()
Dim i As Long
Dim LastRow As Long
LastRow = Cells(Rows.Count, 2).End(xlUp).Row
ReDim MyArray(LastRow - 2, 3) As Variant
ReDim DayArray(LastRow - 2) As Variant
MyArray = Range("C2:E" & LastRow)
For i = 0 To LastRow - 2
DayArray(i) = MyArray(i, 1) & "/" & MyArray(i, 2) & "/" & MyArray(i, 3)
Next i
Range("A2:A" & LastRow) = DayArray
End Sub
>>91
代入先がLastRow-1行1列の2次元なら配列もそうせんと >>94
何の書き方?配列サイズを代入先セル範囲の行数と列数分用意するだけだぞ ↓ですか?
"インデックスが有効範囲にありません"のエラーがでます
Dim i As Long
Dim LastRow As Long
LastRow = Cells(Rows.Count, 2).End(xlUp).Row
ReDim MyArray(LastRow - 2, 3) As Variant
ReDim DayArray(LastRow - 2, 1) As Variant
MyArray = Range("C2:E" & LastRow)
For i = 0 To LastRow - 2
DayArray(i, 1) = MyArray(i, 1) & "/" & MyArray(i, 2) & "/" & MyArray(i, 3)
Next i
Range("A2:A" & LastRow) = DayArray
配列数クソめんどいからこれでいいよ
Sub test()
Dim endRow As Long
endRow = ActiveSheet.UsedRange.Rows.Count
Dim ary As Variant
ary = Range(Cells(1, 1), Cells(endRow, 5)).Value
Dim i As Long
For i = 1 To endRow Step 1
ary(i, 1) = VBA.DateSerial(ary(i, 3), ary(i, 4), ary(i, 5))
Next i
Range(Cells(1, 1), Cells(endRow, 1)).Value = ary
End Sub
range.valueからできる二次元配列の開始番号は0ではなく、1ですねえ
>>95,97,98
動きました!ありがとうございます。 0番目のセルは無いのに0番目の配列要素はあるから面倒臭いよな
すみません勘違いをしていました。最終行の
「Range("A2:A" & LastRow) = DayArray」
だと、A列が2行目以降空欄になってしまいます。
「Range(Cells(2, 1), Cells(LastRow, 1)) = DayArray」
も同じでしたが、
For i = 2 To LastRow
Range("A" & i) = DayArray(i - 1, 1)
Next i
だと入りますが、できれば一括で置き換えたいので、正しい書き方を教えてください
>>102
入力先のセルは1列分なのにDayArrayは2列分あって2列目に年月日が入ってる
ReDimを見直せ >>103
Forの処理をこれに変えたらできました。ありがとうございます
DayArray(i - 1, 0) = MyArray(i, 1) & "/" & MyArray(i, 2) & "/" & MyArray(i, 3) ListView(lvw1、lvw2)を2つ用意して、それぞれに同じデータを同じ順番に追加した状態です。
矢印キーの上下でlvw1とlvw2の同行選択状態ってどうやってやるんですか?
>>105
1と2で同じ操作をやりたいなら、別プロシージャに切り分けて(関数化)それをそれぞれに処理する方がわかりやすい >>105
keydownイベントで上下の時になんやかんやする 操作に関わらず一緒でいいならchangeイベントで楽に済ませられるが…
Sub 四捨五入()
Dim PP As Range
Dim SELU As Range Set PP = Selection.EntireRow Set PP = Intersect(PP, Range("G:AE")) If WorksheetFunction.Count(PP) = 0 Then Exit Sub Set PP = PP.SpecialCells(xlCellTypeConstants, xlNumbers) For Each SELU In PP SELU = Round(SELU, 2) SELU.NumberFormatLocal = "0.00;-0.00;0" Next SELU End Sub
昨日の俺です
こんな感じで四捨五入をしてる
やはり記録するかコピーしといて間違えたら戻す作戦かなあ
A列とB列にXYデータが書かれているファイルがある
このファイルが複数あり、データを縦にくっつけてひとつのファイルにする方法をお願い致します。
>>110
「vba 別のブック間 コピー」でググればそれなりの答えのサイトは出てくるよ グラフの列の範囲を1つ進めて、範囲が変わったグラフを眺めてまた次の範囲を選択するマクロにしたいのですが、うまくいきません。
sleepで5秒待機するループにすると、マクロが終わるまでグラフはそのままです。
何か良い方法はありますか?
A列に上から1万個くらいのデータがある。
ある値以下なら行全体削除、上詰めにするマクロをお願い致します。
ググってもまとをえたのがなく困ってます。
>>117
作業列作ってある値以下なら1立てる→1でオートフィルタ→行削除 >>117
どうせ暇なんだろ、1万くらい手作業でやれよ >>117
範囲をテーブルにする
条件に当てはまる行のa列から、データの入ってる最終列までClearContents
で、テーブルをある列基準に並び替え wordをcomで操作しているんですが、基本的にcomは
同期処理できないんですか?
たとえば、よくあるprintout(wordVBAの)〜Set wordApp = Nothing
の流れなんかは、Application.Waitを入れないと印刷される前に
終わってしまいます。
>>117
dim r as long
dim was as excel.worksheet
set we=activesheet
Do while r>0
if ws.cells(r,”A”)<ある値 then
ws.rows(r).delete shift:=xlup
else
r=r-1
end if
loop
パフォーマンスは知らん deleteは重いわ誤作動起こしやすいわいいことないよな
誤作動なんて起こすの?
単にセル番号計算ミスしたスクリプト書くだけなら理解できるけど、誤作動なんてあったら使えないな
フィルターかけてカレントリージョンでコピーして新規シートに貼り付けが良さそう
>>122
(r,”A”)<ある値
顔文字に見えたわw Webで見たぐらいの初心者なのですが
書式設定の複数1行列を色変える作業が
200回ほどやらなきゃいけなく
マクロ組んでみようかと頑張ったのですが
上手くいきません
Dim a As Integer
Dim row1 As Integer
row1 = 3
For a = 0 To 200
Columns("row1 + a , P + a").Select
Selection.Format Conditions.以下略
Selection.Format Conditions以下略
With Selection.略
Selection略
Selection略
Selection略
End With
Next a
row1を無くしてb=3
これをColumnsをRange(b+a,b+a)
で出来ますでしょうか?
Rangeの指定カッコ内では数式を入れられないとかありますか?
Range(cells(a,1),cells(a,16)).Select
でやってみます
このメニューで、空白セルにチェック入れると空白セルを選択しますね。
では例えば値が100以上など、条件つきのセルを選ぶ事はできますか?
教えてください。
imagemsoの名称からfaceidに変換することは可能でしょうか?
もしくはmsoBarPopupでimagemsoを使用することは可能でしょうか?
>>133
選んだセルをどうしたいかによるけど、オートフィルかけて選択とか 馬鹿の特徴
「教えて」「助けて」
で始まる書き込みをする
>>138
馬鹿でもいいです。
じゃあ、模範的な質問の仕方を教えてください。 >>140
ありがとうごさいました。参考になります。 馬鹿の特徴
人にマウントしたがるだけで
質問への答えは出さない
>>142
馬鹿でもいいです。
じゃあ、模範的な回答の仕方を教えてください。 馬鹿には馬鹿と指摘しないと、あまりに低レベルの自分でやってみようという意志もない馬鹿な質問で溢れかえるからこれくらいでいい
ここが上級者ばかり集う高尚なスレだと思っているのかWWWWWWWWWWWW
VBAごときでWWWWWWWWWw
VBAを随分下に見てるねえ。
別にC#で回答してもいいよ?
VBAに脳内変換するから。
上級者も馬鹿も両方いてあたりまえ
お前らそんなにマウントとりたいのかw
誰か教えて。
式に=とか+を使うと字が読みにくくて困っています。
全角文字や絵文字を使うことはできないのでしょうか?
急いでいますからすぐに教えて、
152 テトリス ◆SYKnw8OJpw 2020/07/03(金) 00:10:57.30
テスト
>>151
一休さんかコロンブスみたいな回答で良いなら出来る。
実際に全角文字や絵文字で書いてみな。 Function 〓(ByRef a, ByVal b) : a = b : End Function
Function ┼(ByVal b, ByVal c) : 〓 ┼, WorksheetFunction.Sum(b, c) :End Function
これを入れておけば、=とか+から解放されるぞ
Sub test()
Dim a
〓 a, 1
Debug.Print ┼(a, 1)
End Sub
そんなソース絶対読みたくないな
読みやすいフォント探すか自作すればいいだけだろうに
ワークシートの条件にあう行を削除して上に詰めるみたいなことを、配列内でしたいです。
多次元配列"ary"内の1列目が66か、6列が1000か、28列目が空欄のレコードを削除するコードを教えてください
E列が空白になるまでE列とG〜M列に特定の処理をしたくて
Do loopを使って何とかできないかと悩んでたけど座礁しますた
Eの11行目を起点にして
E列の数値が正の数ならEもG〜Mも数値はそのまま
E列の数値が0ならEもG〜Mも数値はそのまま
Eの数値が負の数ならEとG〜Mの数値を-*1
と反転させたい
ってのは素人には荷が重すぎですかね?
157,188
お互いに相手のコード相談しながら考えてあげればいいんじゃね
ちょうどよさげだわレベル
Sub Macro1()
r = 11 '起点の行
Do While Cells(r, "E") <> ""
If Cells(r, "E") < 0 Then
Cells(r, "E") = -Cells(r, "E")
For c = Asc("G") To Asc("M")
Cells(r, Ch r(c)) = -Cells(r, Ch r(c))
Next c
End If
r = r + 1
Loop
End Sub
そもそもマクロ作るのって違うデータでも同じ処理をやりたいような場合じゃないのか
一回限りのデータ抽出ならわざわざマクロなんか作る意味ないんだけどな
無駄に時間を浪費したいのかな
定型フォーマットの複数ファイルの同項目の値を集計したい
なんて時は使い捨てマクロかな
>>157
VBAの配列に要素詰める命令はなかったはずなので、どうしてもというなら
該当要素より下の要素を一つずつ上にずらす
最後の要素を消す
とやればできなくはないがお勧めはしかねる >>158
それVBAじゃなくても計算式とワークの列使えばできると思うけど
なぜ素人がVBAでやろうと思うんだ 確かに一回限りの作業なら
マクロ考えているよりやった方が終わってるかもな
一回きりだろうと同じ処理100回やるようなのもあるんだし
一般論としては頻度の多い作業の方が自動化に向いてるのは確かだけど、
1回だけでも大量のデータを加工したり手作業でやるには時間のかかる作業もあり、
作業時間の方がコード書く時間より長くなる場合も多々もあるのでケースバイケースやね
素人にやらせた場合間違った結果を出すかもしれんが
その場合頼んだ側にも責任があるけどそれでも山田にやらせるか?
do whileとかほとんど使わないわ
あれ試行錯誤してる最中に脱出条件間違えて固まるとイライラってするんで
>>158こういうのは
途中で空白行挟んでたらどうすんのとか考えるとEnd(xlup)とか使って無難にforで回したい
最も空白行挟んでたらそこまでしか処理しないのかもしれんけど
それなら上から順に一旦回して空白行がどこに出るのか調べてからやるわ
全データ配列に格納してからやれば速度的にも問題ないと思うし 観測地点が全国で2000ヶ所、1時間毎の観測結果3年分のデータがあって、8時間毎に観測出来なかった場合も踏まえて平均し、観測出来なかったのが8時間の内4時間以上あったら平均値も出力出来なかったとする。
で、その8時間の平均値は1時間ずつずれて24個分で1日のデ―タとなるんだが、それをさらに平均して1日の値とする
なんてのやったが1回限りでもVBA使わないと無理。
というか普通に考えてVBAでも無理だけどね。
>>157
配列に入れたら順番に書き込んで条件の時だけ書き込みスキップじゃ駄目なの? >>185
お前の低い知能の頭ではできないだけだろ 簡単だよな
セルにどういう風にデータが並んでるかで多少の工夫がいるかもしれんけど
加減乗除のみのワンパターン
水口克也氏のExcelVBA入門講座って本を使ったことある人いますか?
最後のじゃんけんゲームを作る所が、どうしてもうまくいきません
>>185
作業シート使ってExcelだけでできるんじゃね?
そもそも移動平均の平均とかあまり意味ないことやってる方が気になるけど 8時間平均から24時間平均への変換は一般的なLPF処理だな
デジタル信号処理で数値データを扱う基本的な考え方だよ
>>157
全要素forで回しながら
条件合うものだけを新しい配列newArrayにいれていけばいいじゃん
その後新しい配列から、データ空にしたシートに記入
新しい配列の要素数、特に1次元要素数(行数)だけど
Redim Preserveで順次増やしていくのはこの場合できないから、
一旦行数を確定するためだけにfor回してカウント
要素数確定したnewArray作ってから
もう一度for回して入れていけばいい
行列逆転させればredim preserve使って一発でもいけるか
特に巨大なデータでなければ間違い避けるために二回まわすなおれなら
行削除によって表自体の体裁を上に詰めていきたいっていうなら
最初にforを回した後、元の行数とnewArrayの行数の差だけ表の行を削除
データはすでに配列にとってあるんだからどこから削除しても構わない いきなりデータ粒度を荒くするのは悪手
ましてや>>185の場合はじめに欠損データのノイズキャンセルも行っているのでまとめて行なうとデータの精度が低下する 24コマを1コマにするんだから
平らに均すのに精度もクソも無い気がする
データ値の定常状態と過渡状態を理解していれば分かる
粒度が荒いと応答性が悪化するので現象の追従が遅れる
安定時のデータ値だけならともかくデータの変化を取りこぼすリスクが高くなるんだよ
>>196
そりはモニタのアッパーとローワーにトリガー仕込んだら良い話ではないのでしゅか? 上限、下限決め打ちの場合はトリガ仕込むのでも通用はする
ただ一日当たりの変化量でアクション起こす場合はどうする?
移動差分(微分)を連続的にデータ処理しないと難しい
>>186
仮の配列を作り、編集してaryに入れるようにしたいのですが
これだと、全て空欄になってしまいます
Dim i As Long, j As Long, cnt As Long, cnt2 As Long
i = Cells(Rows.Count, 1).End(xlUp).Row
'仮の配列
ReDim Kariary(i, 30) As Variant
Kariary = Range("A2:AD" & i).Value
'最終的に代入する配列
ReDim ary(i - 1, 30) As Variant
For cnt = 1 To i - 1
If Not Kariary(cnt, 1) = 66 Or _
Kariary(cnt, 6) = 1000 Or _
Kariary(cnt, 28) = "" Then
j = UBound(ary) + 1
If j < i - 1 Then
For cnt2 = 1 To 30
ReDim Preserve ary(j, 30) As Variant
ary(j, cnt2) = Kariary(cnt, cnt2)
Next cnt2
End If
End If
Next cnt
'シートを一旦クリア
Cells.Clear
Range("A2:AD" & i) = ary >>198
地デジのようなリアルタイムデコードじゃなくて
過去に既に起こってしまったデータ欠損の過ちをVBA で穴埋めしようとしたたところで土台遅いと言う話でした。
>>199
そうですね >>200
頭が痛くなってくるんだけど
まずifの条件がおかしい
自分で簡単の作って確かめてみ
こういうの
思ってるような動きするか確かめてみ
プログラムってのはそういうことしないとだめだわ
まっさらなxlsm作ってデータも簡単のシートに作ってやってみ
そうすりゃすぐ分かる
Sub teeee()
With ActiveSheet
If Not .Cells(1, 1) = 66 Or .Cells(2, 1) = 2 Then
MsgBox "ok"
End If
End With
End Sub
例えばさ、
ary(j, cnt2) = Kariary(cnt, cnt2)
これにブレークポイントつけてここに到達するケースがあるか調べてみ
それだけで何か分かるわ
まぁだれか正解のコード書いちゃうんだろうけど
デバッグ
ブレークポイント
これ使えないとまともなコード書けないぞ それだけじゃないからな
redim preserve は、くせ者
redimしなくても十分な量確保しといてどこまで使ったか変数に入れときゃいいだけだろ
わざわざ負荷かかることする意味がない
>>187
>>190
やって見てから言えよw
問題は時間だ。
2000x365x24x3=52560000
100列で50万行だぞ。
実際やったわけだが、普通にやって6時間とかかかる感じだった。
勿論、初心者じゃないから2次元配列使うのも当然やってる。
まあ、6時間もかけたく無かったからマルチプロセスにして1時間ぐらいにしたけどな。 data.csv
年月日,時間,気温,湿度
2020/07/04,11:15,28.5℃,78%
2020/07/04,12:15,ー,78%
2020/07/04,13:15,28.5℃,ー
2020/07/04,14:15,ー,ー
2020/07/04,15:15,28.5℃,78%
・・・
・・
・
1カ月データとして24時間×31日=744行+先頭行
1年12ヶ月データで8,928行かぁ
データスルーとかデータ穴埋めとかって
どっちの場合も
VBA じゃなくてデータベースのSQLで出来たりするのかな?
おれならそもそも案件をRDBMSに移す提案をするわ
だめなら元データはどうせCSVやJsonかなにかだろうし、VBAから普通にRDBにいれてプロシージャ叩くとか
外部プログラムで直に処理するね
元データがExcelでExcel縛りなら、どうやって案件から手を引くかを考えるねw
Excel起動するVBAでやることじゃない
まあ金次第でもあるけど
>>209
う〜ん、場所毎だから表になるっちゃあなるけど、SQLでやろうとは思わなかったし、どうやってやるのかも思い付かんわ。
仕事でSQLばかり触ってるが。
>>210
おう、確かに元データはCSVだった。
SQLで上手いことやるのが思い付かんが。 >>196
> 安定時のデータ値だけならともかくデータの変化を取りこぼすリスクが高くなるんだよ
平均とってる時点で取りこぼしとか意味不明なんだけどw >>207
2000列で高々3万行程度だろ
Excelの計算式はマルチスレッドで動くから自称「初心者じゃない」君のVBAより速いと思うぞ >>214
バーカw
やってから言え。
本当バカだなあ。
そもそもファイル重くて碌に動かねえよ。 どうせ適当なデータでっち上げて表示させても気づかないだろ
>>203
おっしゃる通りでした。
IFに問題があったみたいです。ありがとうございました。 5ちゃんのExcelVBA質問スレでMonaさんに対してマウントを取りたいのですが、
Mount Mona
と記述してもマウントが取れません
どうすればいいですか?
>>207
お前が馬鹿なだけだろ
全部メモリーに置く理由もない
己の頭の問題を仕様の問題とすり替えるな A列の2行目以降に値あり、B列の2行目以降に同じ行のA列の値が
上から何回目に出現したかを返す関数として「=COUNTIF($A$1:A2,A2」を使っています。
同じことを配列で使用する方法を教えて下さい。
(A列の値は並び替えをしてあります)
Dim EndRow As Long, r As Long
EndRow = Cells(Rows.Count, 1).End(xlUp).Row
ReDim ary(EndRow, 2)
ary = Range("A2:B" & EndRow).Value
For r = 1 To EndRow - 1
ary(r, 2) = Application.WorksheetFunction.CountIf _
(Range(ary(1, 1), ary(r, 1)), ary(r, 1))
Next r
これだとRangeメソッドは失敗しましたになります。
>>219
出来もしないこと言ってるバカ?
それとも、それ迄のやり取りすら出来ないバカ?
手作業やExcel数式でやってから言え。
ちゃんとそれ迄のやり取りも読んでから言えよw >>185
批判したいとかそういうもんじゃないんだけど
わりと大きなデータ扱うことに興味があったんでどんなもんか実際やってみた
1カ所分しかやってないんだけど
csvから取得して平均値26280個をシート記入するまで1秒もかかってない感じ
一日ごとの平均は出してないけどこの分じゃそれほど差はないと思う
もしや取得時には配列で一括取得してても
シート記入時に配列使った一括記入してないんじゃ?
も少し情報提供すると
https://www.data.jma.go.jp/gmd/risk/obsdl/index.php#
ここから3年分時間別気温データを、1年ごとcsvにして三個ダウンロード
https://www.moug.net/tech/exvba/0060086.html
これと同じ感じでOpen使って取得
年ごとに必要な気温データのみ1次元配列に入れる
3つの配列を1つの配列にまとめる
平均値入れていく配列AveArrayを新しく作る(あえてString宣言)
あとはforで回しながら過去8時間分のデータを調べてデータない場合の個数を調べて
4つ以上ならAveArrayにN/Aを入れる
4つ未満なら8時間合計して、有効データ数で除算し、AveArrayに入れる
AveArrayを列数1の2次元配列にしてからシートに一括記入
なんかおれ間違ってる? >>220
matchならともかくcountifは配列に対応してない
素直にセルを引数にしてやったほうがいいのでは countifじゃなくてloopでfindにすればよいのでは
VBAは手段の一つ、目的はデータの加工ってわりきればすぐ終わる作業なのに
無理してVBAだけでやろうとするからいつまでもおわらない
>>222
ちょっと見た感じほぼ、俺と同じ感じだね。
>もしや取得時には配列で一括取得してても
シート記入時に配列使った一括記入してないんじゃ?
オイオイ、そんな素人なわけ無いだろ。
Line inputを使ったか、それより速いバイナリ読み込み+StrConv使ったかについては覚えて居ない。
まあ、速いといっても劇的に速くなる訳じゃないから、そんなことよりマルチプロセスってことでLine inputのままだったかも。
オレがやった時のデータは日付+24列のデータだった。
貼り付けは元データ込みで、元データの右に8時間平均と1日平均書いたと思うが、もしかしたら8時間平均は出力しなかったかも。
多分読み込みよりも列を増やした二次元配列にして書き込みにも利用してたと思う。 複数のファイルの名前を編集したい
具体的には、全てのファイルのファイル名に、2020と入れたい。
>>228
ファイル名のどこに入れるの?先頭?真ん中?末尾? >>230
その程度vbaなら自由自在でしょ
バカにしないでください >>227
お前の書き込みは、
「というか普通に考えてVBAでも無理だけどね。」
だろ
後付けで時間がとか言い出して誤魔化すんじゃねーよ 標準モジュールに、
Sub 1()
・・・
・・・
End Sub
Sub 2()
・・・
・・・
End Sub
Sub 3()
・・・
・・・
End Sub
と、書いていき、Sub 1()がSub 2()を呼び、Sub 2()がSub 3()を呼ぶ、って可能でしょうか?
>>232
???
日本語が理解出来ないのか?
>なんてのやったが1回限りでもVBA使わないと無理。
「やった」と書いて有るだろ。
その後に「普通に考えて」とも書いてる。
実際にやったが、普通はVBAでも無理という意味だよ。
>>222とほぼ同じで6時間かかるからマルチプロセスにしたんだからな。 >>227
せっかくなんで
csvは日付+24列に加工してみた
1カ所の8時間ごと平均データ26280個を作って1列に貼り付けるfunctionを作る
引数は貼り付け先の列の列番号
これを
@1回だけ実行 A列のみに貼り付け
A100回実行 A列から右100列に1列ごと貼り付け
B200回実行 A列から右200列に1列ごと貼り付け
timer付けて一応測ってみた
@0.31秒
A32秒
B67秒
2000回だと12分ぐらいか?
CPU i5-4670
メモリ 24GB
Win7
実行時はPCでテレビ見ながらJane2個起動
firefox、Janetterなど20個以上のアプリが動いてる
環境やらデータの数値の大きさやらで
差は2000倍に拡大する可能性があるんで何とも言えない
うちの職場のしょぼいPCでやったらもっと酷いと思う >>234をグーグルで検索するには、どういうキーワードで検索すればいいでしょうか? >>228
Ruby で作った。
ただし、DryRun なので実際には実行されません!
require 'fileutils'
# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く
glob_pattern = "C:/Users/Owner/Documents/*"
src_dir = File.dirname( glob_pattern ) # ディレクトリパスだけを取り出す
Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみ処理する
.each do |full_path| # 1つずつ処理する
dest_path = src_dir + "/" + "2020_" + File.basename( full_path ) # ファイル名
FileUtils::DryRun.move( full_path, dest_path )
end
# mv C:/Users/Owner/Documents/a.txt
# C:/Users/Owner/Documents/2020_a.txt >>228
ファイルをバイナリで読み込んで、バイナリで書き出す、
で、書き出す際に、ファイル名に"2020"&、とすればいい。 >>234
うん
>>237
vba 関数 呼び出し
偉いね、その姿勢があればすぐにプロフェッショナルだわ >>234
普通に最後にサブルーチンの名前呼び出し書いたら良いのでは?
Sub 1()
・・・
・・・
2
End Sub
Sub 2()
・・・
・・・
3
End Sub
Sub 3()
・・・
・・・
End Sub >>242
呼び出しは、可読性考慮すると文頭にCall書いた方がいいよ >>207
VBAでやっても6時間はかかりすぎな気がするが
マシンスペックとコード晒してみ
それ、計算式でやって再計算に1時間以上かかるのか?
当然試してるよな
マルチプロセスもどうやってやったのか気になるが
俺なら間違いなくDBにつっこんでSQLでやる
そういえばエクセルシートなりCSVなりに対してSQL投げる方法がいくつかあったけど
それは試したのか? >>239
ファイル名変更だから読む必要は無いだろ。
変更するだけでOK。 >>244
おれもsubモジュール呼び出しはCallつけるようにしてる
他の言語いじったにあととかにVBAのその行みたらよくファッ!?って一瞬なるから >>245
SQLに投げるのは簡単だが、今回の問題でどういうSQLで出来るのかが分からんかった。
今でも思い付かんが。
計算式ではやってないな。
まあ、無駄なんで。
というか、本当にやる奴が出るとは思わんかったから、言わんかったが他にも制約は有ったんだわ。
それにしても>>236は速いな。
ちょっとおれも調べてみるか。
ちなみにこの仕事数年前なんで完全に憶えてるわけじゃない。 マルチプロセスはExcel.Application8個(自分含めて)呼び出して、自分のブック開いて別CPUにやらせるプロシージャをApplication.OnTimeで呼び出したかSetTimerで呼び出したかだったんじゃないかな。
細かい連携しないで済むようにしてたと思う。
複雑なことはやってねえよ。
>>236
う〜ん、分からん。
俺もやってみたんだが、同じような時間だった。
観測値はテキ卜一に0〜100をランダムで書き込み。
観測出来なかった値は当時の記憶を頼りに9999とした。
確か9998もあったけど変わらんだろう。
前に書いた制約というかは、1年分のファイルが50〜60個ぐらいだったということ。
つまり県ごとのファイルで観測地が多い所は複数ファイルって感じ。
だから実際は行頭に観測地名が入って、その後に何かの数値とかが幾つかあって日付、観測値という具合だった。
年ごとのファイルが完全に固定フォーマットで無かったか、俺が信用してなかったか、観測値名で検索してたと思う。
そこから365日分は連続してたと思うけど。
それでも6時間は掛からんような気がしてきた。
もっと複雑なことやってたのかなあ。
どっちにしても後だしで申し訳ない。 >>251
そもそもいつ頃の話よ
うろ覚えだけど2010あたりから計算式はめちゃめちゃ速くなってるぞ
あとでかいブックは64bit化の恩恵もあるし >>252
調べたらそんなに昔じゃ無かったな。
2016年だった。 ファイル名の先頭に、2020_ を付けるぐらい、robocopy で出来ないのか?
2016ならよほど変なことをしてないと数時間とかかからんと思う
workbookとworksheetって何が違うか。
キングジムファイルと綴じられてる一覧表って感じかな
32bitと64bitで計算スピードの差は2倍もないような
Activesheet.cells(1.1).Activate
Activesheet.Paste
は上手くいくのに、
Activesheet.cells(1.1).Paste
は何でダメなんですか?
>>261
.pasteは、worsheetのメンバであってrangeやcellsのメンバじゃないから、かな? パラメータ Destinationがあるから
ワイはPasteSpecialのほうが好き
>>263
普通はCopyのDestinationでやるからな。
Paste使うのはRange以外のコピーの時かな。 For
処理1
処理2
処理3
処理4
Next
よりも
For
処理1
Next
For
処理2
Next
For
処理3
Next
For
処理4
Next
の方が処理が早い傾向がありますが、そういうものですか?
>>254
出来ないよ????
robocopy はファイル名の変更はできない。
robocopy したあと move するしかない。
…あ。こいつWSHスレを荒らしてたrubyおじさんじゃんww てか、もうRubyは徒花だったな。
人気もダダ下がりだし。
>>266
よく分からんが、そもそも何でRubyが出て来るんだ?
VBAだってNameステートメントで一発なのに。 >>265
普通にかんがえて、前者のほうがループのオーバーヘッド分早いはずだが
その傾向ってのはどうやって調べたのか >>268
どこでもかしこでもRubyで書いて押し付けてきて、「出来だよ!」っていうオジサンがいるのよ。
WSHスレでは「Rubyおじさん」として有名だった。
が、自分よりスキルの上な奴がコードをうしたら黙り込む。
こんなところにまで出張いてるとはね…。
無視推奨。Rubyはオワコンだし。 >>271
VBAは「頼れるジジイ」だろ。何言ってんの? >>265
そんなのは処理による
コードが長くなったりループの中で扱うデータが増えるとメモリキャッシュがあふれて遅くなる可能性が高くなる Rubyの話がしたければRubyのスレ行けばいいのにね
>>270
いや、それはRubyが優位と言いたいが為だろ。
全然優位じゃない所に出てくるのが分からん。 音楽のmidiファイルを作りたい、つまりバイナリファイルを作りたい者です。で、
↓を試してみたいのですが、"C3"にバイナリの配列を書き込まなければいけません。
この場合、どうやってexcelのセルに、バイナリの配列データを書き込むのでしょうか?
https://oshiete.goo.ne.jp/qa/8402512.html
Sub test()
TEMP = Worksheets("Sheet1").Range("C3")
ReDim BIN(Len(TEMP) / 2 - 1) As Byte
For I = 1 To Len(TEMP) Step 2
BIN((I - 1) / 2) = Val("&H" & Mid(TEMP, I, 2))
Next I
Open "1.BIN" For Binary As #1
Put #1, , BIN
Close #1
End Sub >>278
和音の構成音(ドレミ・・・)を1つづつセルに入れられるから。 あと、PCにインストールされてる開発系はexcelだけだから。
つか、改変させたいmidiファイルが300個位あって、それの欲しいデータのexcelファイルへの読み込みはもう終わったわけ。
あとは、そのデータをちょい改変して、同様な300個のmidiファイルを吐き出すだけなんですよ。
だから、excelでバイナルファイルを作りたいのです。
>>285
日本語だってそうだろ。
読むのは簡単。 書くのは大変なんだよ。
>>286
ネットで買った和音だけの簡単なデータで改変したデータを自分だけで使うぶんには問題ありません。 じゃあそうすればいいじゃない?
所詮16進数の文字の羅列(Byteの配列とかにはさすがに出来てるんやろ?)なんだから
最終的には好きに料理してファイルに吐き出せばいい
ただ、1つのセルにバイナリなんて入れたら手作業で編集なんてしずらくてしょうがないけどな
あとセルの文字数上限もあるだろうし
midiの規格書読んだことあるのかしらんが、よくチャンクとかバイナリいじって編集しようと思うな
>>287
ならmidiの編集ソフトが使った方がいいね >>286
そもそも観賞するためのmidiデータではなく音楽制作に使うツールとしてのmidiデータなんだよね。 >>288
> midiの規格書読んだことあるのかしらんが、よくチャンクとかバイナリいじって編集しようと思うな
基礎的な部分は把握してます。
> 所詮16進数の文字の羅列(Byteの配列とかにはさすがに出来てるんやろ?)
これがわからないんです。たとえば、4D 54 68 64という16進のデータをexcelの1つのセルに書き込む方法を教えて欲しいのです。 で、excelの"C3"に、4D 54 68 64を書き込んで>>277のソースを動かして試してみたいんです。 midiの規格ってそんな簡単じゃないから素人が扱っても音が切れたりトラックがずれたりして
結局使えないだろ
ExcelのRange#valueにバイト列なんか入るわけないんだから自分がわかりやすいように文字列か数値に勝手に変換して勝手に入れろとしか言えない
Excelでmidiデータを取り扱うなんて常人の発想ではない
たぶんあなた以外に誰も方法はわからないから頑張ってその道の第一人者になって欲しい
>>292
セルに入れられるのはあくまで文字列ってこと理解してないの?
その例なら「Byte(0):77 Byte(1):84〜」とかいう配列から「4D 54 68 64」という文字列にしなければセルには書き込めない
Byteはそれぞれの数値が入ってるだろうけど、hexかなんかで16進数にしたうえで(編集上必要あるか知らんけど)
join(array, " ")かなんかで1つの文字列にする
くっそ編集しずらいだろうけどな 前スレのテキストフルスキャンの発想とコード提示してくれた人
改めて言わせて貰う
職場の一大イベントを乗り切ったわこれで
改めて多大なるお礼を言わせて貰うが抜けてた
これのおかげですべての可能性が広がったわ
では、すみません。 >>277の質問はなしにして、↓の質問をお願いします。
1、変数に「4D 54 68 64」のバイナリデータを代入するソース
2、中身は「4D 54 68 64」だけのファイル
3、ファイル名は5ch.bin
こんなファイルを作るにはどのようなソースを書けばよいでしょうか? >>228
allrenameというフリーソフトを使えばいいのじゃ。 >>301
バイナリ編集のソフト使えばいいんじゃね >>303
すみません。 「VBAを使って」でした。 それもう読み込んだデータ無意味やん
フォーマット知らんけどセルに書き出せたんならファイルにもいけるやろ
>>306
基礎になるソースさえ教えてもらえれば、そこに色々付け加えてって自分に必要なバイナリファイルが作れるんですよ。 Excelの設定もAppDataの中身も場所も変えて無いのに、
下記のように表示されてマクロが読めません!
「起動フォルダーにある個人用マクロブックは記録のために開かれた状態でなければなりません」
>>301
「'4D 54 68 64'」シングルかダブルで囲えば良いのでは?
「"4D 54 68 64"」
あるいは
いったんタブ区切りファイルtmp.tsvを途中で
中間ファイルとして介在させたらいいんじゃないですか? ソースくれくれ君だからひんとあろうが自分で書かないよ、こういうやつ
>>312
ありがとうございます。でも、「セルから変数を代入する」は止めました。で、>>277を変形してみたんですけど、↓のドコがまずいんですかね?
Sub test()
Dim TEMP As Variant
Dim I As Variant
Dim BIN As Variant
TEMP = Array(&H4D, &H54, &H68, &H54, &H68, &H64)
ReDim BIN(Len(TEMP) / 2 - 1) As Byte
For I = 1 To Len(TEMP) Step 2
BIN((I - 1) / 2) = Val("&H" & Mid(TEMP, I, 2))
Next I
Open "C:\1.BIN" For Binary As #1
Put #1, , BIN
Close #1
End Sub つか、
ReDim BIN(Len(TEMP) / 2 - 1) As Byte
この部分が何だかわかんないんですよ。
まず、ReDimとは何だ?と。
目的は、
&H4D, &H54, &H68, &H54, &H68, &H64という6個のバイナリデータだけの、
1.BINというファイルを作りたい!
です。
まずバイナリが何かすら分かってなさそうだしこの分だとmidiについても何も分かってなさそう
ここで聞くより、「vba バイナリデータ」でググったほうが早そう
うちは会社のpcでバイナリ編集するのってセキュリティー的にアウトだし
この写真のように、例えば、3以下の数値をアクティブにする方法を教えて頂きたい
できれば、for next 構文はなしで
一発検索が望ましい。
>>315> ReDimとは何だ?と
思ったらググって下さい。
ReDim BIN(Len(TEMP) / 2 - 1) As Byte
よくわからないですが動的配列を半分の長さで確保してるようです。
512÷2-1=255
forで繰り返すMid関数のスタート引数が1からのため配列の0番を1つ引算してまふ
「4D 54 68 64」ではなくてスペースなし「4D546864」か
Replace関数でスペースを削除しましょう
出来た文字列"4D546864"に対して
ループで前から2文字ずつ"&H"を付け足しているので
おそらく"&H4D&H54&H68&H64"が生成されるのでしょう
なので>>314のコードは全く意味がありません。 >>316
簡単だろw
Dim btByte() As Byte
Dim lngFN As Long
btByte(0)=&H4D
btByte(1)=&H54
btByte(2)=&H68
btByte(3)=&H54
btByte(4)=&H68
btByte(5)=&H64
lngFN=FreeFile
Open strPath For Binary As #lngFN
Put #lngFN, btByte
Close #lngFN >>326
途中で送信しちまった。
スマホで書いてるからどっか間違ってるかも。
Dim btByte() As Byte
Dim lngFN As Long
Redim btByte(5) As Byte
btByte(0)=&H4D
btByte(1)=&H54
btByte(2)=&H68
btByte(3)=&H54
btByte(4)=&H68
btByte(5)=&H64
lngFN=FreeFile
Open strPath For Binary As #lngFN
Put #lngFN, , btByte
Close #lngFN >>314
というかね、Variantとは何か、Byteは何かとか考えた方が良い。
扱える範囲が違うということはメモリ上のサイズが違うということ。
6個のバイナリって6Byteのファイルってことだろ。
Variant1個で16Byteだぞ。 みなさんレスありがとうございます。 感謝します。
>>327
ってことは、結局、↓でよいのでしょうか?
Sub test()
Dim btByte() As Byte
Dim lngFN As Long
ReDim btByte(5) As Byte
btByte(0) = &H4D
btByte(1) = &H54
btByte(2) = &H68
btByte(3) = &H54
btByte(4) = &H68
btByte(5) = &H64
lngFN = FreeFile
Open "C:\hogehoge.bin" For Binary As #lngFN
Put #lngFN, , btByte
Close #lngFN
End Sub あるいは、↓ですかね? ↑も↓も「Open "C:\hogehoge.bin" For Binary As #lngFN」の業でパス名が無効です、というエラーがでます。
Sub test()
Dim btByte() As Byte
Dim lngFN As Long
ReDim btByte(5) As Byte
btByte(0) = &H4D
btByte(1) = &H54
btByte(2) = &H68
btByte(3) = &H54
btByte(4) = &H68
btByte(5) = &H64
lngFN = btByte
Open "C:\hogehoge.bin" For Binary As #lngFN
Put #lngFN, , btByte
Close #lngFN
End Sub
>>330
>>307 > 基礎になるソースさえ教えてもらえれば、そこに色々付け加えてって自分に必要なバイナリファイルが作れるんですよ。
もういいやろ つか、 FreeFile関数ってのがあるんですね 知らなかったw
じゃあ、↓のドコが悪いんだろ?
Sub test()
Dim btByte() As Byte
Dim lngFN As Long
ReDim btByte(5) As Byte
btByte(0) = &H4D
btByte(1) = &H54
btByte(2) = &H68
btByte(3) = &H54
btByte(4) = &H68
btByte(5) = &H64
lngFN = FreeFile
Open "C:\hogehoge.bin" For Binary As #lngFN
Put #lngFN, , btByte
Close #lngFN
End Sub
>>332
つか、知らないことの方が多いくせに知ったかすんな >>333
「どこが悪いんだろ」
ではなく、
「下記のソースで実行すると〜というエラーが出ます。
調べたところこのエラーの意味は〜と理解していますが、〜と修正したら今度は〜というエラーが出ます。〜〜」
と言ったように、自分でなんとか解決したいという姿勢がないとサポートなんてしたくならないよ
本当は誰も君の相手なんかしなくてもいいんだ
君は人の時間をいただこうとしてることを考えること みんなやさしいよね
どこまでも相手してあげてるんだから
ハゲてきました。
市販の育毛剤で試すとエラーが出ます。
調べたところミノキシジルタブレットが聞くと理解しましたが、それを買って飲んだら今度は心臓ドキドキの副作用がでて命が危険だそうです。
どうしたらいいでしょうか?
つか、書き込み先を、D:\にしたら動いたwww
>>327さん、どうもありがとう!!!
こんなシンプルなソースでバイナリが書けるんです。
どんなにググッてもこんなにシンプルなソースは出て来ません。
vba史上の快挙です!
Sub test()
Dim btByte() As Byte
Dim lngFN As Long
ReDim btByte(5) As Byte
btByte(0) = &H4D
btByte(1) = &H54
btByte(2) = &H68
btByte(3) = &H54
btByte(4) = &H68
btByte(5) = &H64
lngFN = FreeFile
Open "D:\hogehoge.bin" For Binary As #lngFN
Put #lngFN, , btByte
Close #lngFN
End Sub >>341
midiファイルというのはサイズが決まってないんですよ >>344
そりゃVBAではなく、VBですらなく
BASICの範疇だからな
基本過ぎてわざわざWEBに上げたりしない いつも馬鹿な質問ばかりで済みません。
Excelファイルをダブルクリックした際に他の人が先に開いていた場合、[読み取り専用]か、[通知]か聞かれます。
これをダイアログを出さずに最初から読専で開くようにすることは可能でしょうか?
(最初に開いた人は編集・保存できるという前提です)
外部から開く際のコントロールは簡単ですが、自分自身でコントロールするのは無理ですかね?
Workbook_Openでいろいろ試したのですが、どうもこのイベントよりも先にダイアログが発生しているようで、、、
無理だ、という回答でもいいです。ご意見ください。
>>349
まずちゃんと自分で調べよう
知識が伴ってないのにろくに調べもしないでは自分で解決どころか調べ方すら身に付かない
まぁ、はなから自分でやる気なんか無いのかもしれないが >>350
情報ありがとうございます。
リンク先のものはだいたい既知の情報でした。
やっぱり自ファイルでの処理は難しそうですね。 >>351
いや、ここに書き込むときは相当調べて最後の頼みのつなで書き込んでます。
調べよう、と仰るということは、何かいい方法をご存じですか? >>353
ファイルの関連付けを変えて、マクロで迂回して。。。
。。。ここまで来るとウイルス判定かも(詳しい内容は自粛します) >>354
う〜〜ん、あまり危ない橋は渡らないでおきます。 >>356
じゃあ、
>>349の繰り返しになりますが、、箇条書きにしますね。
●Excelファイルをダブルクリックした際の挙動についてです。
** つまり、外部から開くケースは除外です。(こちらのコントロールに苦はありません。昔から使っています)
「外部から」とは、具体的には、、以下のケースなど。
・ Workbooks.Openの引数で制御する。(VBSからのOpenも含む)
・ ContextMenuの"新規作成"で開く。
●他の人が開いていた場合のケースです。
** 最初に開いている人は編集・保存ができる前提です。
→ つまり、FileAttributeを最初からReadOnlyにするケースは除外です。
●上記の際の、[読専]|[通知]を聞いてくるDialogをバイパスしたい。
** 「最初から読専で開きたいわけではなく、誰かが開いているときは最初から読専にしたい」
→ つまり外部から開くケースにあたらない。
● 自ファイル側で判定したい、、、Workbook_Openで試したが、このイベントより先に
ダイアログが発生してる。
>>349とほぼ同じ内容ですが、これだけ書けばどこまでの理解で何を試したか読み取れますか? てかそんなんできたらマルウェアの温床になるから出来ないって思っとけよ
共有化でも足りないんならあきらめろん
>>358
よくわかりませんが、わかりました。
本件Closeで。 ファイルが書き込めない状態になってたら読み取り専用で開けばいいだけじゃん
>>363
お前には聞いてないから大丈夫だよ。
じゃ、お休み。 taskkill /im ielowutil.exe
なんでもかんでもExcelでやろうとするな
つか、>>344のソースの
> ReDim btByte(5) As Byte
> btByte(0) = &H4D
> btByte(1) = &H54
> btByte(2) = &H68
> btByte(3) = &H54
> btByte(4) = &H68
> btByte(5) = &H64
この部分で、btByteという変数に6個の16進数を代入していますが、もっとエレガントに代入する方法はないでしょうか?
実は定型文みたいのを50個ぐらい入れなきゃならないのです。 >>368
そういうのは、あらかじめ用意したバイナリファイルから読み込んだ方がいいと思うんだけど
どうしてもソースに大量の16進数を直接書きたいなら
配列を使う方法
h = Array(&H4D, &H54, &H68, &H54, &H68, &H64)
For i = 0 To 5
btByte = h(i)
Next
文字列を使う方法
h = "4D,54,68,54,68,64"
For i = 0 To 5
btByte(i) = Val("&H" & Mid(h, i * 3 + 1, 2))
Next 文字列を使う方法2
h = "4D,54,68,54,68,64"
For i = 0 To 5
btByte(i) = Val("&H" & Split(h, ",")(i))
Next
>>368
そのエレガントな方法を考えるのがプログラミングなんじゃないの?
50個をコードでどうにかするなら、それをコードに書かにゃならんからエレガントにはならん。
別の所に持って良いなら別途ファイルを用意しとけば良い。
設定とか50個程度ならどっかのシートに書いとくとかでも良い。 ほんとコードくれくれ君は自分で何も考えないな
あげる方も頭おかしいが
激しく同意する
ちなみにバイナリを作成するやり方で実行ファイルが作れるのでウイルシなんかも作れてしまうわけだが
モジュールから単体動作する関数を切り取って、別のモジュールにコピーしたのですが
変数の宣言がないとエラー表示されました。何度見ても宣言は正しくされているので?です。
新しく変数宣言して、置き換えると動作します。
こんなことあるのですか?
すみません。変数ではなく定数(const)でした。
>>376
みんなわざわざ煙に巻いてるのに言っちゃ >>382
option explicitはあります。 >>384
稀に起こるが原因は不明
エラーになった定数の宣言行を切り取り貼り付けすればとりあえず治る >>385
問題の行をコメントアウトし、その下に同様の内容を書いたら動作しました!
稀に起きるのですか。初めて遭遇する現象です。
>>386
実行時です。 >385>386
他の箇所でも同様のエラー起きましたが書き直せば動作しました。
ありがとうございました。
>>376
バイナリだからウイルスって意味不明
マクロウイルスはソースが見えるからウイルスじゃないとでも言うつもりか? バイナリに謎の恐怖心を持っているんだろ?
そもそも2進数じゃなくて16進数だ
まあイチからバイナリ書き出しで実行ファイ作れるような人はこんな質問しないけどな
元々の変な質問のせいでくだらない流れになった
はい次の方
>>395
Excelと共に生き続けるだろうね
Excelの将来と同じ そういえばExcelにPython載るって話はどうなったの?
Dim objShell As Object ←値参照
Dim objExec As Object
Sub ie_kill()
Set objShell = CreateObject("WScript.Shell") ←これなに???なんで必要なの???
Set objExec = objShell.Exec("taskkill.exe /F /IM iexplore.exe") ←iexplore.exeをタスクキル
>>399
CreateObjectまんまオブジェクトを創造してます >>397
OfficeやWindowsは開発者が妄想を公式ブログで垂れ流すのが恒例行事
それを公式発表だと世間が勝手に騒いでるだけ ExcelってIE制御からedge制御できるようになった?
未だにIEが一番使い勝手いいの?
ExcelってChrome制御できるようになった?
いまはExcelがブラウザを制御するのではなくてブラウザがExcelを制御する方向性が主流
VBAはあくまでExcel内で完結する作業に限定した言語であって外部との連携作業はOfficeアドイン(実体はJavaScriptなどのスクリプト言語)や
VSTO(VisualStdioで言語はC#が中心)で行なうのがMicrosoftの方針
Pytonはよく分からんけど上手くOfficeAPIを利用すれば出来るかもしれない
概要についてのドキュメントは>>398 てゆかブラウザ操作するよりAPI叩いたりスクレイピングするほうが主流よね、今は
ずっと昔はExcelで入力してIEに反映させるとかあったけど、今じゃレガシーすぎる
ウチはシステムが古くてAPIなんてものに対応してないので現役だわ。
>>407
API叩くのもスクレイピングも変わらんけどな。
何でやるかの違いくらい。
まあ、Chrome制御は出来んけどな。
WebDriver使えるから出来るとも言えるか。
何処から何処迄がExcelって話。 >>406
VSIOは寧ろ廃れてるような気がするが。 あかん、モーむり
sendkeys使いすぎてるせいで
Numlockキーがオンになったりオフになったり・・・
かと言って必ずオンオフ切り替わるかというとそうでもないし
誰か絶対100%常にNumlockオンになるコード教えてくれえ
>>415
vbaでレジストリを操作できるから、そこに道があるかも知れない >>415
2 つ以上の SendKeys ステートメントが連続して実行されると、NumLock キーがオフになる ありがとうございます
418の方法も試したんですが、なぜか一回目では適用されず
あと418の一番下にある、入力リストを展開するとは一体?
>>415
Sendkeys使う奴は糞。
絶対に使っちゃいけないと言った方が事故が起こらないくらい事故が起きても不思議じゃない所で使う奴がいる。 >>421
Sendkeysは基本的にコントロール出来ない。
他アプリを操作するにはもっとコントロール出来る方法がある。
どうにも出来ない時は仕方がないが、絶対に使わないつもりで、どうにもならない時だけ使うべきだね。 あと、危険は承知でちょろっと使う時はある。
お手軽だから。
でも、それで使うことを許容すると危険もしらず、ちょろっとで済まない所で使う奴が出てくる。
sendkeysって手段としてしょうもなさすぎるんだよな
目的を整理すれば他にもっといいやり方があるはず
キーワードによる予測変換機能っぽいのをやろうとしたときに、
いいコード無いか探してたら使ってたなsendkeys
>>430
いやいや、確かにSendkeysよりは良いけど、何でキーボードシュミレートしたいのよ。
オブジェクトに直接キーを送るとか、オブジェクトの動作そのものを実現するとかは無しか? 大抵のアプリは外部からの要求を受けるのはマウスとキーボードだけだから
あ、ちょっと失礼。
ほんの少し前、テキストボックスに入力された数式をだったか
マクロだったかをプロシージャにして実行するってなことをやってたんだが
すっかり忘れてしまいました。
どうやるんでしたでしょうか。
OS;Windows 98
Excel 97
>>418
そんな不具合見たことないな。
VBA限定で、VBSから使うと出ないとか? sendkeys問題解決しました
ありがとう!create object wscript.shell.sendkeysでうまいこと行けた
二つのieを起動して2つ目のieにpdfを表示させてそのpdfをexecwbのsaveasで名前をつけて保存したいのですが名前をつけて保存ダイアログに一つ目のieのファイルが保存項目として表示されてしまいます。どなたかわかる方教えてください。よろしくお願いします。
これがそのコードです getIE はシェル取得ファンクションです
長すぎると書き込めないので省略しました
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate "http://book.impress.co.jp/appended3384/4-4.html"
Dim ie2 As InternetExplorer
Set ie2 = CreateObject("InternetExplorer.Application")
ie2.Visible = True
ie2.Navigate2 "C:\\Desktop\test.pdf", 1
Set ie2 = getIE("test")
Dim test As String
test = "c:\test\test.pdf"
ie2.ExecWB OLECMDID_SAVEAS, OLECMDEXECOPT_DONTPROMPTUSER, test
End sub >>439
5ch では、同じ質問のマルチポストは禁止です!
もう1つのスレの方で、やってください! Set ws1 = Worksheets(1)
Set ws2 = Worksheets(2)
n = ws2.Cells(Rows.Count, "E").End(xlUp).Row
n = n + 1
For i = 2 To ws1.Cells(Rows.Count, "A").End(xlUp).Row
j = 1
ws2.Cells(n, 5).Value = ws1.Cells(i, j).Value
n = n + 1
j = j + 1
ws2.Cells(n, 5).Value = ws1.Cells(i, j).Value
n = n + 1
j = j + 1
ws2.Cells(n, 5).Value = ws1.Cells(i, j).Value
n = n + 1
j = j + 1
ws2.Cells(n, 5).Value = ws1.Cells(i, j).Value
n = n + 1
j = j + 1
ws2.Cells(n, 5).Value = ws1.Cells(i, j).Value
n = n + 1
j = j + 1
これが10回ほど続くんですか簡潔にかけませんか?
再計算をオフにしていても、VlookupとかIndex/Matchで参照されているセルを削除すると初回だけ滅茶苦茶重くなる
二回目からはアンドゥしようが削除しようが一瞬になる
この初回も重くならないようにしたいんですけど、初回だけどこかで再計算か何かが裏で動いてるんでしょうか?
テーブルの特定列に入力されている値から選択できるドロップダウンリストを作りたいです
【要望】
・重複なし
・(できれば)空白は除く
>>448
そうか
頑張れよ
ここは日記お断りだぞ >>444
キャッシュのなら場合そういう動作が正常 「作りたいです」という決意表明だろ?
そう言えば誰かが勝手に手助けしてくれると思ってるのかね。
あ、本人かよ。
平成生まれと昭和生まれは少々使用する言語が違う。
同じように日本語とは言うけれど。
ゆとり世代は誰かが助けてくれて当然と思っているからな
そこら辺は見た目の影響も大きいんだよな。
イケメンだったり可愛かったりすると、助けてもらえるのが当たり前で生きてる。
一方、ちょっと残念な感じだと、助けてもらえることが無く生きてる。
そこら辺の感じ方が違うのは当然なんだよね。
覚えてものにしようと断固たる決意でマクロを完成させたけど
最初の方に組んだプロシージャを今見てもほとんど覚えてないわ
メンテナンスだけはできるようにコメントつけてあるけど
これがネットで拾い集めて基礎を学ばない相変わらずの俺のダメスタイル
個数や最終行などよく使う変数名は今後の為に統一させたほうがいいな
その時の気分でいろいろと変えると後で意味不明になる
同じフォルダ内の"取引実績"ブックの"関東地区"シートのA列・B列・C列・J列・L列・AD列の
それぞれ2行目から最下行までを配列に入れる方法を教えてください
Workbooks.Open ThisWorkbook.Path & "\取引実績", ReadOnly:=True
i = Sheets("関東地区").Cells(Rows.Count,1).End(xlUp).Row
ReDim SiresakiArray(i -1, 6) As Variant
'代入するのはA,B,C,J,L,AD列のみ
SiresakiArray() = Range("A2:??????
ActiveWindow.Close
みんなvbaどうやって勉強してるの?
しっかり参考書とか買って、じっくり?
ちなみに自分は>>458に近いスタイル
必要に迫られたらネットで検索して、ちょっと弄ってって感じ
だからいつまでたっても上達しない・・・ 消したらrange("a2").resize(i,6)
コピペするだけで身に付くわけがない…
そのコードが何をしてるのか理解できるまで調べて自分で使っていれば自然に身に付く
>>464
いらん列消すか、いる列の2行目から地道に入れる これできるようにしてくれない?
これって自動でならない?
職場の糞どもの質問は完全に無視してる
テメーの昼休憩にずっと触ってるスマホで調べりゃ出てくるだろ
話しかけんな
その人が楽するためなら何もしないな
あえて普段はどうやってるか聞いてみて嫌な顔一つしない感じならやる
>>464
Sub hoge1()
Dim aa As Variant
aa = Range("a1:c3,e1:f3")
'結果:a1:c3までしか入らない。なるほどね。
End Sub
Sub hoge2()
i = Cells(Rows.Count, 1).End(xlUp).Row
ReDim siresakiarray(i - 1, 6) As Variant
retsu = Array("A", "B", "C", "J", "L", "AD")
For iic = 0 To UBound(retsu)
For iir = 2 To i
siresakiarray(iir - 2, iic) = Cells(iir, retsu(iic))
Next
Next
'
Worksheets.Add
Range("a1:m999") = siresakiarray
End Sub
一つずつ入れるならザックリこんな感じのロジックで。
他の方法として新しいシートにシートコピーして列を消して配列に挿入の方が
効率いいのかも どうだろう 少し組んで改善するとまぁ評価はされるんだけど
他の人後でメンテナンスできるよな?
とか
マクロが壊れる心配ないよな?とか
テンプレートのように言われるけど知るかよ
読み取り専用で配布してるしプロシージャ弄れないようにしてあるし壊れねーっつーの
パスワードかけてないマスター版も社内サーバーに置いてあるから
いじりたきゃ学べや
あと配布した途端楽になったらその業務ばっかりやろうとするおっさん見苦しくてむかつく
配って損したわ
>>465,468,471
ありがとうございます。列を削除して取り込みます。 配列 ary(1,6)に年月日(2020/7/18)が入っていて、配列ary(1,7)には何らかの値が入っていることがあります
ary(1,6)を20日締で起算して、ary2(1,1)に"20_7"のような文字列を返す式を教えてください。
またary(1,7)に値が入っていれば翌月にずれるようにしたいです
ary(1,6)="2020/7/18"
ary(1,7)= ""
の場合ary2(1,1)="20_7"
ary(1,6)="2020/7/21"
ary(1,7)= ""
の場合ary2(1,1)="20_8"
ary(1,6)="2020/7/18"
ary(1,7)= "値"
の場合ary2(1,1)="20_8"
ary(1,6)="2020/12/20"
ary(1,7)= "1"
の場合ary2(1,1)="21_1"
型はなんなの?
くそコードでもいいからひとつずつ考えて作ってみたの?
の場合、とか言ってるんならif使えばいいだけだろ
アホなのか
書いてみた
理解しなきゃ使えないと思うが
>>479
完成しました。ありがとうございました
dt = CDate(ary(1,6))
If Cint(Format(dt,"d")) > 20 Then '20日以降か
dt = DateAdd("m",1,dt)
End if
'空欄でなければさらに1カ月繰り上げる
If AfuriArray(cnt-1,26) <> "" Then
Else
dt = DateAdd("m",1,dt)
End If
ary(2,1) = Right(Format(dt, "yyyy"),2)&"_"& Format(dt,"m") 来年の役員報告の課の改善発表の内容に
俺のマクロで作る事が既に組み込まれてるんだが
そもそもそこまでスキルないし年上のもっと給料もらってる奴にやらせろやカスが
日本語環境でmiLANG_JAPANESEを指定してもbad languageのエラーが出るのは何故?
sheet"s1"にFunctionで処理したary2を貼り付けたいのですが、処理前のary1が貼り付けられます
Function後のary2を貼り付けるにはどうすればよいですか?
Sub test()
Dim endrow, r As Long
endrow = Sheets("rui").Cells(Rows.Count, 1).End(xlUp).Row
ReDim ary1(endrow - 1, 6)
ary1() = Sheets("rui").Range("A2:F" & endrow).Value
Sheets("sh1").Range("A2:F" & endrow) = ary2(ary1())
End Sub
Function ary2(ary1() As Variant) As Variant()
Dim en, r As Long
en = UBound(ary1())
For r = 1 To en
ary1(r, 1) = Application.Asc(ary1(r, 1))
ary1(r, 1) = StrConv(ary1(r, 1), vbUpperCase)
ary1(r, 1) = Replace(ary1(r, 1), " ", "")
Next r
End Function
>>485
そりゃあ貴方、ary2は関数ですと自分で宣言してるもの。
しかもary1に代入してますやんかー
プログラムは命令通りに動作してるだけじゃん。
ary2の配列を準備して処理してから
そのary2の内容をシートに展開すようにプログラムしなきゃ >>486
ありがとうございますFuntionの使い方を誤解していましたm(_ _)m >>485
Functionの配列渡しは少しややこしい
まずは内容を単純化して正解の型を見つけた方がいいと思う >>485
単純化した一つの正解の型
Sub test()
Dim ary() As String
ary() = fnc
MsgBox ary(1)
End Sub
Function fnc() As String()
Dim ary(1) As String
ary(1) = "a"
fnc = ary()
End Function joinして受け渡ししてsplitで復元がシンプルでわかりやすいんじゃね?
もう企業ユーザーにはOffice Script解放されてるみたいですが試された方、使用感どんなもんですか?
>>485
ary2の宣言部分は正しい。
でもary2の内部でary2はどうなったの?
何もしてないよね。
ary2の内部でary2はこうなりましたって書かないと宣言した時点の空の配列が返るのが当然。
つまりary2のFunctionの最後にary2=の文が必要。 excelなんだから配列はセルにいれときゃいいんじゃね
配列は大量に入れるとメモリ不足になるのが嫌。
値以外のプロパティ持ってるセルの方がよっぽどメモリ喰うだろって思うけど、
仕様だから仕方がない。
メモリ不足になるほど大量に入れることなんて殆ど無い。
不足するのは別の理由だと思うが。
10万行のCSVとか配列で処理したくなるけどメモリ不足になるんで仕方なくワークシートに入れてる
VBAは過去のしがらみが多いので64bit Excelでも変な制限があってびっくりする
最近経験したのはユーザー定義型の中の配列サイズ
Type T
A(33000) As Integer
End Type
Sub S
Dim X As T
End
ってやるだけで「動的なローカル変数が多すぎます」って言われる
A(32000) As Integer
なら問題ない
オフィススクリプト試したい…
個人ユーザーにも解放してくれ…
csvを文字列形式のセルに取り込む時、値がない場合は""とemptyどっちにしておくべき?
office田中の人が顔出しでYoutubeはじめたらしいが
おじいちゃんで偉そう。
実世界なら関わりたくないタイプ。
自分の参考になるとこだけ聞いときゃいいんじゃないの?
その他アレコレ言うのはどうかと思うぞ
>>503
1レコードずつシーケンシャルに処理できないの? 複数の同じ形式で入力されたブックをマージしたんですが、テキストを連結する場合に区切り文字を「|」にしました
(「|」は入力時には使用していません)
ファイルが3つ(A.xlsx,B.xlsx,C.xlsx)、それぞれのブックの値をa,b,c(テキストのみ、数値なし)、セルの値は
空白可だとすると、マージ後のあるセルの文字列は
a|| a|b| a||c |b| |b|c ||c a|b|c |||
のいづれかになりますが、このうち左端及び右端の「|」は削除、連続する「|」は「|」ひとつに統合、すべて「|」の
場合はセルを空白にするにはどうすればいいでしょうか?余分なスペースを削るTrimのようなことを任意の文字でしたい、
という趣旨です。処理後は以下のようにしたいです
a a|b a|c b b|c c a|b|c 空白のセル
一旦「|」をスペースに置換してTrim関数で余分なスペースを削ってから再度スペースを「|」に置換すればできるんですが、
もうちょっとスマートな方法があるのかなということと、意図して連続したスペースを入力していたらTrimで消えてしまうので
そういった場合に備える意味も含めていい方法があれば教えてください
Excel2019です
外部CSVをpowerqueryで取り込んで整形したのちシートに貼り付けてあるテーブルがありまして、
ファイルを立ち上げる度にこのテーブルを自動で更新させるところまではできました。
この後、更新完了後に自動的にCSVファイルを保存、終了させようと考えているのですが
更新完了のイベントがどうもわかりません(見当たりません)。
アドバイスをいただけないでしょうか
よろしくおねがいします。
>>513
スマートさは知らないが正規表現で置換するとか >>507
null 値は文字列型じゃなく、
型もない、または、null型だから、空文字列ではないと思う
>>513
>このテーブルを自動で更新させるところまではできました
この処理の後に、やりたい処理を書けば? >>512
/^\|+|\|+$//
/\|+/|/ >>511
ファイル操作はセル操作以上に重いからできるだけまとめた方が速くなる >>503
10万を一気に配列に入れるの?
5000行ぐらいずつで処理できんの? >>512
1.連続する|を1つにする。
2.両端の|を消す。 ExcelWebAddinっていうのを使ってWebフォームの入力を自動化しようとしていますが、ラジオボタンにチェックを入れるにはどのようなコマンドを入力すれば良いのでしょうか?
1人だけマクロ作って超楽に終わらせてるのがバレたわ
改善提案で出して8000円賞やるから他の奴らにも配って共有化してくれと言われた
まぁ仕方ない
でもまぁマクロはこっそり作って自分で運用するに限るね
次にそういうのできたら発表で使ってくれだと
こっそり使わないと
マクロ適用できないように仕変されるよ
Excelを使った業務が95%くらいの職場だから問題ない
逆に使いにくいwordを俺が改善で駆逐していってたが今回のはみんなに配りたくなかったけどまぁ仕方ないか…
在宅の日なんて他の人が半日かかるのを5分だったのに…
>>524
そういうのさあ、共有してあげてもいいけど、共有すると知的障害の人が仕様の異なるものに適用して失敗して文句言ってくるのが目に見えてるんだよね
だからといっていろんなケース想定してプログラミングするのはアホらしいし むしろあえて自分用に最適化して「共通部分以外はできません」でもいい
いつのころからかマクロを忌み嫌い極限までVLOOKUPで済ませるようになった
オレオレ証明書でスムーズに使えるかと思ったら
証明書付けると逆に使えなくなったり
嫌がらせが半端じゃなかったしな
今では設定がどこにあるのかすら分からん
XPの頃はオレオレ証明書を作ってたけど、そういや今は作らなくても動いてるな
何がどう変わったのか把握してないわ
今ならxlookupがある。
あと関係ないけど、スプシのquery関数輸入してくんないかなぁ…あんなのに特許とか無いでしょ?
シートのコード名をマクロから変更することはできますか?
設定を変更する必要はあるけど、VBproject を編集できるかもね
>>526
もしかして長文資料もExcelで作っちゃう系?
それはそれで絶対やめとけよ >>541
やっぱり値取得だけなんですね。
ありがとうございました。 >>517
ありがとうございます、休み明けに試してみます Android版のアウトルックが操作方法また変わって、開こうとしたら削除されて、しかも削除済みのフォルダにもない。
どうしたら良いんだこれ。
メール消えてもうた。
ロードに1分以上かかるのに、一見、ロードされているように見せかけるのも、問題があるように感じる。
人によっては、本文の無いメールが来たと思う人もいるだろう。
一見して高速にロードされるように見せかけるのは大した技術なんだろうけど、それ、ユーザーを騙すってことだよね?
実際にはクライアント側にデータを保存していないんだから。
高速にロードされるように見せかけているがために、まだデータをダウンロードできていないことをユーザーに知らせることが出来ない。
通信中であることを示すマークを出すと、高速で無いことがバレてしまう。
ここに矛盾を抱えてる。
しかもアウトルックドットコムはLinuxに慣れてる一般大衆からすると信じがたく重い。
サーバーからダウンロードしていることを隠すなら、高速なLinuxサーバーを使うべきでは?
先月まで開く動作だった左にスワイプが削除の動作に代わるって、とんでもない仕様変更だよ。
しかも、本文がロードされる前の時間帯では、削除済みのフォルダに入らない。
さすがにこれは仕様というよりバグなんじゃないのかな?
officeTANAKAのおじいちゃんの動画見てる人いる?
>>556
WEBを流し見した方が早い
同じ内容なら動画は時間がもったいない おじいちゃんよりperfect human NAKATAなら見るけど
中田のは世界史/日本史やってるときはよかったが
範囲を広げすぎて見てるほうも興味ないしやってるほうも専門じゃないからおもしろくない
このスレは雑談スレで質問はVBAでもビジネスsoft板スレで聞いた方がいいのかな
課で全員が共有する色んなExcelのファイルがあるけど
xls→たいがいマクロ組んでないからそのままマクロ組むこともある
xlsm→作成者の作ったのを見て少しだけ弄ることはある
xlsx→手を出さない
subってプライベートにしないと何か良くないことあるんですか?
>>561
雑談してるスレ住人達の興味を引くような質問なら答えてくれるかもな
あるいは答えることで承認要求が満たされそうな質問とかマウント取れそうな質問とか >>563
プロシージャを沢山作るだろ。
その中にゃちょっとお試しのSub test1()なんてのが作られる。
で、同名のプロシージャとか作ると、色々問題が出る。
プライベートならモジュールが変われば問題無し。
そもそも、面倒くさいからわりと忘れがちだが、ちゃんとスコープや型を考えて作れない人のプログラムは出来も悪いことが多い。
バグも作りがちだね。 クラスとかよー分からん
オブジェクト指向の言語やるといいのかな?
作らなくても何とかなってきたんだろ、だったら要らないよ。
どうせクラスとかインテリセンスに項目追加するぐらいの効果しかないでしょ。
イベントを持った動的に生成するフォームはクラスでやるしかないのでは
と、思うのだが(´・ω・`)違ったらごめんね
クラスなんか要らない構造体で十分って言ってる奴、知的好奇心足りなさすぎでは
>>572
VBEにメニュー追加して、メニュー押した時のイベントにはクラスが必要だね。
VBAはクラス使わなくても組める言語だけど、時々クラスがピッタリ来る場合がある。
そういう場合はクラス使った方がメンテナンス性とか後々良いことがある。 ADOとかUIAutomationとか、長くなりそうなのは面倒だからクラス。
クラスの意味はわかるけど使うメリットがようわからんな
for eachで回せるくらいしか思い浮かばないんだが…
javaチックに全部クラスで作るのもなんか違う気がするし
またVBAでクラスの話かよ…
せめてClass_Initializeに引数持てたらな…
VBAもVBも黒歴史になりつつある点では似たり寄ったりだけどね
Office ScriptsではTypeScriptが使われるようになるんだっけ?
CodeLabとOffice Scriptsの違いが分からん
クラスのメソッドで例外が起きた時、メソッド内の発生場所で止まるようにする方法はありませんか?
標準モジュール内のメソッドを呼んだ位置まで巻き戻って停止してしまい、デバッグしづらいです。
こことPythonのスレはどうしようもない馬鹿が来るよな
>>584
説明不足だったかもしれません。
標準モジュール内で例外が投げられると、発生した行の色が変わって停止します。
これをクラスのメソッド定義の中でもできるようにしたいんです。 オプション→全般のエラートラップをクラスモジュールで中断にするとよい。
シェルスクリプトのことをシェルってゆうなってあるけど、どう違うの?
「Excel」とはマイクロソフト社が販売する代表的なコンピューター上で動作する表計算アプリケーションソフトウェアのひとつです。
「VBA」とは
(コンピュータ用語)で
読み方は【ぶいびーえー】と読みます。
VisualBasic for Applications【ぶぃじゅある べいしっく ふぉー あぷりけいしょん】の略です。
マイクロソフト社製の各Office製品に附属しています。
それぞれのアプリケーション(Excel、Accessなど)の操作に特化したVisualBasicの亜種です。
「質問」とは質疑問い合わせの事です。
「スレ」とはスレッドの略で掲示板のプロセス単位の事です。
「part」とは・・
【パート】【パーツ】
部分、全体の一部、断片
小説の節、戯曲・詩などの部,編,巻,(連載物の)回や
楽器演奏者の役割、時間労働者、機械の部品
などがあります。
Cells(1, 1)に、5Fという文字が書かれてます。
Cells(1, 1)から、Dim b As Byte と宣言されたbにバイナリデータの5Fを代入するにはどうすればよいでしょうか?
↓を実行すると、b = Cells(1, 1).Valueのところで、「型が一致しません」となります。
Sub test()
Dim b As Byte
b = Cells(1, 1).Value
Debug.Print b
End Sub
>>600
b = Val("&H" & Cells(1, 1).Text) >>601
おお、ありがとうございます。 出来ました! なんで変数の型も理解してない輩がExcelでバイナリ扱ってるの?
>>604
midiでスレを検索しろ
全部丸投げで作って貰おうとしてる厚かましい馬鹿だ 馬鹿に馬鹿だと言ってるだけでVBAでイキっているわけではない
VBAスレに馬鹿が多いからそう見えるだけで
5チャンネルはくだらない質問をすると、
張り倒されてぼこぼこにされて簀巻きにされて東京湾に沈められると聞いたので
がくがくしながら質問しています。
ちょぅとだけ質問していいですか?
Sub Main()
Dim RowCnt As Long
With ThisWorkbook.Sheets(1)
RowCnt = 2
Do
If .Cells(RowCnt, 1).Value = "" Then Exit Do
.Cells(RowCnt, 2).NumberFormatLocal = "@"
.Cells(RowCnt, 2).Value = GetISBN(.Cells(RowCnt, 1).Value)
RowCnt = RowCnt + 1
Loop
End With
についておしえてください。
間違えたここまでだった。
Sub Main()
Dim RowCnt As Long
With ThisWorkbook.Sheets(1)
RowCnt = 2
Do
If .Cells(RowCnt, 1).Value = "" Then Exit Do
.Cells(RowCnt, 2).NumberFormatLocal = "@"
.Cells(RowCnt, 2).Value = GetISBN(.Cells(RowCnt, 1).Value)
RowCnt = RowCnt + 1
Loop
End With
amazonSearch2
End Sub
30分かかって気付いたミスはコードの貼り間違いだけかよw
質問なんなんだよw
>>611
他にも続きがたくさんあるでしょ
全部のせないとわからない 他の掲示板で質問しているのでマルチポストになるとぶん殴られると聞いたので、
こっそりとしか質問できないので、、、
こっそり質問してます。(`・ω・´)
'Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
を64bitEXCEL(vba)で動かすためには、API宣言を変えないとダメだと聞いたのですが、
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If
に変えてみたのですが、
実行時エラー'91':
オブジェクト変数またはWithブロック変数がしていされていません。
と出てまたダメでした。
どうすりゃいいですかね?
マルチポストが駄目と分かった上でもやるのは性質が悪すぎる
>>610(たけし)は、本当はたけしじゃなくてタケルなのに、
お前たけしだろ!って言われて困惑している状態。
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
つまり セルをダブルクリックしたらセルの内容を削除(delete)キーを押した状態にしたいんだけど可能かな?
可能だよ
WorkSheetのBeforeDoubleClickイベントを使う
Deleteメソッドではないことに注意
それとは別に、普通にメソッドを実行するとUndoできなくなって危険だから、Sendkeysとか使った方がいいかも
久しぶりにこのスレ来たけど
お前らが相変わらずで安心したわ
>>512 512です
>>517さんの正規表現が私の理解不足でうまく使えなかったため>>522さんのやり方で下記のコードを書きました。1ファイル100列×500行程度のものを3つマージした後で置換するのは問題なかったのですが、5つのファイルをマージ後に置換したところエラー6のオーバーフローが発生し、8行目の「r = Reg.Replace(r.Value, "|")」の行がハイライトされていました
Dim r As RangeをDim r As Variantにしてみても解決しなかったのですが、これは検索対象の文字数が多すぎてオーバーフローになるのでしょうか。また対策があれば教えてください、よろしくお願いします(改行が多いと書き込めないため見づらくてすみません)
Dim Reg
Dim r As Range
Set Reg = CreateObject("VBScript.RegExp")
With Reg
.Pattern = "\|+" '検索パターン 連続した「|」
.Global = True '文字列全体を検索
For Each r In ActiveSheet.UsedRange
r = Reg.Replace(r.Value, "|") '「|」ひとつに置換
Next r
End With
With Reg
.Pattern = "^\|" '検索パターン 先頭の「|」
.Global = True
For Each r In ActiveSheet.UsedRange
r = Reg.Replace(r.Value, "") '削除
Next r
End With
With Reg
.Pattern = "^|$" '検索パターン 末尾の「|」
.Global = True
For Each r In ActiveSheet.UsedRange
r = Reg.Replace(r.Value, "") '削除
Next r
End With
Set Reg = Nothing >>627
文字数が多いのかもしれないと思ったなら少なくして試せばその考えが正しいのかどうか質問するまでもなく判明すると思うよ typeって使うとなんかいいことある?
少しずつパラメータは違うけど処理が同じのを何回もやらなきゃならなくて
Rengeでベタうちの方が後で見てもわかりやすいんだけど
そうすると少しずつ違う処理を全部作らないといけないんだよなあ
かと言って変数で共通化するとわかりにくくて後でメンテが大変そうでさあ
継承とかあればいいのに
VBAマクロの質問になりますが、
Webブラウザ上で検索した結果、10件ごとに1ページずつ結果がされた後に、
マクロから2ページ目に遷移する為の"2"のボタンを押したいのですが、
ソースコードの表示でhtml上に2のnameやtypeが表示されない為、マクロから2ページ目以降を自動的にクリックできません。
どなたかお教え願います
ボタンを検索してそれが"2"やったら押したらええんやで
vba dom ボタン でググった最初のサイトに書いてるやないか
html上でまったく見分けがつかないなら無理だ
あきらめろ
絶対に押すな!ってコメント書いとけばいいんじゃない?
Web上からname属性やタグ等の情報が拾えない場合の画面上のボタンをクリックする方法が知りたいです
違うよ、クリックされたときのイベントハンドラを知るべきだよ
VBAからchromeを起動して、googleでセルから拾ったwordの"りんご"を検索結果で表示させ、
htmlのソースコードが見れない状態で、2ページ目に遷移するボタンをクリックする方法になります
>>641
vba domで検索したらそれらしきページがありました
ありがとうございます >>627
Dim r As Variantにしても解決しなかったって、どうしてそれで解決すると思ったの?
というか、何でそんな頑張り?
Dim r As Range
Dim strData As String
Dim lngLen As Long
strData=r.Value
Do While lngLen<>Len(strData)
lngLen=Len(strData)
strData=Replace(strData,"||","|")
Loop
If Left(strData,1)="|" Then
strData=Mid(strData,2)
EndIf
If Right(strData,1)="|" Then
strData=Left(strData,Len(strData)-1)
EndIf
通勤中にスマホで書いたから試してないが、こんな感じでいけない? >>640
ChromeでやるならSelenium系の話になるだろう。
IE系ならInternetExplorer.Application使ってできる。
属性については、Id、name、classnameあたりが無いならgetElementsByTagname使ってタグの何番目とか、そのオブジェクトの親、さらにその親あたりをId、name、classnameあたりで取得して、childnodesの何番目とやる。 ワークシートに下記のコード書いたときには動作するんですが、標準モジュールに書いたときには動かないのはどうすればいいでしょうか?
やりたいことは、「NG」という文字があったときは、結果に「未」を、「済」の場合は、その時の列の名前を結果に表示したいです。すべて「済」なら「完了」と表示するという意図のコードです。
Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim intR As Integer,intC As Integer,strW As String,LastCol As Integer
intR = Target.Row
intC = Target.Column
strW = Target.Text
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
If intR >= 3 And intC >= 3 Then
Select Case strW
Case "NG": Cells(intR, 2) = "未"
Case "済"
Select Case intC
Case Is = LastCol: Cells(intR, 2) = "完了"
Case Else: Cells(intR, 2) = Cells(1, intC)
End Select
End Select
End If
Application.EnableEvents = True
End Sub >>645
サブルーチンとして呼び出しをしたいと思っています そりゃ標準モジュールではイベントは発生しないからな
処理そのものは標準モジュールにサブルーチン(つか言い方が古いw)として定義してもいいけど
イベントそのものはイベントが起こるところで拾って呼び出せ
>>647
単純にワークシートの方に
Sub test ()
Call Worksheet_Change()
End Sub
こういう呼び出しをしてあげればいいということでしょうか ワークシートのイベントの中で標準モジュールのプロシージャを呼び出す
もしワークシートモジュールに一切コード書きたくないならクラス使うしかない
>>643
ありがとうございます
教えていただいたコードで試してみました
そのままだと実行時エラー91になり「strData = r.Value」がハイライトされ、
「Set r = ActiveSheet.UsedRange」を足したところ実行時エラー13型が一致しません
となってやはり「strData = r.Value」がハイライトされたので
「For Each r In ActiveSheet.UsedRange 〜 Next」を足したところエラーは表示されず
ローカルウィンドウ上では「|」が置換されていくのですが、実際のセルの文字列は
置換されませんでした。これは何が問題なのでしょうか
Sub test()
Dim r As Range
Dim strData As String
Dim lngLen As Long
Set r = ActiveSheet.UsedRange
For Each r In ActiveSheet.UsedRange
strData = r.Value
Do While lngLen <> Len(strData)
lngLen = Len(strData)
strData = Replace(strData, "||", "|")
Loop
If Left(strData, 1) = "|" Then
strData = Mid(strData, 2)
End If
If Right(strData, 1) = "|" Then
strData = Left(strData, Len(strData) - 1)
End If
Next
End Sub >>648
ワークシートの中を変更したらチェンジのイベントが起きるよね? >>654
strDateはただの文字列の変数だから置換した結果をセルに入れ直さなきゃセルの中身は書き換わらんよ >>656
あーなるほど。最後のところ
End If
r.Value = strData
Next
にしたらできました、ありがとうございます >>644
ありがとうございます
objIE.document.GetElementsByTagName("タグ名")(添え字)
上記の構文で該当のページに自動クリックするようになったのです
For p = 1 to 10
objIE.document.GetElementsByTagName("タグ名")(p)
Next p
上のような構文で最初は2ページにきちんと遷移するのですが、次は4ページ、次は2ページ、次は3ページと
うまくページ遷移が出来ません。
一応MsgBoxでpを参照すると1〜10の数字は格納されてるみたいなのですが
objIE.document.GetElementsByTagName("タグ名")(1)で2ページ目
objIE.document.GetElementsByTagName("タグ名")(2)で4ページ目
objIE.document.GetElementsByTagName("タグ名")(3)で3ページ目
上記のように変数の数字と同じページに進んでくれない処理になります。
For文を使用してインクリメントするのではなく、表示させたいページとそれに対応する添え字で処理をしてくしか方法はないのでしょうか 本社が作って社内システムにアップロードされてるVBAマクロが
マクロの記録をつなぎ合わせて作った酷いコードでつらい・・・
連続した1000行*5列ぐらいのコピペするだけなのにVBE50行ぐらい使っててつらい・・・
>>657
まず、最初の方にあるSet r = ActiveSheet.UsedRangeは意味が無いし、必要無い。
rはFor文の中でUsedRangeの中の1つ1つのセルを巡っていくのであって、UsedRangeそのものじゃない。
次に、元々のプログラムでも思ったのだが、書ける人は文字列を与えると変換する関数を作ることを考える。
それさえ出来てしまえばrにそれを与えるだけ。
Private Sub test()
Dim r As Range
For Each r In ActiveSheet.UsedRange
r.Value=ConvertString(r.Value)
Next
End Sub
Private Function ConvertString(strData As String) As String
Dim lngLen As Long
Do While lngLen<>Len(strData)
lngLen=Len(strData)
strData=Replace(strData,"||","|")
Loop
If Left(strData,1)="|" Then
strData=Mid(strData,2)
EndIf
If Right(strData,1)="|" Then
strData=Left(strData,Len(strData)-1)
EndIf
ConvertString=strData
End Function >>658
クリックする命令が無いが、For文の中でクリックしているとして、
1.そのpの1〜10が正しく遷移出来るリンクのあるタグかどうか?
2.一旦、遷移したら場合にもよるがobjIEは遷移後のページになる。
とすれば、Document以下のソースが遷移後のぺージのソースになる。
3.遷移には時間がかかるが、それをきちんと待つことが考慮されている?
ぐらいは気になるね。 配列ary2の重複を削除して配列ary3にいれたいのですが
実行後ary3の値はすべて空欄になってしまいます
ary2には全て値が入っています
Option Base 1
Sub Test4()
Dim EndRow, cnt, cnt2 As Long
Dim flg As Boolean
EndRow = Cells(Rows.Count,1).End(xlUp).Row
ReDim ary2(EndRow)
ReDim ary3(EndRow)
↓続きです
For cnt = 1 To EndRow 'ary2に値は入っています
ary2(cnt) = Cells(cnt,1)
End cnt
For cnt = 1 To UBound(ary2)
flg = False
For cnt2 = 1 To UBound(ary3)
If (ary2(cnt) = ary3(cnt2)) Then
flg = True
Exit For
End If
Next cnt2
If (flg = False) Then
ary3(UBound(ary3)) = ary2(cnt)
ReDim Preserve ary3(UBound(ary3) + 1)
End If
Next cnt
End Sub
>>663
Dimの型を省略するとVariantになる
全部Longにしたい時はこう書く
Dim EndRow As Long, cnt As Long, cnt2 As Long >>663
ReDim ary3(EndRow) がおかしい
最小限直すなら ReDim ary3(1) >>663
変数の中身がどういう動きしてるか1行1行確認しよう >>665
勉強になりました。ありがとうございます
>>666
ご指摘の通りでした。ありがとうございます
>>667
確認しましたが、すべてのcntの時にary3が空になってしまっていました >>664
ひょっとしてary2には値が入っていたけど
ary2(cnt) = Cells(cnt,1)
で、セル値を設定してて
セル値に値が入ってないとかいうオチだったりして Mapに固定値設定してMapから取り出すってなんか意味ある?
直接固定値見てもいいんだけど
>>668
どうして空になってるのか順に追って行かないと原因わからんでしょ・・・ VBAの知識0なんですけど
・1000円以上買うごとに1口
・1ヶ月感の累計購入金額総額で抽選
この条件で最大300人に当たるキャンペーンやりたいんだけど
これをVBAで動かして抽出するのにどれくらいの手間がかかりますか?
口数は1人あたり0口から5000口(最大500万円想定)
対象人数は最大2万人を想定してます
ランダム関数でなんとか無理やり組もうとするとデータ多すぎてメモリたんなくなる・・・
>>673
できる業者に委託する金だけだせばいいんじゃね 一口ごとに1枚プリントアウト。この時なるべく小さい紙に印刷するのがポイント!
後は紙を穴の空いたボックスに詰めて目隠しした担当者が300枚を抜き出す
個人の氏名ごとに口数記録するじゃんね
口数の合計値をlongにいれるじゃんね
longの最大は21億〜だからいけるじゃんね
んでその合計値が例えば20万だったら
20万の中からRandomをうまいこと使って300個の数字を抽出すればいいだけじゃんね
各数字は氏名ごとに記録した口数を上から合計したときの数値と一致するわけじゃんね
簡単じゃんね
抽出するには、いろんな方法あるけど
位ごとに数字を選ぶみたいなのでもいいじゃんね
例えば合計値が232,984口だったとしたら
10万の位→2,1,0から1つえらぶ
1万の位→9,8,7,6,5,4,3,2,1,0から1つ選ぶ
千の位→9,8,7,6,5,4,3,2,1,0から1つ選ぶ
百の位→9,8,7,6,5,4,3,2,1,0から1つ選ぶ
10の位→9,8,7,6,5,4,3,2,1,0から1つ選ぶ
1の位→9,8,7,6,5,4,3,2,1,0から1つ選ぶ
これで1つの数字ができる
これを300回繰り返すんだけど
0になったり、重複したりしたら無効でやり直しするじゃんね
てかどういう風でもいいからゴリゴリやっていくのが面白いのにさー
スマートじゃなくてもいいからゴリゴリいこうぜぇー
最初口数だして横に5000まで数字並べて
IF(1〜5000<口数,RAND(),"")って全部のセルに埋めてたら
20000×5000の関数が動くからフリーズして困ったんだよね・・・
これをやったあとMAX関数で一番でかい数字引っ張ってきて
それをソートして上から300人ってすれば重複当選もないし問題ないかと思ってた
まさか4〜500万購入ユーザーがいるなんて聞いてなかったから気軽に引き受けちゃったよ・・・
取り敢えず2万人の口数を順番に足していったリスト作って
合計数からランダムに300個抜き出して
それを作ったリストと照らし合わせればいいのか
サンクス、突破口見えた気がする
VBAじゃなくてもいいのか・・・ありがとう
それなんも工夫ないじゃんね
つまらないじゃんね
のーたりんじゃんね
>>673
A列に人の名前なりIDなり入れる
B列に口数
C列は当選番号の割り振りで、C1はB1の値、CnはC(n-1)+Bnとし、C(n-1)+1〜CnがAnの当選番号
これと独立して300回ランダム*全口数+1で当選番号300個を作る
それを1つずつ誰のものか確認して当選者とする じゃんね、ってどこの方言だろ
東京ではじゃんとは言うけど
じゃんねはあまり使わない
使ったとしてもここまで執拗に使わないじゃんね
この方式だと重複当選しちゃうな・・・
2〜3回繰り返して重複当選除外してやるかいね
どうせ1回しかやらんし
ああ、重複当選なしなのね
じゃあ300じゃなくて400ぐらいやっといて、301以降は順に重複時用の補欠にすればいい
2口の人は2回当選して然るべきでは?
口数ってそういうモノだと思うが
複数当選してしまうと総額が景品表示法に引っかかってしまうんですよ・・・
>>673
A列に個人名(もしくは個人コード)
B列に1回の購入金額
この形式で基礎データをもらえるものだと思っていいの? >>690
ユーザーIDと期間内の累計購入金額は貰えます
手元に前年同月のデータもあります >>689
その場合、複数応募者は口数に比例して当選確率を上げるアルゴリズムにしないと公平にならないけど
正直にやるか、手を抜いて全員の確率を同じにするかは運営側の気持ち次第 VBAの基礎を学んで言われたことを遂行するための知識を得るための手間かな・・・ほんと知識0なんで必要ならこれを機に手を出してみようかなと
ビール飲みながらすげー適当に組んでみたんだけどあげちゃだめなの?
てかコード貼ったら使えるレベルなん?
うちの3世代ぐらい前のi5のPCで300件で5分ぐらいかかりそうな感じだけど
>>658
回答頂きましてありがとうございます
再度の質問になえうのですが
getelement.所属クラス.getelementbytagname("a")(インクリメント変数).length -1
messageボックスでouterhtml出力
上記で取得されてる要素を参照すると
1の時、label=page1 何だかcheck=true
2の時、label=page2 何だかcheck=false
3の時、label=page1 何だかcheck=false
4の時、label=page4 何だかcheck=false
5の時、label=page3 何だかcheck=false
上記のような要素取得がなされており、番号順にページ遷移がなされてないことがわかりました
タグ以外にラベルやタイプ等で特定要素を抽出する方法はありませんでしょうか >>695
書き方だけならネットでいくらでも調べられる
言語知識よりやりたいことを実現するため計算方法を考える力が一番重要 >>673
知識ゼロならまず、実現する為の手順を箇条書きで書き出す。
それを皆んなに見てもらっていけそうになったら
その手順に従ってプログラミングする。 Excel VBAの問題じゃなくてそれ以前の問題だよな
innertextでクラス配下のaタグの行を1つずつ抽出でfor eachでページ番号のラベルに引っ掛けて処理するっていうのは可能でしょうか
すいませんある程度自己解決しましたが、取得した要素にouterhtmlで抽出したところ番号順にタグ情報が取得出来たのですが、outerhtmlに続けて.clickだとエラーになります
一旦変数に格納しないとクリック出来ませんでしょうか
>>706
まずさ、OuterHtmlの型は何か考えてみようよ。
これでピンと来ないようなら、色々勉強する必要がある。 >>707
すいません
Dim table_date As MSHTML.HTMLDocument
上の宣言でまずouterhtmlの取得要素を格納する変数を宣言する必要があると思いますが
ユーザー定義型エラーが出てしまい、調べたところ参照設定で[Microsoft HTML Object Library]を有効にしないと使えないという事ですが、
上記のHTMLDocumentオブジェクトで宣言したマクロを他のPCのエクセルでも使用する場合、イチイチ参照設定を有効にしないと使えないのでしょうか
あともう1つの質問になりますが、
table_date = getelementclass(objie,"所属class名").outerhtml
上記でまず対象のタグが所属するclassの全要素を変数に格納したあと
for i = 0 to 10
table_date.getelementsbytag("a")(i).click
next
変数に格納されたhtml文のaタグ要素を一行ずつ取り出してボタンクリックしたいのですが、
この構文で可能でしょうか ちゃんもリファレンスを読んで返り値の型を確認しようね
>>708
まず自分で考えるくせを付けたほうがいいよ ソルバーを使おうと思ってまずは機能するか簡単なものを作ってみたんですが、
与える値によって解があるにも関わらず機能したりしなかったりするんですが何がおかしいのでしょうか
A2 9
A3 15
A4 30
B2 空白
B3 空白
B4 空白
C2 =SUMPRODUCT(A2:A4,B2:B4)
として、値45で実行すると正しく解が見つかるのですが
値60で実行すると解が見つけられないのです。
45の場合
60の場合
>>712
は?ちょと、なに言ってのかわからない
何もおかしくないじゃない!?
ちゃんと54て出てんじゃん! 局所最適なんだから初期値によって結果が異なるのは自明です
>>708
OuterHtmlの型は文字列。
ということは
Dim strA As String
strA="abc"
strA.Click
と同じことしようとしてる。 質問です
シェイプを回転させたくて
シェイプのRotationX,RotationY,RotationZを弄ってみたのですが、
Z軸は上手く行くのですが、X軸、Y軸はその軸に併せて縮小するだけで全く奥行きが出ません。
これは設定するプロパティが足りないのでしょうか?
それともこういうものなんでしょうか?
>>713-714
エクセルに問題がないなら問題があるのは私ということで考えてみたら
与えた命令を根本的に勘違いしていたみたいです
同じ値を複数回選択することもできると思っていました
もともと想定していた目的には問題なく使えますし、
もし複数選択させたい場合は同じ値を複数入れて対応します
スレ違いにも関わらず温かくご回答いただきありがとうございました
>>715
スレ違いだったみたいで申し訳ないです
ご迷惑おかけしました >>717
透視投影?
確かにマクロの自動記録でもそこだけ変わらないな。
しかしこれ何に使うんだろうな。
重すぎてポリゴンゲーは作れないしな。
スターフォックスレベルでも無理だろ。 部屋の模様替え後のレイアウトをExcelで作ろうとしてた人はいたな
一軒家の建築図面をExcelで作ろうとしてる人もいるかもしれない
15年ぐらい前に、セルに色を塗ってゲームやアニメを作るのがはやった
できるかできないかじゃなくて、表示パフォーマンスや製作コストが実用レベルかどうかが重要では
>>717の目的は
【シェイプを回転させたくて 】
なので回転出来るんだからそれで達成できてる エクセルを禁止しないと日本のITは韓国に追いつけない。
エクセルのせいで数学がわからない子供たちが増えている。
Ubuntuを使うべき。
そもそも子供はExcel使ってねーだろ
なんか電波でも出してるのか?
ソロバンから電卓に代わってもそうゆう人って一定数いるよね
小学生からExcel使えるなら
FAXで集計してるコロナ関係者よりマシ
そうゆうとか言ってる人はVBAの前に日本語勉強したほうがいいよ
小学生のIT教育でUbuntuのインストールを教えるべきでは?
すいませんすみませんあーざーっす
「なんで、そーゆーこと言うの?」さおいふ
オッハーマヨチュチュ
タイガーアッパっパー
「こちらの方でよろしかったですか?」
「おにぎり温めなかったほうで大丈夫ですか?」
「お買い物袋はお持ちでありませんでかまいませんか?」
UbuntuはスパコンのOSにも使われているので、数学に強いです。
エクセルは禁止にするべきです。
>>736
金持ちLinuxおじさんこっちに来てまで迷惑掛けるなよ マクロ実行ボタン1を押すとマクロ実行ボタン1が消えて
新しいマクロ実行ボタン2が出現。ボタン2を押すとマクロ実行ボタン3が出現するような
繰り返し動作を行いたいのですが可能でしょうか?
コードを教えていただきたく、よろしくお願いします。
>>738
少し違うけど、こうした方が楽
With マクロ実行ボタン
Select Case .Caption
Case "マクロ実行ボタン2"
マクロ2
.Caption = "マクロ実行ボタン3"
Case "マクロ実行ボタン3"
マクロ3
.Caption = "マクロ実行ボタン1"
Case Else
マクロ1
.Caption = "マクロ実行ボタン2"
End Select
End With 一つのボタンにいろんな機能を詰め込むのはどうかと思うの
>>738
最近そう言うUI多いけど昔のように押せない時はグレーアウト(.Enabled)する方がわかりやすいと思うのは俺だけ? もう少し背景が分かるとね
インストーラの [次へ] みたいならこうだとか、有意義な回答が得られそうだけど
ボタン1が押される
表示をボタン2に変える
無効にする
ボタン1の処理する
処理終わる
有効にする
これならまぁ押された時の表示によって分岐もありかな
>>743
その場合はシートの移動のほうがスッキリする ラウンドワンとかゲームセンターに置いてある
「動体視力ゲーム」みたいなのじゃないの?
数字ボタンがランダムな位置に出現して
押したら次のボタンが別の位置に現れるヤツ
>>673
エクセルのほうが簡単だと思います。
A列:1〜20000までの連番
B列:口数
C列:∔B1/B列合計 (以下コピー)
D列:1行目は0、2行目 +C1、3行目以降は=+D2+C2をコピー
E列:+A1(以下コピー)
F列:=RAND()(以下コピー)
G列:=VLOOKUP(+F1,D$1:E$20000,2)を300行目までコピー
300/20000なら大口がいないと重複しなさそう。
重複があったらシートコピーして当選行を削除。 俺らそういうのいやだから
重複しなさそうとか認めないし
ベースモデル考えて確率的に速い手段を選ぶだけ。
コード書くのが好きなら計算結果を配列に入れて、既定カウントに達するまで回せばいいけど、時間の無駄。
条件にもよるけど今回の話の場合は1回目重複覚悟でやってから重複分だけ再度重複なしの方法でやるのが速そうだね
>>752
実際にコード書いたから5分かかるっていってんだろぼけなす
てめぇみたいに他人のワッチョイに執着する気持ちの悪いはげおやじじゃねぇんだよぉ >>747
A列:連番
B列:口数
C列:当選確率 = 口数/口数の合計
D列:点数 = 当選確率*RAND()
これでソートかけたほうが簡単じゃね
300番付近のボーダーラインで点数の重複が生じたら
重複者のみを対象に再度抽選
まだ重複者がいたらさらに再度抽選(・・・)
再抽選回数が0〜300と未定だけども現実的には多くても数回で終わるだろうよ それだと当選確率が公平にならない気がする
まあコーディングの手間と計算時間と公平さとどっちを取るかだな
数学的に「当選者を除外しながら次を抽選」で公平になる
A列に応募者を一列に並べて、2口応募なら2回並べて、存在するデータの行数*RAND()+1で抽選すれば、自動的に口数に比例して当選確率が上がる
当選者はどこかに覚えておいて、A列から除外してから次を抽選
300人の抽選なんて1秒もかからないし、プログラムもきわめて単純、作業列も必要ない
>>756
当選の公平さを取らないと企業として問題あるよ もう無理して数式でなんとかしようとするよりVBAでさっさと作った方がややこしくないし手っ取り早いんじゃないの
それなら処理時間なんか気にする必要も無し
いぜん懸賞の雑誌で架空の人物に当選したとかやってたな
発表は発送をもってかえさせろってのは
みんなインチキだよ
運ちゃんがボスジャン着ていたのは役得
抽選システムなんて大概再使用されるだろうから手作業で当選者除去とかやらないといけないならVBAで組んじゃったほうがいいだろうな
つかVBAの乱数とか公平といえるんかね
本当に公平な抽選は第三者立ち合いで見えるようにやるんだが
プログラムによる抽選が不正扱いなら全国の企業が謝罪案件になるが・・・
Sheet2で使うユーザーフォームにSheet1から参照したデータをコンボボックスに表示させ
CMBBox1の入力内容に合わせCMBBox2を連動させたいのですが
CMBbox1はこんな感じでデータを拾っています。
CMBBox1.RowSource = "Sheet1! H3:H" & Worksheets("Sheet1").Range("H" & Rows.Count).End(xlUp).Row
CMBBox2にCMBBox1が入力されると、参照列(H列)の4つ右のセルを表示させるにはどうしたらよいでしょうか
(CNBBox1にSheet1のH3が入力されると、CMBBox2のリストにSheet1のL3が表示される)
似たようなコードを拾ってきたのですがこれを弄って使えるようにしたいです。
Private Sub CMBBox1_Change()
Set ws = Worksheets("Sheet1")
Col = CMBBox1.ListIndex + 12
品名CMB2Box.Clear
For i = 1 To ws.Cells(Rows.Count, Col).End(xlUp).Row
CMBBox2.AddItem ws.Cells(i, Col).Value
Next
End Sub
よろしくお願いします
リストに1件だけ表示っておかしくね?
そのデザインは却下だ
listindexとoffset使えばいけんじゃね?
A列最終行の次の行から、下方向150行に本日の日付を表示させたいのですが、
どう記述して良いのかわかりません。
ぐぐって最終行取得のコードまでは見つけたのですが、指定範囲に日付表示のコードを
見つけることが出来ませんでした。
お手数をおかけしますが、ご教授をお願いします。
>>773
自分で考える気なさそうだな
その拾ってきたコードのどこが分からんのだよ?
それが出来てそのあとどうする気か知らんが
CMBbox2.Clear
CMBbox2.AddItem (Sheet1.Cells(CMBbox1.ListIndex + 3, "L").Value)
これで、二度と来るな >>776
簡単なのはループで入れる。
r=最終行 + 1 to 最終行 + 150
cells ( r, 1)= date
next r for とか、変数宣言とか抜けてるけど、そこはがんばって補完して。
forなんて使わなくてもいいんじゃね
Sub test()
Dim i As Long
i = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(i + 1, 1), Cells(i + 150, 1)) = Date
End Sub
>>780
ありがとうございます!
あとは自力で頑張ってみます! >>781
解答ありがとうございます!
1つの答えに対し複数のコードがあるって面白いですね!
初歩的なコードが書けるよう頑張ってみます。 そういう感想が出るってことは、答えを出すための手順を全く自分で考えたことがないのでは…
RNDやRAND関数は疑似乱数だから公平じゃない
そもそもコンピューターで乱数を生成するのは不可能
知識としては知ってるけど、代替手段を考えるのも面倒だしみんなRNDを使ってるから別にいいんだよ、ってこと
同じシード与えたら同じ乱数列吐くよね。
で?何のためにあるって?
もう最大限のことも自分で考えない馬鹿には答えなくて良くね?
多分何度も聞きに来るぞ
>>789
同じシードを与えないためだろ、使い方知らんのか? >>787
コンピュータという広域の括りであれば
乱数を発生させるのは不可能ではないよ 数式で「真の乱数」を発生させることは不可能でしょ
何かしらの雑音を外部から取り入れるならあり得るけど
しかし真の乱数と区別できない疑似乱数というのはある
たかだか数万個の乱数を発生させる程度なら普通にRANDで構わんよ
コンピューター空間内(例えば64bit)なら32bitの疑似乱数を発生させ得る
excel起動時のシードが同じだから変えたほうがいいとおもう
>>794
数式で真の乱数を発生させることが出来ないのは多分そう。ただ、それでも真の乱数は発生出来る。
ただ、かなり特殊な環境で言語的にもかなり特殊なのでVBAだけやってる人にはまぁ分からないだろう。
ただそれは、一度世界で最も出回ったハードであり言語でもあって、それでは乱数を求めるのに至極当たり前の方法でもあったから
このスレにいるおじいちゃんにはひょっとして知ってる人もいるかも知れない。 乱数こそこのスレで教えてくれた最高の武器
15個〜20個しか評価してないデータを50個に乱数使ってn増ししてるわ
プロシージャ名は乱れ雪月花にしといた
2016使ってるけど、いつの間にかSORTBYとかFILTERとか使えるようになってるのな。
そもそも乱数に偏りがあろうと応募者が狙った並びでない時点で機会は公平だけどな
決まった番号がでるとわかっているからその番号に身内を入れて置けるわな
乱数で疑似データをつくるとばらつきが均等になるから偏差を求めたときに不自然に広がるよね
スレチだったらスマソだけど、excelのスピル?のせいで、ver違うexcel間で共有してたファイルが勝手に配列やら@やら数式が変換されてバグってんだけど、これ無効にできないの?
>>805
キミにピッタリな格言を贈ろう。
It is no use crying over spilt milk >>807
最近追加されたアレね
分からん。田中先生にでも聞いたら? 旧バージョンの配列式に勝手に@が付くのは仕様じゃねえの
旧verの {=a1:a3} が新verでは =@a1:a3 に変換される
新verのスピル式 =a1:a3 は旧verでは {=a1:a3} に
VBA的にはFormulaプロパティとFormula2プロパティを使い分けることによって新旧verどっちにするかを指定できる
パーフェクトExcelVBAの初版本の正誤表とサンプルコードってどこかにありませんか?
コレクションにaddしたシートだけを一発で選択するにはどうしたら良いですか?
>>815
addしたあとから調べる方法はないからaddする時に変数に覚えておくしかない セルA1~A5に1~5が入っていて、5個のaverage=3ですが、
1) 複数の連続セルを選択することで同じ動作をするfunction
2) function 自作平均値(セルを1個指定する as ???, 上のセル数 as byte, 下のセル数 as byte) as double
で、=自作平均値(A3, 2, 2) としたら同じ結果を得る関数
ってそれぞれどう書けばよいでしょうか。
値を直接入力する予定はなく、セルアドレスを取得できれよいかと思いますが、
方法がわかりません。
参考urlでかまいませんので教えてください。
ITに疎いクライアントのために
デモ用のVBAが動作しているところ録画して見せたいのですが
そのために向いているツールとかありますか?
>>817
Function 自作平均値(セルを1個指定するAs Range, 上のセル数, 下のセル数)
自作平均値 = Application.WorksheetFunction.Average(セルを1個指定する.Offset(-上のセル数).Resize(上のセル数 + 下のセル数 + 1).Value)
End Function
文章が意味不明なんだけどこんな感じでいいの? >>819
Excelの画面をビデオ録画する操作はExcelを起動してから田+Alt+R
ただしVBEのウィンドウは開いても重ねても録画されないので、ワークシート上にマクロの起動ボタンを置いておく必要がある >>819
win10なら標準で画面録画ツールあるよ
win+rだったかな >>815
そういう時はDictionaryにすれば良いんでね? >>819
そのVBAを自動実行するVBAを書く。 VBAの知識は全く無いけど無駄な事は少しでも省きたい
そこで質問なのですが、複数の結合されたセルの値を一括でクリアしたい時
Range(“A1”).MergeArea.ClearContents
Range(“A2”).MergeArea.ClearContents
Range(“A3”).MergeArea.ClearContents
Range(“A4”).MergeArea.ClearContents
ひたすら続く
これを短くするにはどうすれば良いでしょうか?
あーっとすみません
AはBと連結していますのでそれぞれが横に連結しています
>>828
まずセルの結合が無駄の元だから禁止するのが一番の早道 >>832
やはりそうですよねぇ
既存のフォーマットに寄せようと思うとどうしても結合セルが必要に...
色々試行してみます。 悪いけどこの程度のこと質問するようじゃ手でやったほうが早いと思う
該当セルを全部選択して右クリックから値のクリア
>>834
それをマクロの記録で記録するのが一番楽だわな >>835
この程度なら、毎回やるにしてもマクロ使わずに手でやって余裕でできるレベルだろ >>828
きったないコードの書き方になるが
Din i as Long
For i =1 to 最後の数
Range(”A” & i).以下略
Next i
で簡素化 range("a1:最後").value=emptyじゃだめなのか
>>828
Dim i As Long
Dim lngMaxRow As Long
'/// 最終行取得
lngMaxRow = ActiveSheet.Range("A65000").End(xlUp).Row
'/// ループ処理
For i = 1 To lngMaxRow
ActiveSheet.Range("A" & i).MergeArea.ClearContents
Next i .Clear と .ClearContents と .Value=Empty の違いがわからん
これをマウスやキーボードで再現する方法も
たとえばセルを選択してDeleteキーはどれに相当?
Clearはセルに入力されてる数式や値、そして設定されてる書式もすべて消す
.ClearContents は数式と値のみクリア、書式は残る
.Value=Emptyはニュアンスが逆で"何も無いを入力"、つまり消す。.ClearContentsと同じ
deleteキーは.ClearContentsや.Value=Emptyと同じ
不規則な結合セルがあると .MergeArea.ClearContentsはエラーになるけど .Value = Emptyなら動くから>>828はRange("A:A").Value = Emptyの一行で解決ってこと >>834-844 ありがとうございます!
皆さんが言うように全くの知識ゼロですが色々検索してなんとか思った通りのボタンが完成しました。
しかし全角やらスペースやら分かり辛いプログラムって難しいですね... 赤線先生が手取り足取り教えてくれるのに何が不満だと申すのかこのガキは
n行ごとにデータを拾って少し文字列等を足してからほかのシートに貼り付ける、
という作業を現在For文でやっています。行数が多いと多少時間がかかることも
あるので、配列でできないかと思い試してみたのですが、「n行ごと」の部分が
うまくいきません
Dim tmpArr(), tmp As Variant
Dim rowIndex, colIndex As Long
tmpArr = Worksheets(1).Range("A3:C101").Value
For rowIndex = 1 To UBound(tmpArr) - 2 Step 3
For colIndex = 1 To UBound(tmpArr, 2)
tmp = tmpArr(rowIndex, colIndex) & "結合データ"
tmpArr(rowIndex, colIndex) = tmp
Next
Next
Worksheets(2).Range("A3:C35").Value = tmpArr
上記の場合3行ごとに元の値に「結合データ」という文字列を足すことはできて
いるのですが、貼り付け先のシートに全行貼り付いてしまいます
3行ごとの場合に要らない2行目、3行目を除外して
Sheet1 1行目→Sheet2 1行目、Sheet1 4行目→Sheet2 2行目…
というように貼り付けるにはどこを変更したらいいでしょうか
貼り付けたあと要らない行を削除してみたのですが、却って時間がかかって
しまったため、それ以外の解決方法があれば教えてください、よろしくお願いします
>>847
tmparrの要素数見てみ
もう1つ別に、貼り付け用のVariant型配列用意して新しく格納していかないとそりゃ空白行できるよ
それと、stepよりmodで条件分岐スキップさせる方がスマートじゃないかい >>847
こういうこと
あと、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 >>849
その書き方だとRowが大きいやつ排除されずに新しいシートに貼り付けられません?
それともC35までで出力は終わりだからいいんですかね?
メンテナンスしづらいかと思います >>850
そういう時はセル範囲を変数にして、どっちかのインデックスを3で割るか掛けるかすればいいんだよ
それならメンテは一箇所で済む
データの範囲をxlUpとかUsedRangeなどで調べたりテーブル化すれば全自動にもできる >>849
ありがとうございます
最初インデックスが有効範囲にないとエラーがでたので「arrIndex = 0」を
「arrIndex = 1」に変えたらできました
配列なので0から始まるということなのかと思ったんですが、1にしても
大丈夫なんでしょうか?出力した結果はForのものと同じだったので
貼り付け後に1行ずれるということはなさそうなんですが…
しかし確かに速いですね、配列
データを5000行×3列にしてテストしたら
For 約2.7秒
配列 約0.03秒
といった感じでした
>>850,851
コピー元のセル範囲は変数にして見出し行引いてnで割ったりして貼り付け先の
範囲を出してます
今回は決まった数字の方がいいかなと思って99行を3行ごとで33行、みたいに
してみました >>852
tmpArrにセル内容入れた時のインデックスを確認すればわかる 環境
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環境って現状こんなものなの?
>>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
というように変化していきましたので大丈夫そうです、ありがとうございました コンパイルエラーじゃねーか、何を問題にしているのかわからん
試してないから知らんけど
64ビット長の文字列とかサポートされてないから当然だと思うけどな
つか今のEXCELついに64ビットが規定になったのか
>>855
いや、なんでインデックス0だとエラーになるかって話・・・ >>858
あ、そっちでしたか
エラーが出た状態のそれぞれのインデックスは
rowIndex 1
colIndex 1
arrIndex 0
でしたので、
tmpArr(arrIndex, colIndex) = tmp
のところが
tmpArr(0, 1) = tmp
になってエラー、ですかね? >>859
tmpArrにインデックス0は存在しないのに指定するからエラーが出ていて、セル範囲を代入した時は1から始まることを知らなくても変数の状態をチェックすればすぐわかることだが、もしかしてローカルウィンドウとかを知らないパターン >>860
あんまり使いこなせてはいないですがローカルウィンドウは表示させています
849さんが教えてくれたコードの中でarrIndexを「0」に指定しているのにはなにか
理由があるんじゃないかと思ったんですが、書き間違いとかでしょうか? >>861
そういうのスルーできないとこの先進まんよ VLOOKUPについての質問なんですが、
検索キー 検索範囲1 検索範囲2 産地
りんご りんご ぶどう 岡山産
みかん りんご 岡山産
いちご もも 岡山産
りんご ぶどう 山梨産
みかん なし 山梨産
いちご りんご 山梨産
りんごから別セルの検索範囲1を見た後に検索範囲2を見にいって産地の戻り値を得る関数を作りたいのですが、
検索キーのヒットで産地が重複した場合は表示を1度だけにして、期待する結果として「岡山県 山梨県」とだけ得られるような関数を作りたいです
VLOOKUPを&で繋げると「岡山県岡山県」と列の一番初めの戻り値しか得られません
VLOOKUP以外でもやり方があれば教えて頂ければ助かります
>>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 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
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
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
質問しないで自力でできるようになるのがまず先だろう
シート1のプルダウンから選択した結果(テキスト)を
シート2の任意のセルに表示させるにはどうすればいいですか?
A列には数字を手入力
B列には●があったりなかったり
B列に●がある場合A列に数字を(例えば100)入力するとメッセージボックス?がでて
「●があるから入力しちゃ駄目よ!どうしても"100"を入力したいの!?」
「OK」「キャンセル」
みたいにしたいんですがどーすればいいですか?
Worksheet_Changeイベントを使えばいいです
1を入力した時点でメッセージボックスが出ると思うんだが10まではセーフで100だと確認のほうが良いのか
>>875だけどいい忘れてました
0を入力した場合はメッセージ出さずにそのまま0と入力
0以上(例えば200)を入力した場合は「●なんだから入力すんなボケ!どうしても"200"って入力したいの?」
「OK」「キャンセル」
みたいなね OK押したらそのまま200がセルに入力される
キャンセル押したら""ね
メッセージボックスはうっとおしいからセルの色を変えるぐらいのほうが喜ばれるよ
>>883
それでも入力する奴がいるんだもん
IF(B2:B10000=●,"入力すんな","")
これでも駄目 自主的にしないのなら入力規則をユーザ設定にしてエラースタイルを注意でいいじゃんかと思うんだが
>>887
そうか
やってみようかな
ちなみにVBAだとどう書くの? 個性的な物を作りたいのなら図形を使えば色も形も自由自在に作れる
Win10で、VBAを作っています。
テキストファイルをLine関数で1行ずつ読み込み
読んだ行にてInStr関数で円マーク(\)を検索
しています。
InStr(1, 検索対象, "\")
と書いています。
しかし\が無い行で「ある」と判定されているようです。
\にはエスケープ文字が必要だからではないかと思いますが
どう書いたら良いかわからず途方に暮れています。
どなたかご教示ください。
(文字コードで指定すれば良いようですが
他の担当者が理解できない可能性もあるので
別の方法も把握したく存じます)
instr特に問題なさそうですが。
ウォッチ式の想定外時検索対象文字列は晒せないのですか?
instr使わずに1文字ずつ取るとか?
>>892
されてるようですじゃなくてちゃんと確認して >>893
[壁]_・)_シン・シンギュラリティ¥n >>893
会社の住所です
一文字目が全角郵便マーク
2文字目が全角スペース
三文字目から半角数字で郵便番号です。
\と半角ハイフンの間を取り出す処理を
書いたところ
郵便番号最初の3桁、
ハイフンの手前まで
が取り出されますので
全角スペースが\マークとして
扱われてると思ってます >>893
「\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
\と半角ハイフンの間を取り出す処理
を全角スペースが\マークとして扱われてると思ってます
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-」 >>899
そもそもVBAにエスケープ文字とかないから
お前のコードがバグってるか、テキストがちゃんと読めてないかどっちかだろ
とりあえずコードと読み込んだデータ晒せ >>899
その説明だとコード晒してもらわないとわからん
住所そのまま晒してって言ってるんじゃなくて
別の文字に置き換えていいから同じフォーマットで
処理前後でどうなってほしい所がどうなってしまうのか書いてもらわないとわからない >>900
なんで想像するだけで実際の中身を確認ようとしないの プログラムってのはなあ、思った通りには動かないもんなんだよ
いつでも書いた通りに動くだけ
タブとか改行(CR+LF)とかバイナリデータが混ざっているとか機種依存文字とか
文字コードの違いとか色々あるからな
まあ一番怪しいのは、文字コード関係でテキストがちゃんと読めてない
ちゃんと読みこんだデータのバイナリ確認してみろ
line inputはSJISで読み込む
バイナリ確認しなくても元ファイルがSJISであればそれでいい
すみません892です
デバッガで見たら
全部の行で1を返してました
つまり全行、先頭は\マークみたいです
1文字目は無視するようにしたら
意図通りの動きになりました
>>909
それ完全にその場しのぎでしかないから
他の担当者が後々困る絶対 VBAからPowerShellで外部コマンドを実行して出力内容を加工したいのですが、うまくいきません
現在は、Execの引数に下記のように書いてます
powershell -Command "& Invoke-Expression 'コマンドのパス\コマンド.exe' -option1 -option2 "foo bar" >>'一時ファイル.txt'"
どうしたらよいでしょうか
テキスト全行読み込みしてsplitしてる説
んで\rでsplitして\nが先頭に来てるんじゃね
>>912
Exec("powershell -Command Invoke-Expression 'コマンドのパス\コマンド.exe' -option1 -option2 'foo bar' >> '一時ファイル.txt'") shell でいいのにわざわざ外部オブジェクト使う人っているよね
>>914
改行コードは別に文字列としての\が入ってる訳じゃないだろ >>915
ありがとうございます
もう一点よろしいでしょうか
標準出力にUnicodeで吐き出すコンソールアプリの出力を、Wscript.Shell.ExecのStdOutを使用して読み込みたいのですが、文字化けします
個人情報を扱うのでできれば一時ファイルを作らずに作業したいのですが、Unicodeの標準出力を直接読み込む方法は無いでしょうか >>918
オプションなどで、文字コードを指定できないの? これから新規に作る形式の文字コードは、UTF-8とGB18030の二択じゃないでしょうかね。
>>921
調べたところわかりませんでした
Unicodeの文字が欠落するのでSJISに変換して流すのも避けたいです
一晩考えてPowerShell側でBase64エンコードしてからVBA側でデコードしてみようと考え直しました
失礼しました ちなみに、Wscript.Shell.Execに渡せるコマンドラインって255文字までのような制限があるのでしょうか
コンソール側で動いたコマンドラインがExecからだと動かなかったりするので
>>924
状況がわからないので超エスパー回答すると、
32bitじゃないと動かないものを64bitで実行しようとしている。 >>926
ありがとうございます。
PowerShell上で動作を確認したワンライナースクリプトをExecで実行したら動かなかったもので、特に根拠があって疑ってる訳じゃないです。
こちらはPS1ファイルを用意して実行することにしました。 ところで、ADODB.Streamに書き込んだテキストをCSVとしてパースしてRecordSetに読み込む方法をどなたかご存知ないでしょうか
一時ファイルを保存すればいいのですがオンメモリでやれたらそちらの方がありがたいです
同じADODBクラスなので方法がありそうだなと思い調べてみたのですが…
ノイズが発生してるけど無視していいよ
知ってて答えたい人が答えると思うし
>>928
ちょっと意味が分からない。
そこまで知っていて出来ないというのは、どこで躓いているのか。 できないわけじゃない
1文字づつ解析とか馬鹿らしくてやってられないから一発でできる方法を聞いておる
一年他部署に応援行ってて戻ってきたが
その間に転属されてた人に
これがあれば一覧のデータを一気に出力できるからマクロの使い方だけは覚えてね
マクロとかわかる?とにかく使い方おぼえて
と言われた
俺が応援行く前に作って課に展開したマクロやんけ…
strconvで文字列"試験"をUnicodeに変換すると、変な文字に変換されるんだけど解決策ありますか?
StrConv(StrConv("試験",vbUnicode),vbFromUnicode)
の結果が、"試験"であってほしいんだけど、別のよくわからない文字に変換される
>>931
情報小出しですみません。
UTF8で標準出力に個人情報含むCSVを吐き出すコンソールアプリがありまして、それを一時ファイルを使用せずにVBAに読み込むのが目的です。
Wscript.Exec.StdOutを使用したところUTF8が文字化けしてしまい、PowerShell上でByte配列化→Base64エンコードして吐き出すことで、VBAでCSVのStringを得るところまではできました。 >>934
shiftjisで表示してんじゃないの VBAでBase64デコードしたByte配列をADODB.Streamにバイナリ書き込み・UTF8読み込みすることでString変数に収めるところまでは行けました。
ここから、ADODB.Connectionを使用してADODB.Streamの内容をCSVとしてパースしたいのですが、ネットで見られるサンプルコードはファイルを読み込むものばかりです。
試しにADODB.Connection.Open ADODB.Streamとしてみましたが、うまく行きません。
現在ADODBのリファレンスに目を通していて、関係の有りそうなプロパティを見て回っているのですが、方法をご存知の方いらっしゃればご教示いただけるとありがたいです。
>>934
試験のバイナリと
よくわからない文字のバイナリ比較してみたら WSH は、CP932 だけじゃないの?
もうWSHは、Microsoft もサポートしていないのでは?
WSH, VBScript のスレのスレ主、ピッコロ大魔王に聞けば?
漏れは、Ruby スクリプトをダブルクリックで起動したい場合に、WSHを使っているけど、
その際、Ruby側で、CP932・UTF-8 を変換している。
または、NKF というモジュールもある
>>934
そりゃそうだろ…
Unicode文字列をShift-JISだと思ってUnicodeに変換して、それを更にUnicodeだと思ってShift-JISに変換して何をしたいんだ?
やりたいのは
StrConv(StrConv("試験", vbFromUnicode), vbUnicode)
かな? AddDllDirectory関数の引数にパスを渡したい
この関数の引数はUnicode文字列をである必要があるから、StrConvでUnicode変換してから渡す
変換がうまく行く文字だけのパスなら、AddDllDirectory関数は成功するが、変換がうまくいかない文字が含まれるパスだと失敗する
>>941
vbUnicodeのstrconvだけじゃいかんの >>942
それが失敗するから、vbFromUnicodeでもう戻したら案の定変になってた 変換がうまくいく文字列
変換がうまくいかない文字列
それぞれ教えてよ
似たような流れ多い?
なぜうまくいかないというコードを出さないのか
とりあえずEXCEL関係ないしVBA何でもスレ行けや
・成功
日本、解析、実
あ~む、ア~ミ、濁音、半濁音
・失敗
試験、行、め~ん、ム~ン、ゃゅょ、ャュョ
strconvが失敗するって時点で、何かの勘違いがあるとしか思えない
あぁ空目してた>>940でいいやん
引数が間違ってる
てか試そうよ AddDllDirectory(StrConv(パス,vbUnicode))ってコールしたときに
パスに特定文字が含まれると失敗、含まれないと成功
文字の例は>>946のとおり
明らかにStrConvの文字コード変換がおかしいと思うんだけど
ちなみに第2引数をvbFromUnicodeにすると、どんな文字列でもAddDllDirectoryは失敗する
StrConvを噛ませずに、パスを渡した場合も必ず失敗する AddDllDirectoryの引数をポインタでとって文字列のポインタ渡せば動く気がする
>>935
やっぱわからん。
「UTF8で標準出力に個人情報含むCSV」って、既にその時点でCSVなんじゃないの?
CSVなのにカンマ区切りじゃなくてCSVとして扱えないとか?(何じゃそりゃ)
UTF8が問題ならschema.ini作って回避できない?
schema.ini使う時点で一時ファイルだわって言われたらそれまでだけど。 >>949
とりあえずAddDllDirectoryのDeclare定義と呼び出してる部分のコード晒してよ
Unicode文字列の渡し方って1つじゃないから定義がわからないとなんとも言えん >>951
CSVファイルではなく、CSVの文字列になります
これをファイルに保存することなくパースしたかったのですが、方法が見つかりませんでした。
セル内カンマやセル内改行も含むCSVでしたので、自分でパースするのもちょっと大変でした。
MITライセンスのコードを見つけたのでそれを組み込んで処理しようと思います。
ありがとうございました。 >>949
明らかにおかしいのはStrConv以外だから
元々使い方間違ってただけで変換に問題はない
最少構成でやってみたらわかるはず Ruby なら標準で、CSV モジュールが付いている。
他にも、JSON, YAML などもパースできる
プログラミングするなら、ちゃんとしたプログラミング言語を使わないと、ダメ!
汎用的な機能を、自作して使うと、バグってばかりで仕事にならない
そもそもここ最強のcsvパーサEXCELのVBAすれなんだが
確かにExcelは世界一利用者の多いCSVパーサかも
エクセル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
newfilename = Format(DateSerial(Year(Now), Month(Now) - 1, 1), "yymm")
>>959
ヘルプといいますが色々なサイトを見ましたが私の頭では理解できず・・
やむを得ずお伺いしました
>>960
この式で出来ました!本当にありがとうございます! 00014500-1
のような、数字以外が入ってる文字列から
前ゼロを取りたいです。
どうすれば良いでしょうか
ゼロは先頭以外にもあるので
replaceで削除するのは無理です。
>>963
自分の意思で呼吸を30分止めてご覧
それができなければVBAを使う資格なし >>963
020-040 は 20-40 にすればいいの? >>965
はぃ、それで良いです
言葉足らずですみません >>966
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 そんな難しいことしなくてもこれでよくないか
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
区切り文字が-だけならsplitして終わる気もするけど
何が入ってるかわからんなら1文字ずつみるしかないのかな
区切りはハイフンだけです
すみません
分けて各々数字扱いすれば良かったですね
書いてみます
デリミタが"-"だけならもっと簡単になるね
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して数値変換でおわり
しかし今の子はこの程度も分からないほど論理的思考がないのか、
それともこのスレの住民を試そうとしているのか
使う関数提示するくらいで解決できなきゃ放置でいいんじゃね?
For r = 1 To 12000
処理
PDF出力
という処理をしているのですが、これだとPDFが12000ファイルになって、全て出力した後で結合するのですが
これを12000枚程度をPDF1ファイルで出力する方法をおしえてください
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
>>976
元データが何なのか知らんけど、
シート上のデータなら、12000ページを1シートにまとめてから出力。 12000ページのPDF・・・
ほんとに聞きたい事なの?これ
>>973
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 >>979
何かの文書ならともかく、ExcelのPDF化で1万ページは非現実的だよね
自分の会社で使うだけならDB化するのが普通だし
役所に提出する測定資料とかかな? ある言語だと
"00-001-02"split("-")map(asNumber)join("-")println
>>976
for
処理
PDF
Next
にしてるってこと?
ならPDFをNextの後に書けば良いんだけど >>978
1シートにはまとめられません。
>>979
日々の取引をデータベースに入力していて、そのデータベースから出力されたデータを取引伝票としてPDF化したいのですが
データベースソフトに取引伝票の書式が設定されていないので、エクセルで作ろうと思います。
1ページごと出力してフリーソフトで結合すると、12時間くらいかかっていたので、エクセルのPDF結合だとAcrobatPro
が必要になるそうなので、この方法もできません。
>>984
シート上に帳票を作り、その帳票をページごとに書き換えています。試していませんが、1シートだと行数が足りないです。
それと、ページごとに罫線とかの書式を作るのはつらいです。 >>985
12時間かけて作った12000ページのPDFは実用に耐えてるの?
それ、手段の一つが目的になっちゃってない? >>985
よくわからないけど、何とかデータをエクセルの表にして、ワードの差し込み印刷でやる、とかはどう? PDF1ファイルにする理由はあるの?
120ファイルぐらいに分けるでしょ普通
伝票とかだと保存義務とかあったりして、出力しておいておかないとダメな時もある
1シートで収まらないならある程度で分割してやるしかないし
罫線とか決まったフォーマットならコピーするだけ
が、EXCELでやるのが間違ってるな
ちゃんとした帳票ツール買って対応する言語使えよ
PDF化って言われても実コマンド書かなきゃアドバイスのしようもないわな
シートにまとめられない理由は?
まとめないとして、12000シート作れるスペックはあるのか?