アクセス2000を使っています。
一つのレコード内に、下記のように、「半角4文字の番号+スペース」という規則正しいデータがあります。
 ↓↓
11A11 10A11 22B11 09A22

しかし、このデータの数は不規則で、番号が1個のものもあれば、20個のものもあります。
 ↓↓
11A11
11A11 10A11 22B11 09A22 ・・・

このデータ内にある半角4文字の番号を全て別々のデータにしたいと思い、VBAのコードを使って、InStr関数でスペースを検索し、そのスペースの手前から4文字のデータをleft関数やMid関数で抽出し、それを変数data(x)に代入し、次に、InStr関数で前のスペースの位置から次のスペースを探して、また、そのスペースの手前から4文字のデータをMid関数で抽出し、それを変数data(x)に代入する。
要するに、data(x) の中の x を1から1づつ増加させていき、data(1),data(2),data(3)という変数を自動的に生成し、その生成された各変数にデータを代入していきたいのですが、どうすればいいのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

参考までにVBscriptで作った時のカンマ区切りの処理



Sub DataSep(InputStr,OutputStrs())
Dim i
Dim Fs,TxtLen
ReDim OutputStrs(個数)

InputStr = InputStr & ","

Fs = 1
For i = 1 To Col
TxtLen = InStr(Fs, InputStr, ",", vbTextCompare)
If TxtLen > 0 Then
OutputStrs(i-1) = Mid(InputStr,Fs,TxtLen - FS)
Else
OutputStrs(i-1) = ""
End If
Fs = TxtLen + 1
Next

End Sub

でもこの位は自分で考えてね。

問題は分割するN数が不定であること。
ReDimで前の情報を保持しつつ配列要素を増やす事が出来ること。
    • good
    • 0

ACCESS2000なら、split関数があると思います。



Dim strData() as Sting

strData = split(データ," ")

これでOKです。
いくつあるかは、UBound関数で配列数をチェックしてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCなどで要素の数が固定できない配列はどうやって実現しますか?

配列について質問します。

BASIC系では配列は動的配列で要素の数が自由に変えられます。
ですが、C等では宣言時に配列の要素の数を決めておかねばならなかったと思います。
もし、C等で要素の数がわからないけど、配列を使いたい場合、どうすればいいのでしょうか?
どのように実現するのでしょうか?
配列と同じ使い勝手なら配列でなくともかまいません。

今はVBAでプログラムを組んでいるので、動的配列を使えばすむのですが、いずれ他の言語に移植したいので、できるだけ使わないようにしたいと思っています。

よろしくお願いいたします。

Aベストアンサー

malloc等のメモリ確保はNo.1さんの回答のリンクが詳しいですね。
C言語でプログラムを組む場合は、大抵はこれらメモリ操作関数のお世話になります。

これに加えて、C++やJavaのライブラリでは、動的配列クラスというものが使えます。
C++だとvectorやlist、JavaだとVectorやArrayListあたりですね。
他にも、言語や環境に依存したライブラリ、フレームワークで
様々な動的配列の機構が用意されていたりします。

簡単にまとめると、
・malloc、free、realloc等を使う方法 → ReDim
・動的配列クラス → Collection
のようなものだと考えてください。

Qサブフォームに変数を代入し、RecordSourceの値を取得したい

サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。

Sub test1()
Dim サブフォーム As String
Dim フォーム As String

フォーム= "土台"
サブフォーム = "フォーム1"

MsgBox Form_フォーム1.RecordSource
End Sub
*******************************************************************
Sub test2()
Dim サブフォーム As String
Dim フォーム As String

フォーム= "土台"
サブフォーム = "フォーム1"

MsgBox Form_フォーム1.RecordSource
MsgBox Forms(フォーム).Controls(サブフォーム).RecordSource

End Sub

オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)
*******************************************************************
Sub test3()

Dim サブフォーム As String
Dim フォーム As String

フォーム = "土台"
サブフォーム = "フォーム1"

MsgBox Forms(サブフォーム).RecordSource

End Sub

実行時エラー'2450'
マクロの式またはVisual Basic コート゛で参照されている 'フォーム名'フォームが見つかりません。
*******************************************************************
test1~3のうち
test1のみはうまくいくのですが
変数を代入したいです。
ヘルフ゜のには
Forms![受注]![受注サブフォーム].Formとなってますが
これじゃ変数を代入できないですよね。

どうすればサブフォームに変数を代入しつつ、RecordSourceの値を取得できるのでしょうか?

よろしくお願いします。

サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。

Sub test1()
Dim サブフォーム As String
Dim フォーム As String

フォーム= "土台"
サブフォーム = "フォーム1"

MsgBox Form_フォーム1.RecordSource
End Sub
*******************************************************************
Sub test2()
Dim サブフォーム As String
Dim フォーム As String

フォーム= "土台"
サブフォーム = "フォーム1"

MsgBox Form_フォーム1.RecordSource
MsgBox Fo...続きを読む

Aベストアンサー

No.1です。

> この「.Form」はどこにつければいいのでしょうか?

えーと・・・すみません、後半に余計な説明が多すぎたようです(汗)
一応、前回回答の前半部分に書いていたんですが、式としては

 MsgBox Forms(フォーム).Controls(サブフォーム).Form.RecordSource

になります。

蛇足ついでに、式の構成を簡単に(?)説明すると、
 Forms(~)
  展開済のフォーム群(=複数形:Formsコレクション)から、指定された
  名前のフォームを参照
 Controls(~)
  そのフォーム内のコントロール群(=複数形:Controlsコレクション)から、
  指定された名前のコントロールを参照
 Form.RecordSource
  指定したコントロール(サブフォーム)の、フォームとしてのプロパティ
  (ここではRecordSource)を参照
  (「Form」プロパティを経由しないと、サブフォームの「RecordSource」
   プロパティを参照できない、ということ)
ということです。

※「Forms」と「Form」は英単語上は前者が後者の複数形という関係ですが、
 プログラム上での関連性は薄いので、前者が前側につき、後者が後ろ側
 につくのは、「コレクションやプロパティの使い方・定義がそうなって
 いるから」として割り切るしかないかと思います(汗)


・・・また余計な説明が長くなりすぎた気がしますが(汗)、参考まで。

No.1です。

> この「.Form」はどこにつければいいのでしょうか?

えーと・・・すみません、後半に余計な説明が多すぎたようです(汗)
一応、前回回答の前半部分に書いていたんですが、式としては

 MsgBox Forms(フォーム).Controls(サブフォーム).Form.RecordSource

になります。

蛇足ついでに、式の構成を簡単に(?)説明すると、
 Forms(~)
  展開済のフォーム群(=複数形:Formsコレクション)から、指定された
  名前のフォームを参照
 Controls(~)
  そのフォーム内のコントロー...続きを読む

QC#かJavaで、配列の中から別の配列を探し出す

お世話になります。

C#かJava(CやC++は入れない)で、特定の配列の中に、該当する
配列があるかどうかを調べるメソッドがあれば、教えてください。

例えば…

int[] a={0,0,0,1,2,3,4,5,6,7};
int[] b={3,4,5};

ならば、『5』が返ってくるなどです。

力技では、aの配列を順にみていき、bの一番目と同じなら、
お互いの配列の次の要素を比較…などとやっていくのですが、
これらの方法を、標準のメソッドがあれば…と思い、
質問させていただきました。

以上、よろしくお願いいたします。

Aベストアンサー

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の先頭の添字だけ欲しい場合
listA.indexOf(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の最後の添字だけ欲しい場合
listA.lastIndexOf(b[index]);

最初に見つかる添字だけ欲しいなら標準ライブラリで取得できますが、
全添字が欲しいとなると途端に泥臭くなります。

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオ...続きを読む

QAccess InStr関数 AかBが入っていた場合、抽出したい

Access2003です。

フィールドに「A-A」というデータがあります。
「-」より前のデータを抽出する方法として、
Left([フィールド],InStr([フィールド],"-")-1)
というコードを使っていました。
※「-」より前の文字数は1文字とは限らないので・・・。

しかし
「A-A」「A+1」のように、「-」または「+」より前のデータを抽出する
というのは可能でしょうか?

orを使って
Left([フィールド],InStr([フィールド],"-"or"+")-1)
と書き直しましたが、エラーになってしまいます(安易にコードを修正しすぎですが)。

どうやってコードをかけば良いのでしょうか?

Aベストアンサー

left([フィールド],instr(replace([フィールド],"+","-"),"-")-1)
+を-に置き換えて、同じ処理をすればよいわけです。

QC言語の2次元配列 容量が大きすぎる場合の対処方法

私はC言語をもちいて2次元配列を作ろうとしています。

しかし、配列数が double c[10000][10000];
と大きいものにすると、エラーになってしまいます。

もちろん小さい double c[10][10];
のような配列では問題ありません。

malloc関数とかも調べたのですがなかなかいい文献が見つからずに
困っています。
どうかいいご意見があればよろしくお願いします。

Aベストアンサー

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fread(&c, 1,8, fp);
 return c;
}

void write_c(FILE *fp, double *c, int x, int y) {
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fwrite(c, 1,8, fp);
}

int main(void)
{
 FILE *fp;
 double c,s;
 int x,y;
 int a[10000],b[10000];
 
 fp = fopen("c.dat","w+b");// double c[10000][10000]; の意味
 
 for(x=0; x<10000; x++) {
  for(y=0; y<10000; y++) {
   c=a[x]*b[y];
   write_c(fp, &c, x,y);// c[x][y]=a[x]*b[y]; の意味
  }
 }
 
 for(x=0; x<10000; x++) {
  s=0;
  for(y=0; y<10000; y++) {
   s += read_c(fp, x,y);// s += c[x][y]; の意味
  }
  b[x] = s / 10000;
 }
 
 fclose(fp);
 return 0;
}

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);...続きを読む

Q半角スペース、全角スペースの削除がうまくいかない

初心者ですが、あまり専門的な事はわかりません。
どなたか宜しくお願いします。
ヤフー電話帳でリストを作っています。
新しく作ったリストと、既にパソコンにあるリストが重複していないか、vlookup操作して重複分は削除していってます。

それが、重複してるのに引っかからなかったりするので、色々調べたらヤフー電話帳には会社名の後にスペースがありました。
 このスペースを、置き換えで一気に消したいのですが消せるのと消せないのがあります。
仕方なく、置き換えで消せないのは一つ一つ手作業で消してますが、
かなりの数でまいってます。

どなたかアドバイスお願いします。

Aベストアンサー

以下、Excel2003の場合ですが・・・

1)キーボードのCtrlキーとHキーの同時押しなどで『検索と置換』ダイアログを表示
2)右下の方にある『オプション(T)>>』ボタンをクリック
 (『オプション(T)<<』と、「<<」の向きになっている場合はクリック無用です)
3)『半角と全角を区別する(B)』のチェックが入っている状態だと思いますので、
  そのチェックをオフに変更
4)『検索する文字列(N)』にスペース1個(半角でも全角でも可)を入力して、『全て置換』
 ボタンをクリック

・・・以上ですが、会社名の途中にスペースがある場合は、それも含めて削除されて
しまいます。
それが問題になる場合(そして先頭のスペースは削除されてもよい場合)は、式で
削除する方法もあります。(但し、新規列の追加になります)

1)空の行を選択(又はスペースを削除したい列の隣に列を追加)
2)A列から先頭と末尾のスペースを削除する場合は、削除後のデータを保存する
 セルに「=Trim(A2)」(→先頭のデータが2行目にある場合)と入力
3)フィルハンドル(選択中のセルの右下の角にマウスカーソルを合わせたときに表示
 される十字)をクリック&ドラッグ(→A列の最後のセルと同じ行まで)
4)その列全体を選択してコピー
5)選択した領域を右クリックして「形式を選択して貼り付け(S)」を選択
6)「値(V)」を選択して、OKをクリック

・・・以上です。
元のセルの書式を反映したい場合は、さらに右クリックで「形式を選択して貼り付け」を
選択し、「書式(T)」を選択して貼り付けを再度実行してください。

以下、Excel2003の場合ですが・・・

1)キーボードのCtrlキーとHキーの同時押しなどで『検索と置換』ダイアログを表示
2)右下の方にある『オプション(T)>>』ボタンをクリック
 (『オプション(T)<<』と、「<<」の向きになっている場合はクリック無用です)
3)『半角と全角を区別する(B)』のチェックが入っている状態だと思いますので、
  そのチェックをオフに変更
4)『検索する文字列(N)』にスペース1個(半角でも全角でも可)を入力して、『全て置換』
 ボタンをクリック

・・・以上ですが、会社名の...続きを読む

Qc言語の配列の先頭アドレスが偶数アドレスとなる理由について

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
printf("%p\n",&nc);
printf("%p\n",&nd);


}

実行結果
0xbffff8cf
0xbffff8ce
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8b0 0xbffff8b1 0xbffff8b2 ← S配列
0xbffff8af
0xbffff8ae

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
pr...続きを読む

Aベストアンサー

メモリの配置はコンパイラとコンパイルオプションに依存します。
デフォルトだと、32ビットのメモリ処理単位=4バイトとか8バイトが多いかと。
理由は32ビットCPUが4バイト単位でメモリにアクセスするのでアクセス効率を優先したためです。

例えば、
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8ce 0xbffff8cf 0xbffff8d0 ← S配列
だとしたら、S配列の内容全てを参照するためにCPUは0xbffff8ccと0xbffff8d0の合計8バイトにアクセスする必要が出てきます。無駄ですよね。

Qオブジェクト変数またはwithブロック変数が設定されてません

またまた おねがいします。
x に特定セルを入れてあります。
コピーし、形式を選択して貼り付けで
値だけ、行列を入れかえる・・・と考え、
下記の記述になりました。
しかし、実行してみると
エラーで
「オブジェクト変数またはwithブロック変数が設定されてません。」
と、でます。

x.PasteSpecial _
Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=True

アドバイスをお願いします。

Aベストアンサー

この質問には質問に載せた以前の部分を載せる必要があるのじゃないかと思う。
また下記後半に貼り付け先に疑問を持ったので記してみる。杞憂と思うなら無視していただいて結構。
(私は、この問題をVBAでやるのは結構難しいなと思ったので)
ーー
それは(1)コピーする範囲指定の問題。
私は
Sub test01()
Set x = Application.InputBox("範囲", Type:=8)
Set y = Application.InputBox("貼り付け先", Type:=8)
x.Copy
If Intersect(x, y) Is Nothing Then
y.Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Else
MsgBox " 貼り付け先訂正"
End If
End Sub
としてみた。これで1セル以上は絶対に指定されるので、「コピー元がなし」は、なくなると思う。
ーー
(2)トランスポーズして張り付ける先(極端に言えば左上隅セル)
だが、コピー元との位置関係で適当でないとエラーが出るようだ。
多分もとのコピー先の範囲と、行列を反転した範囲が共通部分を持つ場合にエラーが出るのではないかと思う。私はとりあえずINTERSECTで上記程度で、ごまかしたが、行列を反転した範囲を割り出す必要があるのかなと思うがややこしそうなので、とりあえずこのままにしますが、この点どうでしょう?

この質問には質問に載せた以前の部分を載せる必要があるのじゃないかと思う。
また下記後半に貼り付け先に疑問を持ったので記してみる。杞憂と思うなら無視していただいて結構。
(私は、この問題をVBAでやるのは結構難しいなと思ったので)
ーー
それは(1)コピーする範囲指定の問題。
私は
Sub test01()
Set x = Application.InputBox("範囲", Type:=8)
Set y = Application.InputBox("貼り付け先", Type:=8)
x.Copy
If Intersect(x, y) Is Nothing Then
y.Select
Selection.Paste...続きを読む

QC言語でunsigned char配列を連結する方法ってありますか?

C言語でunsigned char配列を連結する方法ってありますか?

例えば
unsigned char test[]={0x00,0x02,0x03};
unsigned char test2[]={0x05,0x06};
という配列があったとして

test[]という配列のあとにtest2の配列を追加することは可能でしょうか?
{0x00,0x02,0x03,0x05,0x06}という配列になればOKです。

よろしくお願いします。

Aベストアンサー

testの領域は3バイトのため、それ以上の配列を追加することは出来ません。
もし、testのサイズが5バイト以上あれば、test2を追加することは、できます。
その場合は、memcpy(&test[3],test2,2); とすれば、
testの4バイト目からあとに、test2の2バイトが追加されます。
新たに配列を作成して良いなら、
unsigned char test3[5];として
memcpy(test3,test,3);
memcpy(&test3[3],test2,2);
とすれば、test3はtestとtest2を連結したものとなります。

QEXCELのA列に全て入ってしまったデータをセル毎に表示したい。

あるホームページにTableタグで記述された表があります。
その表をドラッグ選択でコピーし、EXCEL2003にテキスト形式で貼り付けると、EXCELのA列に各行のデータが全て入ってしまいます。
tdタグ毎に、EXCELのセルに振り分けて表示したいのですが、どうすればよいでしょうか。

【試したこと】
1)文字コードを変換すればよいのかと思い、解らないながらもStirling1.31というソフトで文字コードをみると、列の間は[20]というコード?になっておりました。半角スペースで入力したデータも同じく[20]と出ますので、tdタグは半角スペースとして認識されているのでしょうか。
文字列にも普通に半角スペースがまぎれているので、tdのコードのみをどう変換したらよいのかわからず、閉じました。

2)EXCELのファイルをテキスト形式で保存し、開くときにスペース区切りを選んで、区切りたい位置をクリックして、"フィールドの幅"というものを設定したものの、文字の長さが行ごとに違うので固定の幅では上手くセル毎に振り分けられませんでした。

至らない説明で申し訳ありません。ホームページのデータをダイレクトにEXCLEにテキストで貼り付けるという方法からして間違っているのでしょうか。
600件以上あるデータで困っています。
詳しい方ご教授願います。
どうぞよろしくお願いいたします。

あるホームページにTableタグで記述された表があります。
その表をドラッグ選択でコピーし、EXCEL2003にテキスト形式で貼り付けると、EXCELのA列に各行のデータが全て入ってしまいます。
tdタグ毎に、EXCELのセルに振り分けて表示したいのですが、どうすればよいでしょうか。

【試したこと】
1)文字コードを変換すればよいのかと思い、解らないながらもStirling1.31というソフトで文字コードをみると、列の間は[20]というコード?になっておりました。半角スペースで入力したデータも同じく[20]と出ますの...続きを読む

Aベストアンサー

通常は[区切り位置]を使う場面ですが、
今回の場合は、
>文字列にも普通に半角スペースがまぎれている
ということですから、
単純にスペースで区切ってしまうわけにはいきませんね。

 1.Webページ上の表をコピーする
 2.適当なシートにまずは【HTML形式で】貼り付ける
 3.2をコピーする
 4.目的のシートで右クリック > [形式を選択して貼り付け] > [値]

でいかがでしょうか。

ご参考まで。


人気Q&Aランキング

おすすめ情報