トップページtech
1002コメント383KB

Excel VBA 質問スレ Part39 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2015/11/27(金) 20:36:45.35ID:9HV+ag/s
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄

このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。

コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。

※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0772デフォルトの名無しさん2016/02/07(日) 12:20:07.64ID:lxD2jtcx
macはExcel使いづらいし良いと思うよ
0773デフォルトの名無しさん2016/02/07(日) 13:13:51.34ID:lvVeevWi
>>771
知らないんだけどExcel使う上でも違いってあるの?
0774デフォルトの名無しさん2016/02/07(日) 15:50:17.72ID:YehISXuU
俺もよく知らんけど色々あるみたいね
http://qiita.com/sjuny/items/d3bf8e4dd9e609374575
0775デフォルトの名無しさん2016/02/07(日) 16:04:51.64ID:Ah5srJ1t
こりゃMacでExcelVBAの仕事なんかきたら絶対拒否だな
まあ絶対こないけどな
0776デフォルトの名無しさん2016/02/07(日) 21:17:08.90ID:8jeH5Cxf
>>774
これは酷いな
文字化け起こすわ正規表現使えないわ
ScriptingDictionary使えないから
書き換えたいときはCollectionラッピングしてイテレート使えとか
しれっと言ってるけどVBAの知識しか持ってない奴には
何が何のことか分からないだろうしな

エラーは違うモジュールやクラスまたがるとスコープ外れることがあるから
WindowsのVBAでもRaiseに限らず気をつけるけど
.Netの参照もろくに使えないで、APIも貧弱だとしたらもう
何をどうしろと言うのだという感じになるだろうな。お手上げだ。
0777デフォルトの名無しさん2016/02/08(月) 08:35:37.46ID:74LZCTzt
>>776
テメェの会社のソフトウェアすらまともにポーティング出来ないってのも
笑えるなww 今時、マルチプラットフォームなんて当たり前の時代に。
0778デフォルトの名無しさん2016/02/08(月) 12:16:06.90ID:9AywMO4K
FormにコードからCheckboxやLabelやらCommandButtonを貼り付けたいんです。(数が決まっていないから)
そのときLayoutをAndroid開発のように手軽にする方法ってないものなのですか?
現状ではいちいち各要素のLeftプロパティやTo@プロバティやWidthプロパティをわざわざ計算して代入していますが。
0779デフォルトの名無しさん2016/02/09(火) 02:12:59.07ID:fm/+Qtdn
>>778
EXCELVBAからWindowsPhoneにプラットフォームを変える
07807782016/02/09(火) 10:27:16.61ID:kyiA5+yG
>>779
あまりわたしを怒らせないほうがいいぞ。
しばらくこのスレに住みつくんだからな。
0781デフォルトの名無しさん2016/02/09(火) 11:33:24.91ID:6l1mZ7CB
>>780
コテ付けておいてくださいね?
0782デフォルトの名無しさん2016/02/09(火) 12:02:55.92ID:nKvXEyw2
ファイル名とセル内の何桁目までが一致したものをハイパーリンクをつけたいのですがどのような構文を書けばよいでしょうか?
0783デフォルトの名無しさん2016/02/09(火) 13:36:12.19ID:nKvXEyw2
書き方が酷かった。
ファイル名とセル名で特定の場所が一致していた場合そのファイルとセルを紐付けるハイパーリンクを挿入するにはどのような構文が必要でしょうか?

例 abc0001xxxx.pdfというファイル名のファイルとセルがあった場合に
abcとxxxxは参照せずに
0001の部分と .pdfの拡張子のみで判別して合致したものにハイパーリンクで紐付けする。
0784デフォルトの名無しさん2016/02/09(火) 13:42:51.44ID:f4xX8fNK
>>783
ファイル名の集合は検索前に固定されてるの?
0785デフォルトの名無しさん2016/02/09(火) 13:55:54.83ID:nKvXEyw2
>>784
ファイル名は法則はあるけど全部が完全な固定じゃなくて100 -(ハイフン)の後ろ3桁とかで検索したい。

ファイル名の構成は
(特定のものだけいれる単語)(分類別の文字2桁)200-(固有の番号)(分類別の文字2〜3桁.pdf)
って感じ。
200-(ハイフン)は固定
0786デフォルトの名無しさん2016/02/09(火) 14:23:18.20ID:nKvXEyw2
というよりは改稿するたびにファイル名の後ろの数字が変わるからそれ以外で判断してハイパーリンクを付けたい.. .
0787デフォルトの名無しさん2016/02/09(火) 14:58:50.32ID:6l1mZ7CB
JavaScript並に、配列の扱いが楽になったらいいのに

VBAが最近嫌になってきたわ。
0788デフォルトの名無しさん2016/02/09(火) 14:58:58.23ID:f4xX8fNK
>>785
そういう文字列のパターンに合致したもの全部にリンクを貼るの?
それとも実際存在しているファイル名かどうかも考慮するの?
0789デフォルトの名無しさん2016/02/09(火) 15:06:16.15ID:j0ZWcdvL
>>787
どう違うのか教えて
0790デフォルトの名無しさん2016/02/09(火) 15:19:03.63ID:nKvXEyw2
>>788
ファイル名に固有の数字を持ってるから1つしか一致しない。

セル内の固有数字と同じものが存在しない場合っていうのは基本的にあり得ないけど存在しなかったらリンクしないでほしい
0791デフォルトの名無しさん2016/02/09(火) 17:30:49.91ID:FJrhS/CA
Excel2013です。

実行中のマクロが、
エラーメッセージや中断ダイアログも何も出ずに、
途中で終了してしまうことがあります。

多数の重いブック(大きなもので30M)を、
 開いて→シートのデータを取得して→上書きせずに閉じて、
を繰り返す処理ですが、
実行中に他のアプリケーションを使って作業などしていると
この現象が発生するようです。
(但し、作業の重い軽いに必ずしも関係ない様で、起きない時には狙っても起きません。)

今の所、
参照したいブックをオープンしたところで
何のダイアログも出ずに終了しているのを確認しています。

尚、
ブックのオープン・クローズのメソッドの前後のほか、
あちこちにDoEventを配置してます。


色々探したのですが、関連記事が見つかりませんでした。
何かお知恵を拝借出来れば幸いです。
宜しくお願いします。
0792デフォルトの名無しさん2016/02/09(火) 17:34:59.79ID:fCLnUzKj
下記のコードをWin8.1 Excel2013 IE11で実行すると
表示待機(2度目)で無限ループになります。
(なぜかIEのReadyStateは1のまま、LocationNameはYahoo! JAPANのまま)
原因と根本的な対処法を教えてください。

ちなみに以下の場合はなぜか無限ループしません。
・Vista Excel2007 IE9で実行した場合
・ステップインで実行した場合
・Google表示の前にExcelを最前面にした場合(コメントアウト部分の処理です)
・IEのVisibleをFalseのまま実行した場合
0793デフォルトの名無しさん2016/02/09(火) 17:41:50.26ID:fCLnUzKj
Option Explicit

'スリープAPIの宣言
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub main()
'IE起動
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True

'Yahoo!表示
ie.Navigate "http://www.yahoo.co.jp/";

'表示待機(1度目)
Do While ie.ReadyState < 4 Or ie.Busy = True
 Debug.Print "ReadyState:" & ie.ReadyState & " Busy:" & ie.Busy & " LocationName:" & ie.LocationName
 Sleep 50
 DoEvents
Loop
Debug.Print "Yahoo!表示完了-------------------------------"
0794デフォルトの名無しさん2016/02/09(火) 17:43:31.26ID:fCLnUzKj
>>793の続き

'Excel最前面化
'AppActivate Application.Caption

'Google表示
ie.Navigate "http://www.google.co.jp/";

'表示待機(2度目)
Do While ie.ReadyState < 4 Or ie.Busy = True
 Debug.Print "ReadyState:" & ie.ReadyState & " Busy:" & ie.Busy & " LocationName:" & ie.LocationName
 Sleep 50
 DoEvents
Loop
Debug.Print "Google表示完了-------------------------------"

Set ie = Nothing
End Sub
0795デフォルトの名無しさん2016/02/09(火) 17:47:55.13ID:yhhWqviC
>>793
おれは
ie.ReadyState < 4

ie.ReadyState <> 4
で書いてるなぁ。
解説サイトのパクりだから細かいことはわからないけど。
0796デフォルトの名無しさん2016/02/09(火) 18:00:00.99ID:fCLnUzKj
>>795
ありがとうございます。
<>に変えてみてもやはり無限ループになります。

多分IE11なのが悪い気がするが
OSごとにIEのバージョンが決まってるからダウングレードもできない・・・
0797デフォルトの名無しさん2016/02/09(火) 18:18:24.28ID:C6IPgLvU
>>796
Win8.1 + IE11 でReadyStateが取得できないのは既知の仕様です
対処方法は俺は知らん
0798デフォルトの名無しさん2016/02/09(火) 18:26:15.97ID:wyjSQA63
IEを操作することが最終目的なら、Excelじゃなくて別のもの使えば
0799デフォルトの名無しさん2016/02/09(火) 18:36:42.40ID:j0ZWcdvL
>>791
ファイルをオープンせずにSQLとかでデータを取得してもダメなの?
0800デフォルトの名無しさん2016/02/09(火) 19:07:19.84ID:FJrhS/CA
>>799
レスありがとうございます。
そのようなやり方もあるのですか。。
ちょっと勉強してみます。
0801デフォルトの名無しさん2016/02/09(火) 19:45:15.29ID:EIWW8KSR
複数のエクセルファイルが同じフォルダに入っています。
全てのブックの全てのシートに書き込まれた、ある一つのセル(AL列の一行目)
をクリアにしたい。

セルの場所はおなじですが、複数のブック複数のシートに書かれたデータを
クリア(削除)したいのです。

ExcelVer2010で動くVBAを教えてください。
0802デフォルトの名無しさん2016/02/09(火) 22:58:04.18ID:LDceDFt4
>>801
下のコード中の変数 pth に
処理したいファイルが入ってるフォルダのパスを指定して実行すると
フォルダ内の全てのエクセルファイルをひらいて、
その全てのシートでセルAL1の値をクリアしてからファイルを上書き保存する
ただし、自分自身 (このマクロを実行するブック) と同じ名前のファイルは開けないから消せない

Sub test()
Dim pth As String
Dim obj As Object
Dim wb As Workbook
Dim sh As Worksheet

pth = ThisWorkbook.Path & "\test" '処理したいフォルダをここで指定する
With CreateObject("Scripting.FileSystemObject")
 If Not .FolderExists(pth) Then Exit Sub
  For Each obj In .GetFolder(pth).Files
   On Error Resume Next
   Set wb = Workbooks.Open(obj)
   On Error GoTo 0
   If Not wb Is Nothing Then
    For Each sh In wb.Worksheets
     sh.Range("AL1").Clear '消すセルはここで指定する
    Next sh
    wb.Close SaveChanges:=True
    Set wb = Nothing
   End If
  Next obj
 End With
End Sub
0803デフォルトの名無しさん2016/02/09(火) 23:54:47.06ID:EIWW8KSR
ありがとう。かりにVBAのかかれたブックがそのフォルダにあるとしたら
パスはどうかくの?
0804デフォルトの名無しさん2016/02/10(水) 00:17:10.65ID:UeLxeYgc
その場合は

pth = ThisWorkbook.Path & "\test" '処理したいフォルダをここで指定する

ここを

pth = ThisWorkbook.Path

こうする
0805デフォルトの名無しさん2016/02/10(水) 00:33:55.52ID:GKs+LxV+
ほんとうにありがとう。いろいろいじってみます。
0806デフォルトの名無しさん2016/02/10(水) 00:48:04.83ID:6coiY0M2
リテラルの末尾に付ける&H80000000の&とか%とかの一覧みたいな資料ってどっかにありませんか?
ぐぐろうとしてもどう検索したらいいのか判らないし
0807デフォルトの名無しさん2016/02/10(水) 02:43:57.94ID:u/mYzECS
>>797>>798
ありがとうございます
仕様なら諦めるしかないかなぁ
そもそもVBAってIE操作にあんまり適してないんですかね
0808デフォルトの名無しさん2016/02/10(水) 04:19:50.96ID:Urx/IePR
>>806
識別子(しきべつし)

VBの資料だからVBAでは使えないものもある
https://msdn.microsoft.com/ja-jp/library/s9cz43ek.aspx
0809デフォルトの名無しさん2016/02/10(水) 04:50:17.97ID:GKs+LxV+
Cなら
if(条件A && 条件B){
}
と書く条件文ですが、この&& (且つ)に対応する符号は
なんになりますか?
0810デフォルトの名無しさん2016/02/10(水) 05:02:45.87ID:7rRZYeUj
AND
0811デフォルトの名無しさん2016/02/10(水) 08:30:07.58ID:Urx/IePR
>>807
実験環境を用意するのが面倒なんで、思い付いたことだけ

参照設定を変えてもいいんなら「Microsoft Internet Controls」でなんとかなるかも
ならないかも
0812デフォルトの名無しさん2016/02/10(水) 09:05:55.41ID:FkM1RfeE
>>789
JavaScriptの場合、var kinoko = [];といった具合に配列を用意して、あとは適当
にpushするだけでいい。なのでRedimだのしなくていいし、例えば、

var kinoko = [simeji, matsutake, nameko, kawatani]

といった具合にして、別の配列にそのまんまpushができるので、すごく楽。取り出し
もkinoko[3]でkawataniが取り出せる。初期化ももう一度、例えばループ内でそのま
ま、var kinoko = [];と宣言するだけでいい。

物凄く楽にプログラム内でデータテーブルを使えるので、柔軟性がある。こういった
形で楽にメモリ上で配列を扱えると最高なんだけれどね。
0813デフォルトの名無しさん2016/02/10(水) 09:19:59.78ID:Bjt40mVK
>>812
Dim kinnko as variant
kinoko = split("simeji, matsutake, nameko, kawatani", ",")


とかになっちまいますね。
0814デフォルトの名無しさん2016/02/10(水) 09:22:25.54ID:FkM1RfeE
>>813
2次元配列とかになっても、

var kinoko = [];

var takenoko = [];

takenoko.push("bekky")
takenoko.push("kiyohara")

で最後に、kinoko.push(takenoko)とかでさくっと実現できたりするから、こういう地味
だけれど、楽にプログラミングできる仕組みを用意してほしいなって思うね。
0815デフォルトの名無しさん2016/02/10(水) 10:30:41.33ID:SL6hIX6J
そのレベルならVBA捨ててnode.jsとかpythonとかrubyでOLE操作したほうが手っ取り早い
0816デフォルトの名無しさん2016/02/10(水) 10:54:16.66ID:Urx/IePR
>>807
気になったんで検索しまくったら、ウィンドウを一時的に隠すとIE11のステータスがリセットされるっぽいことが書いてあった

ie.Visible = False
ie.Navigate "http://ほげほげ"
ie.Visible = True

ってやるとうまくいくらしい?
0817デフォルトの名無しさん2016/02/10(水) 11:01:59.02ID:jozDLnvP
>>809
ANDが近いけど、短絡評価しないので、同じ動きのものはVBAにはないよ
0818デフォルトの名無しさん2016/02/10(水) 11:06:13.33ID:6eyh9AMR
>>812
pushはうらやましいし、実現するにはライブラリ等が必要だけど、配列に配列を突っ込むのはVBAでもできるでしょう。
あと
kinoko = Array("simeji", "matsutake", "nameko", kawatani)
とは書けるけど、それは違うんだろうか。
ところで kawatani って何?
0819デフォルトの名無しさん2016/02/10(水) 13:12:27.48ID:Lsw16fD/
ゲス乙女のボーカルでベッキーの不倫相手
川谷絵音 (髪型がキノコっぽい)
0820デフォルトの名無しさん2016/02/10(水) 13:39:21.10ID:OnEbfKeK
>>817
短絡評価の話なら
If 条件A Then If 条件B Then 〜
でいいでしょ
0821デフォルトの名無しさん2016/02/10(水) 16:31:02.12ID:6eyh9AMR
>>819
ぬるぽ
0822デフォルトの名無しさん2016/02/10(水) 16:38:25.44ID:zs62Z3CJ
>>821
ガッ
0823デフォルトの名無しさん2016/02/10(水) 16:54:10.35ID:YqpZzmVY
すいません、教えてください。
毎日使っているマクロで最近エラーが出るようになりました。
コードの一部を下に貼ります。
C=Range・・・(中略)の行で「実行時エラー '6' オーバーフローしました」が出てしまいます。

Dim C As Variant
LastRow = SourceWS.Cells(Rows.Count, "B").End(xlUp).Row
FirstRow = SourceWS.Cells(LastRow, "B").End(xlUp).Row
C = Range(SourceWS.Cells(FirstRow, "A"), SourceWS.Cells(LastRow, "J"))
08248232016/02/10(水) 16:58:27.84ID:YqpZzmVY
その他の情報を追記します。

変数のSourceWS、LastRow、FirstRowには正しく格納されていることを確認しています。
ちなみにLastRowは200000ぐらいでした(これは日によって変わります。10万以上であることがほとんど)
08258232016/02/10(水) 17:08:28.76ID:YqpZzmVY
追記

A列のセルは今までは空欄でした。
つい最近からA列には整数を格納するように変更しました
(GetTickCountで取得した整数です)

恐らくこの変更が影響していると思うのですが原因がわかりません。
どなたかヒントをお願いします。
0826デフォルトの名無しさん2016/02/10(水) 17:56:27.46ID:6eyh9AMR
>>825
Cells(FirstRow, "A") ってなんかおかしくない?
0827デフォルトの名無しさん2016/02/10(水) 20:20:29.77ID:YqpZzmVY
>>826
すみません。どこがおかしいかわかりません。
変数Cに格納する行範囲をB列で判断しているのですが・・・
その行範囲のA列からJ列をバリアント配列Cに格納し、
その後他のブックに貼り付けています。
0828デフォルトの名無しさん2016/02/10(水) 21:06:36.31ID:QrO94O6C
>>827
普通に指定している行が多すぎるんじゃない?

Function Test(o As Range) As String()
Const BatchWidth = 100 '一度に処理する行数
Dim S() As String

With o
t = .Row
b = .Rows.Count
l = .Column
r = .Columns.Count
End With

ShiftC = r - l + 1
ReDim S(1 To b - t + 1, 1 To ShiftC)

For i = t To b Step BatchWidth
sc = i + BatchWidth - 1
If b < sc Then bw = b Else bw = sc
x = Range(o.Cells(i, 1), o.Cells(bw, ShiftC))
For pr = i To bw
For pc = 1 To ShiftC
S(pr, pc) = x(pr - i + 1, pc)
Next
Next
Next

Test = S
End Function

こんな感じでVariant型配列よりも容量の小さい配列に分割処理して入れ込んでみるとかで解決しないかな。
0829デフォルトの名無しさん2016/02/10(水) 21:11:14.10ID:5Sg0dwj9
vba開くときにいつからか、EXCEL OBJECTSとpersonal.xlsbが毎回全展開されるようになったんですけど、直す方法ありませんか?
0830デフォルトの名無しさん2016/02/10(水) 22:49:55.78ID:CjFlMRzq
>>823
要素数2百万くらいどうってことない気がするが、何だろうな。
0831デフォルトの名無しさん2016/02/10(水) 22:56:58.93ID:W4AkdBgm
>>830
何ですか2百万て?間違ってる上にセンスない回答ですね。
無能は黙っててください。
0832デフォルトの名無しさん2016/02/10(水) 23:01:11.33ID:UeLxeYgc
>>831

じゃあまずアンタが黙らないとね
0833デフォルトの名無しさん2016/02/10(水) 23:01:33.33ID:CjFlMRzq
>>831
ハア?
FirstRowがいつくかわからんが、LastRowが200000ぐらいでA〜J列なんだろ?違うの?
0834デフォルトの名無しさん2016/02/10(水) 23:02:19.87ID:W4AkdBgm
>>832
残念ですが僕は無能ではありません。ハズレ!
0835デフォルトの名無しさん2016/02/10(水) 23:03:08.82ID:W4AkdBgm
>>833
おいおまえ数字読めないのか!?
08368232016/02/10(水) 23:15:33.87ID:YqpZzmVY
FirstRowは2であることが多いです。
今回エラーが発生した時の、行数は約20万、列数はA〜Jの10列なので要素数としては約200万でした。
0837デフォルトの名無しさん2016/02/10(水) 23:16:03.19ID:UeLxeYgc
>>834-835
LastRowが200000ぐらい、FirstRowは不明だが最小で1なので
行数は20万前後とする。
A〜Jで10列、
つまり要素数は20万行 * 10列 で200万件
小学生でも出来る計算だぞ
0838デフォルトの名無しさん2016/02/10(水) 23:19:33.56ID:CjFlMRzq
>>835
何を言いたいのかわからんが、自分の環境(イミディエイト)でこう出るんだが?

FirstRow=1 : LastRow = 200000
?Range(Cells(FirstRow, "A"), Cells(LastRow, "J")).Count
2000000

要素数2百万の配列になるんじゃないのか?
0839デフォルトの名無しさん2016/02/10(水) 23:23:31.90ID:CjFlMRzq
>>834-835
はこういう勘違いをしてるのかな?

FirstRow=1 : LastRow = 200000

C = Range(Cells(FirstRow, "A"), Cells(LastRow, "J"))
?typename(C)
Variant()



set C = Range(Cells(FirstRow, "A"), Cells(LastRow, "J"))
?typename(C)
Range

の違い。
0840デフォルトの名無しさん2016/02/10(水) 23:24:31.96ID:W4AkdBgm
>>838
おいお前要素数200万であってるじゃねーか?
まぎらわしい事言うなよ!
でも200万とオバーフローは金輪際関係ないから!
お前がセンスないのは俺のほうが正しい!
0841デフォルトの名無しさん2016/02/10(水) 23:25:53.23ID:jMBe0mp+
ただ単純にメモリーが足りないだけなんじゃないの
常駐ソフトを全部停止させて動かしてみた?
0842デフォルトの名無しさん2016/02/10(水) 23:26:10.04ID:QrO94O6C
深酒は身体に毒ですよ
0843デフォルトの名無しさん2016/02/10(水) 23:26:10.66ID:CjFlMRzq
>>840
俺は最初から >>830 で
「要素数2百万くらいどうってことない気がする」
と言っているのだがな。
0844デフォルトの名無しさん2016/02/10(水) 23:27:52.95ID:W4AkdBgm
>>842
お前は正しいw
0845デフォルトの名無しさん2016/02/10(水) 23:30:18.01ID:TYDlKOEk
xlsとか古い形式だとcell()でも65535行までしかつかえないっていうのは関係ない?
08468232016/02/10(水) 23:33:40.88ID:YqpZzmVY
なんか私の質問で荒れ気味になってしまって申し訳ないです。

>>845
最初に書いてなくてすみません。
エクセル2010でxlsmです。
08478232016/02/10(水) 23:36:48.09ID:YqpZzmVY
>>841
常駐ソフト停止することを試していませんが、
それならば、メモリが不足しています、のエラーになるかと。
オーバーフローというのが解決のヒントかと個人的には思います。
0848デフォルトの名無しさん2016/02/10(水) 23:36:48.13ID:W4AkdBgm
>>846
謝るな!荒したのは俺だw
まあ俺は答えは分からんがガンバってくれたまえwww
0849デフォルトの名無しさん2016/02/10(水) 23:38:29.98ID:YqpZzmVY
>>848
なんかワロたw
0850デフォルトの名無しさん2016/02/10(水) 23:43:11.68ID:CjFlMRzq
>>847
一応聞くけどGetTickCountの値はどの程度?
それとDeclare文の宣言はどうなってますかね?
0851デフォルトの名無しさん2016/02/10(水) 23:49:20.06ID:jMBe0mp+
>>847
確かにメモリーが不足していますのエラーってあるよね
でもなんとなく
その行がエラーを出すんじゃなくてそれより前のコードで大量にメモリーを使用したままなんじゃないのかなぁ

だって結局こういうことでしょ
Sub sample()
Dim C As Variant
C = Range("A1:J200000")
End Sub
0852デフォルトの名無しさん2016/02/10(水) 23:49:30.85ID:YqpZzmVY
>>850

GetTickCountの値:
→190423431〜217241781

Declare文の宣言はどうなってますかね:
→Declare Function GetTickCount Lib "KERNEL32.DLL" () As Long
0853デフォルトの名無しさん2016/02/11(木) 00:10:42.37ID:cll589HH
>>852
LastRowやFirstRowの型、
それとGetTickCountを何かの変数に格納しているならその変数の型、
いずれも十分なサイズなんですよね?

うーむ
08548232016/02/11(木) 00:32:34.09ID:GSEE6twL
>>828>>851
申し訳ありませんが私の知識不足により貴方のレスの意図が理解できていません。
コメント返すまで時間をください・・・

>>853

LastRowやFirstRowの型:
→Dim FirstRow As Long
→Dim LastRow As Long

GetTickCountを何かの変数に格納しているならその変数の型:
→Public Out(1 To 1, 1 To 7) '←標準モジュールにPublicで宣言(variantは明示してませんが)
→Out(1, 1) = GetTickCount 'GetTickCountはVariant変数に直接格納しています

この変数Outを後ほどセルに書き出しています。
0855デフォルトの名無しさん2016/02/11(木) 00:47:48.35ID:mEBsgK8a
>>854
たとえばさ、

C = Range(SourceWS.Cells(FirstRow, "A"), SourceWS.Cells(LastRow, "A"))

でもエラーになるの?

エラーが出始めた前後で、
貴方に心当たりがあるのはA列の変化だけなんでしょ?

だったらその値だけを取得してもエラーになるかどうか試してみたら?
0856デフォルトの名無しさん2016/02/11(木) 03:30:20.36ID:GSEE6twL
>>855
>>823とは異なるデータ(行数は約19万)でまたもオーバーフローしたので>>855を試してみました。
エラーが出た後、デバッグをクリックし、イミディエイトウィンドウに、

C = Range(SourceWS.Cells(FirstRow, "A"), SourceWS.Cells(LastRow, "A"))
としたところオーバーフローしました。ただ、

C = Range(SourceWS.Cells(FirstRow, "B"), SourceWS.Cells(LastRow, "B"))
↑ではエラーとなりませんでした。

C = Range(SourceWS.Cells(FirstRow, "B"), SourceWS.Cells(LastRow, "J"))
↑これもエラーとなりませんでした。

また、A列のデータを全てクリヤした後マクロを実行すると、
C = Range(SourceWS.Cells(FirstRow, "A"), SourceWS.Cells(LastRow, "J"))
↑最近毎回エラーとなるここでエラーが出ませんでした。

どうやら、A列のデータ次第でエラーが出たり出なかったりしているようです。
でもまだ原因がわかりません。どなたか助けてください。
0857デフォルトの名無しさん2016/02/11(木) 04:14:34.02ID:b/HRrcI5
>>856
いろいろテストしたけど
A列の中に かなり大きな値で書式設定(通貨or会計とか)してるセルない?
一度 A列全選択して書式を標準にしたらどうでしょうか?

こちらでテストしたら(Excel2016) データが
=10^15
又は
1000000000000000

で書式が 通貨or会計の時

Dim c As Variant
c = Range("a1")

がオーバーフローになる(書式が標準や数値の時にはならない)
0858デフォルトの名無しさん2016/02/11(木) 07:23:22.39ID:mEBsgK8a
>>856
いや、あのさあ、もうちょっと応用を利かそうよ
A列に問題があるって分かったんなら、
次はそのなかでどの行に問題があるかを調べていくんだよ

例えば
Dim i As Long も宣言しといて
For i = FirstRow To LastRow
Debug.Print C = SourceWS.Cells(i, 1)
Next i
なんてやるとかできるじゃん

あるいは1セルずつだと止まらないかもしれないから
その時は
For i = 1 To LastRow - FirstRow + 1
C = SourceWS.Cells(FirstRow, 1).Resize(i)
Next i
でどこまで行数増やしたら止まるのかをしらべるとかさ

そうやって問題点を絞り込んでいけば
仮に原因までは分らなくても回避策は講じられるかもしれないでしょ
0859デフォルトの名無しさん2016/02/11(木) 09:29:53.37ID:cll589HH
>>857
あなたの問題を検証しようとしていたら環境がおかしく(?)なってきた。

>>825
「A列のセルにGetTickCountで取得した整数を格納した」
と書いてあるので、セル範囲に直接 =GetTickCount() として値を入れてみた。
そうすると以下の2パターンでエクセルが落ちる。

1. 当該範囲を選択後、C = Selection.value としてVariant配列を作成したとき
2. 値を入れた領域の右側のセルに行って ctrl + R でコピーしたとき

まっさらなシートでやってもエクセルを立ち上げ直してもOSを立ち上げ直しても再現する。
これまでこんなことはなかった気がするが、なんだこりゃ?
Office Personal 2010 Excel 14.0.7163.5000(64ビット)
0860デフォルトの名無しさん2016/02/11(木) 12:57:34.93ID:GSEE6twL
>>857
いろいろテストして頂きありがとうございました。
>>858の方法で一行ずつVariant変数に格納してみたところ、
上の方の行では問題ありませんでしたが、13万行あたりでエラー。
その行のA列の書式は日付型でした。
正常にVariantに格納できていた行のA列は標準書式でした。

A列の書式を全て標準とすることで当初のマクロは正常に動きました。
なぜこれでエラーが回避できたのかはわかりませんが、とりあえず大きく前進しました。
ありがとうございました。

>>858
858の一行ずつ格納するコードを実行することでA列書式が影響していることがわかりました。
ありがとうございました。

>>859
私の問題で迷惑をかけてしまい申し訳ありません。
私の環境で1,2を試してみましたがエクセルは落ちませんでした。

OFFICE2010 32bit + Win7 64bit
08618232016/02/11(木) 12:59:46.57ID:GSEE6twL
補足です。

かつてA列には日付が入っており、その名残というか当時の書式が残ってしまっていたようです。
0862デフォルトの名無しさん2016/02/11(木) 14:46:45.09ID:2zWchetY
>>860
> 私の問題で迷惑をかけてしまい申し訳ありません。
いや、そう言うケースでエラーになるのは俺には勉強になったよ
0863デフォルトの名無しさん2016/02/11(木) 15:44:40.95ID:cll589HH
>>860
一体なんだったのかわからん。
さて、ドキュメント作成の作業に戻ろう...
0864デフォルトの名無しさん2016/02/11(木) 23:27:10.13ID:8WhoCP6O
Range.Valueはエクセルでの値を、VBAの値に変換変換して返す
その際に型を選択するんだが、元の値がその型に収まらない場合エラーが出る
今に始まった話じゃないし、対策としてRange.Value2ってのも実装されてる
0865デフォルトの名無しさん2016/02/11(木) 23:56:26.18ID:zhBGlfG9
あるフォルダに入っている複数のエクセルブックの1シート目に欲しいデータがある。
それぞれのシートのA1,A2,B1,B2,C1,C2と固有のセルデータを所得して、
それを新たなブックに1行ずつデータを順に張り付けたい。

1行が1ブック(シート)分のデータになるようにしたい。
どのようにVBAを書けばいいですか

Excel2010でお願いします。
0866デフォルトの名無しさん2016/02/12(金) 00:06:05.03ID:4EYM4HYY
こういう投げやりな質問は報酬制にしてほしいね
0867デフォルトの名無しさん2016/02/12(金) 00:22:05.65ID:NB9uA2aw
どのようにって
普通に書けばいいですね
0868デフォルトの名無しさん2016/02/12(金) 01:59:27.96ID:gunxxlb9
やりたいことを1つずつ調べなよ。
他のブックを参照する、特定のセルの値をとる、
1行ずつブックに値を書く、とかね。
0869デフォルトの名無しさん2016/02/12(金) 06:02:16.01ID:4KxhZPev
>>866
ちなみにいくらぐらい欲しいの?
こんなの報酬もらおうにも100円ぐらいの内容だと思うけど
0870デフォルトの名無しさん2016/02/12(金) 06:08:37.28ID:Fbay5uRw
用件聞いてサンプルデータ貰ってコード書いてテストして、
で、一日かかるかどうかだから二万円くらいじゃね?
0871デフォルトの名無しさん2016/02/12(金) 07:44:15.34ID:vUMz7FOm
プログラマの報酬って1行10円計算と違うん?
■ このスレッドは過去ログ倉庫に格納されています