2014-02-19 16 views
0

我一个表中包含像如何在一列上访问表使用VBA

Prefix CR 
g   ;#WR_1;#WR_2;#WR_3;#WR_4;# 
v   ;#WR_3;#WR_4;# 
j   WR_2 
m   WR_1 
d   ;#WR_3;#WR_4;# 
f9  WR_3 

我发现最大的字符串列CR列分割字符串值;#WR_1 ;#WR_2;#WR_3;#WR_4;#使用

select top 1 CR,Prefix from table1 order by len(CR) desc 

,并返回

Prefix  CR 
g    ;#WR_1;#WR_2;#WR_3;#WR_4;# 

我想拆分此字符串;#WR_1;#WR_2;#WR_3;#WR_4;#列名状

Prefix WR_1 WR_2 WR_3 WR_4 

或Array

WR_1 
WR_2 
WR_3 
WR_4 
+0

什么数据会填充列? –

+0

数据可以为空,因为我想在下拉列表中使用这些列名称。 – vuyy1182

回答

0

所以这ISN” T A很漂亮的解决方案,但它确实为你问:

create table #Blah(Prefix nvarchar(5), CR nvarchar(60)) 

insert into #Blah 
values('g', ';#WR_1;#WR_2;#WR_3;#WR_4;#') 
insert into #Blah 
values('v', ';#WR_3;#WR_4;#') 
insert into #Blah 
values('j', 'WR_2') 
insert into #Blah 
values('m', 'WR_1') 
insert into #Blah 
values('d', ';#WR_3;#WR_4;#') 
insert into #Blah 
values('f9', 'WR_3') 

SELECT Prefix, [WR_1], [WR_2], [WR_3], [WR_4] 
FROM(
    SELECT Prefix, SUBSTRING(CR+';#', num, CHARINDEX(';#', CR+';#', num) - num) Item, convert(int,NULL) Col 
    FROM #Blah 
     inner join Numbers on num <= LEN(REPLACE(CR,' ','|')) AND SUBSTRING(';#' + CR, num, LEN(REPLACE(';#',' ','|'))) = ';#' 
    WHERE SUBSTRING(CR+';#', num, CHARINDEX(';#', CR+';#', num) - num) > '' 
    ) q 
PIVOT (
    MAX(Col) FOR Item IN ([WR_1], [WR_2], [WR_3], [WR_4]) 
) p 

drop table #Blah 

此查询使用的表称为Numbers它只是采用了单柱Num其中每个数字从1到10,000有一行。

我不知道为什么有数据的列标题将是填充一个下拉列表,以获得数据行,只需取下支点,只是使用内部查询有用,别名q

+0

我正在使用Access-VBA,我如何定义FUNCTION [dbo]。[fn_SplitString]。 – vuyy1182

+0

嗯肯定错过了那个标签,我不确定它是否可能。我将重写答案,以便它不使用表值函数。 –

+0

@ swa1234已编辑答案以删除表值函数。仍然不能100%确定它将在Access-VBA中工作 –